ハイパーリンクされたセルからリンクテキストとURLを抽出する


17

セルA1にハイパーリンクがあるとします。 =hyperlink("stackexchange.com", "Stack Exchange")

シートのどこかで、A1からリンクテキストとURLを別々に取得する数式が必要です。リンクテキストだけを取得する方法を見つけました。

=""&A1 

(空の文字列との連結)。これにより、リンクされていない「スタック交換」が返されます。

URL(stackexchange.com)を取得する方法は?


1
これを実行できるスクリプトを次に示します。productforums.google.com
Yisroel Tech

3
訪問者への注意:(=hyperlink()シートに貼り付けられたものではない)フォーマットされていないリンクからURLを抽出する方法を探している場合は、申し訳ありません:ありません。最初は、リッチテキストをスプレッドシートに貼り付けないことをお勧めします。


1
訪問者への注意2:スプレッドシートをhtmlでダウンロードすると、両方を入手できます。むしろ、それらはhtmlから簡単に抽出できます。
アルバート

回答:


10

Rubénの答えを見た後、次の機能を備えたこのタスク用に別のカスタム関数を作成することにしました。

  1. パラメータは、文字列ではなく範囲として提供されます。つまり、=linkURL(C2)ではなく=linkURL("C2")。これは、パラメーターが通常どのように機能するかと一貫しており、参照をより堅牢にします。誰かが新しい行を一番上に追加しても、それらは維持されます。
  2. 配列がサポートされています。この範囲で見つかった=linkURL(B2:D5)すべてのhyperlinkコマンドのURL (および他の場所の空白セル)を返します。

1を達成するには、シートから渡される引数(ターゲットセルのテキストコンテンツ)を使用せず、代わりに数式=linkURL(...)自体を解析し、そこから範囲表記を抽出します。

/** 
 * Returns the URL of a hyperlinked cell, if it's entered with hyperlink command. 
 * Supports ranges
 * @param {A1}  reference Cell reference
 * @customfunction
 */
function linkURL(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  var formulas = range.getFormulas();
  var output = [];
  for (var i = 0; i < formulas.length; i++) {
    var row = [];
    for (var j = 0; j < formulas[0].length; j++) {
      var url = formulas[i][j].match(/=hyperlink\("([^"]+)"/i);
      row.push(url ? url[1] : '');
    }
    output.push(row);
  }
  return output
}

少し遅いですが、見事に動作します。
ダニー

これは技術的には機能しますが、linkURL()結果に基づいて新しいハイパーリンクを作成できるかどうか疑問に思っています。例えば=HYPERLINK(linkURL(C2),"new label")、私にとってはうまくいかないようです。
-skube

1
@skubeそれは、関数をコーディングした方法の副作用です。他の関数と一緒にではなく、単独でのみ使用できます。=hyperlink(D2, "new label")D2にlinkURL式がある場所として、引き続き新しいハイパーリンクを作成できます。または、Rubénのカスタム関数を使用します。

3

短い答え

カスタム関数を使用して、セル式内の引用符付き文字列を取得します。

コード

Yisroel Tech のコメントで共有されている外部投稿には、アクティブな範囲の各数式を、対応する数式の最初の引用文字列で置き換えるスクリプトが含まれています。以下は、そのスクリプトのカスタム関数としての適応です。

/** 
 * Extracts the first text string in double quotes in the formula
 * of the referred cell
 * @param {"A1"}  address Cell address.
 * @customfunction
 */
function FirstQuotedTextStringInFormula(address) {
  // Checks if the cell address contains a formula, and if so, returns the first
  // text  string in double quotes in the formula.
  // Adapted from https://productforums.google.com/d/msg/docs/ymxKs_QVEbs/pSYrElA0yBQJ

  // These regular expressions match the __"__ prefix and the
  // __"__ suffix. The search is case-insensitive ("i").
  // The backslash has to be doubled so it reaches RegExp correctly.
  // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp

  if(address && typeof(address) == 'string'){

    var prefix = '\\"';
    var suffix = '\\"';
    var prefixToSearchFor = new RegExp(prefix, "i");
    var suffixToSearchFor = new RegExp(suffix, "i");
    var prefixLength = 1; // counting just the double quote character (")

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var cell, cellValue, cellFormula, prefixFoundAt, suffixFoundAt, extractedTextString;

    cell = ss.getRange(address);
    cellFormula = cell.getFormula();

    // only proceed if the cell contains a formula
    // if the leftmost character is "=", it contains a formula
    // otherwise, the cell contains a constant and is ignored
    // does not work correctly with cells that start with '=
    if (cellFormula[0] == "=") {

      // find the prefix
      prefixFoundAt = cellFormula.search(prefixToSearchFor);
      if (prefixFoundAt >= 0) { // yes, this cell contains the prefix
        // remove everything up to and including the prefix
        extractedTextString = cellFormula.slice(prefixFoundAt + prefixLength);
        // find the suffix
        suffixFoundAt = extractedTextString.search(suffixToSearchFor);
        if (suffixFoundAt >= 0) { // yes, this cell contains the suffix
          // remove all text from and including the suffix
          extractedTextString = extractedTextString.slice(0, suffixFoundAt).trim();

          // store the plain hyperlink string in the cell, replacing the formula
          //cell.setValue(extractedTextString);
          return extractedTextString;
        }
      }
    } else {
      throw new Error('The cell in ' + address + ' does not contain a formula');
    }
  } else {
    throw new Error('The address must be a cell address');
  }
}

1
この関数は他の式の中で使用できるため、私にとってはより良いです。ちなみに、{"A1"}表記を使用してセルをアドレス指定します。
vatavale

2

セルハイパーリンク機能あると仮定します。

=hyperlink「ハイパーリンク」または「xyz」を見つけて置き換えてください

次に、データクリーニングを行ってそれらを分離する必要があります。列または=split関数に分割テキストを使用してみてください。両方とも,区切り文字として使用します。

再度、"[二重引用符]を[なし]に置き換えます

このようにもっと簡単に思えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.