web-dev-qa-db-ja.com

OpenOfficeのハイパーリンクからテキストとリンクを分離する

OpenOfficeスプレッドシートに変換されるブックマークのリストがあります。次に、リンクURL(下の青)とそのテキスト(黒)を2つの列に分けたいと思います。

image

これを達成する方法はありますか?

5
Kush

テキストからハイパーリンクを抽出する直接関数が欠落しているように見えるため、存在するばかりの マクロ を使用するのが簡単な解決策になる可能性があります。回答の下部には、ハイパーリンクの値を返すことができる関数CELL_URL(SheetNumber,Row,Column)を定義するコードがあります。その後、そのマクロを追加すると、関数_CELL_URL_(手順の下)を使用できるようになります。

簡単な解決策。写真の例に従って、セル_B90_に=CELL_URL(1,ROW(A90),1)と書くことができます。これにより、セルのリンクが_B90_に書き込まれます_A90_、それ以外の場合は何も書き込まれません。セル_C90_には、単に_=A90_と記述して、テキストのみを含めることができます(ハイパーリンクなし)。したがって、テキストとハイパーリンクを分割します。これらのセル(_B90_および_C90_)をコピーして、すべての列BおよびC、または必要なすべての行に貼り付けた後。
あなたの例ではA列が修正されていることに注意してください。このために、私は=CELL_URL(...,1)と書きました。必要に応じて列の別の番号を指定することも、別のシートからこの関数を呼び出すこともできます。

拡張ソリューション。テキストと偶数セルのハイパーリンクを単純に分割するかどうかは(私にとっては)不明だったため(2,4,6。。 。)、または代わりに奇数セル(3,5、...)の内容を偶数に近づけたい場合は、B列にテキストを表示する次のスキーマを提案します。 Cにはアドレス、DにはURLがあります。 BC列とD列に1行が入力され、1行は空になります。 (コピーして、別のシートに値を貼り付け、空の行をスキップするように並べ替えるか、関数のパラメーターとしてより複雑な方程式を別のsheet)。

calcの最初のシートで作業していて、テキストがAから始まる列にあると仮定します。行2から、_A2_に最初のケースがあるようにします。そうでない場合、数字をA2からA20に、A3からA21に、B2からB20にシフトします。

  • セル_B2_に=IF(D2="","",A2)と書き込みます。
  • セルに_C2_と書く=IF(D2="","",A3)
  • セルに_D2_と書く=CELL_URL(1,ROW(A2),1)

3つのセルをコピーして、必要な場所に貼り付けます。
ロジックは次のとおりです。リンクを抽出できる場合(Dが入力されている場合)、他の列(BおよびC)を書き込みます。

マクロの追加方法

作業中のシートから_Tools->Macro->Organize Macros->Open/Libre Office Basic_に移動し、newマクロを作成します。好きな名前を付けてください。新しいウィンドウが開きます。コードをコピーして貼り付けます。


マクロ

_REM  *****  BASIC  *****
REM ################### RETURNING STRING #################################################
Function CELL_NOTE(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns annotation text
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_NOTE = v.Annotation.getText.getString
   else
      CELL_NOTE = v
   endif
End Function
Function CELL_URL(vSheet,lRowIndex&,iColIndex%,optional n%)
'calls: getSheetCell
REM returns URL of Nth text-hyperlink from a cell, default N=1)
Dim v
   If isMissing(n) then n= 1
   If n < 1 then
      CELL_URL = Null
      exit function
   endif
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      if v.Textfields.Count >= n  then 
         CELL_URL = v.getTextfields.getByIndex(n -1).URL 
      else
         Cell_URL = Null
      endif
   else
      CELL_URL = v
   endif
End Function
Function CELL_FORMULA(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM return unlocalized (English) formula
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_FORMULA = v.getFormula()
   else
      CELL_FORMULA = v
   endif
End Function
Function CELL_STYLE(vSheet,lRowIndex&,iColIndex%,optional bLocalized)
'calls: getSheetCell
REM return name of cell-style, optionally localized
Dim v,s$,bLocal as Boolean
   if not isMissing(bLocalized) then bLocal=cBool(bLocalized)
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      if bLocal then
         s = thisComponent.StyleFamilies("CellStyles").getByName(v.CellStyle).DisplayName
      else
         s = v.CellStyle
      endif
      CELL_STYLE = s
   else
      CELL_STYLE = v
   endif
End Function
Function CELL_LINE(vSheet,lRowIndex&,iColIndex%,optional n)
'calls: getSheetCell
REM Split by line breaks, missing or zero line number returns whole string.
REM =CELL_LINE(SHEET(),1,1,2) -> second line of A1 in this sheet
Dim v,s$,a(),i%
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      s = v.getString
      if not isMissing(n) then i = cInt(n)
      if i > 0 then
         a() = Split(s,chr(10))
         If (i <= uBound(a())+1)then
            CELL_LINE = a(i -1)
         else
            CELL_LINE = NULL
         endif
      else
         CELL_LINE = s
      endif
   else
      CELL_LINE = v
   endif
end Function

REM ################### RETURNING NUMBER #################################################
Function CELL_ISHORIZONTALPAGEBREAK(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_ISHORIZONTALPAGEBREAK = Abs(cINT(v.Rows.getByIndex(0).IsStartOfNewPage))
   else
      CELL_ISHORIZONTALPAGEBREAK = v
   endif
End Function
Function CELL_ISVERTICALPAGEBREAK(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_ISVERTICALPAGEBREAK = Abs(cINT(v.Columns.getByIndex(0).IsStartOfNewPage))
   else
      CELL_ISVERTICALPAGEBREAK = v
   endif
End Function
Function CELL_CHARCOLOR(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns color code as number
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_CHARCOLOR = v.CharColor
   else
      CELL_CHARCOLOR = v
   endif
End Function
Function CELL_BACKCOLOR(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns color code as number
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_BACKCOLOR = v.CellBackColor
   else
      CELL_BACKCOLOR = v
   endif
End Function
Function CELL_VISIBLE(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns visibility state as number 0|1
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_VISIBLE = Abs(v.Rows.isVisible)
   else
      CELL_VISIBLE = v
   endif
End Function
Function CELL_LOCKED(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns locked state as number 0|1
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_LOCKED = Abs(v.CellProtection.isLocked)
   else
      CELL_LOCKED = v
   endif
End Function
Function CELL_NumberFormat(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM returns the number format index
Dim v
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      CELL_NumberFormat = v.NumberFormat
   else
      CELL_NumberFormat = v
   endif
End Function
Function CELL_NumberFormatType(vSheet,lRowIndex&,iColIndex%)
'calls: getSheetCell
REM return a numeric com.Sun.star.util.NumberFormat which describes a format category
Dim v,lNF&
   v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
   if vartype(v) = 9 then
      lNF = v.NumberFormat
      CELL_NumberFormatType = ThisComponent.getNumberFormats.getByKey(lNF).Type
   else
      CELL_NumberFormatType = v
   endif
End Function

'################### HELPERS FOR ABOVE CELL FUNCTIONS #########################################
Function getSheet(byVal vSheet)
REM Helper for sheet functions. Get cell from sheet's name or position; cell's row-position; cell's col-position
on error goto exitErr
   select case varType(vSheet)
   case is = 8
      if thisComponent.sheets.hasbyName(vSheet) then
         getSheet = thisComponent.sheets.getByName(vSheet)
      else
         getSheet = NULL
      endif
   case 2 to 5
      vSheet = cInt(vSheet)
      'Wow! Calc has sheets with no name at index < 0,
      ' so NOT isNull(oSheet), if vSheet <= lbound(sheets) = CRASH!
      'http://www.openoffice.org/issues/show_bug.cgi?id=58796
      if(vSheet <= thisComponent.getSheets.getCount)AND(vSheet > 0) then
         getSheet = thisComponent.sheets.getByIndex(vSheet -1)
      else
         getSheet = NULL
      endif
   end select
exit function
exitErr:
getSheet = NULL
End Function

Function getSheetCell(byVal vSheet,byVal lRowIndex&,byVal iColIndex%)
dim oSheet
'   print vartype(vsheet)
   oSheet = getSheet(vSheet)
   if varType(oSheet) <>9 then
      getSheetCell = NULL
   elseif (lRowIndex > oSheet.rows.count)OR(lRowIndex < 1) then
      getSheetCell = NULL
   elseif (iColIndex > oSheet.columns.count)OR(iColIndex < 1) then
      getSheetCell = NULL
   else
      getSheetCell = oSheet.getCellByPosition(iColIndex -1,lRowIndex -1)
   endif
End Function
_

参照:

Libreofficeバージョンでの作業:4.2.8.2。

1
Hastur

重要なのは、OpenOffice.orgCalcのテキストインポート機能を使用することです。

使用されている正確なフォーマットを確認するためにブックマークのコピーを用意せずに、特定のフォーマットに準拠するために微調整する必要がある一般的な手順を提供します。

このアクションを実行する最も簡単な方法は、ブックマークのリストをテキストエディターで開き、ファイル全体をクリップボードにコピーすることです。

次に、OpenOffice.orgCalcで新しいスプレッドシートを作成します。

OpenOffice.orgで、Ctrl + Shift + Vを押して、Paste Specialアクションを実行します。クリップボードをフォーマットされていないテキストとしてインポートすることを指定すると、[テキストのインポート]ダイアログボックスが表示されます。

Text Import dialog box

そのダイアログボックスで、Separated byラジオボタンを選択します。ソースデータの正確なフォーマットに応じて、以下のチェックボックスを調整しますSeparated byリンクURLをテキストから適切に分離します。何か問題がある場合は、Otherチェックボックスの右側のテキストフィールドにさまざまな文字を入力できます。そのテキストフィールドにスラッシュ(/)を入力すると、http://およびhttps://で始まるすべてのURLが検索されます。それらを独自の列に入れます。

1
RockPaperLizard

私はOpenOfficecalcのユーザーではありませんが、他の複雑な答えを考慮して、より単純な解決策を提供しようと思います(それでもうまくいくかもしれません)。

私が正しく理解していれば、現在、A1、A3、A5などにリンク付きのテキストが含まれ、A2、A4、A6などに単純なテキストが含まれている1列のスプレッドシートがあります。

次のような新しいスプレッドシートを作成します。

_A1 , A2  
A3 , A4  
A5 , A6  
etc.
_

私の考えは、式=MOD(ROW();2)を使用して列B1を追加することです。これは、B列全体に伝達されます。これはあなたに与えるでしょう:

_A1 , 1
A2 , 0
A3 , 1
A4 , 0
etc.
_

次に、列Bで並べ替え(または並べ替えが必要に応じて機能しない場合はフィルター処理)して、すべての列を集約します。

_A1 , 1
A3 , 1
etc.
A2 , 0
A4 , 0
etc.
_

これで、B = 1のA列を列Aの新しいスプレッドシートにコピーして貼り付け、次にB = 0の古いスプレッドシートから列BのA列の新しいスプレッドシートにコピーして貼り付けることができます。

これにより、望ましい結果が得られるはずです(私は願っています)。

0
harrymc