Ekstrak tautan teks dan URL dari sel hyperlink

17

Misalkan saya memiliki hyperlink di sel A1: =hyperlink("stackexchange.com", "Stack Exchange")

Di bagian lain lembar ini, saya ingin memiliki rumus yang mendapatkan teks tautan dan URL dari A1, secara terpisah. Saya menemukan cara untuk mendapatkan hanya teks tautan:

=""&A1 

(Rangkaian dengan string kosong). Ini mengembalikan "Stack Exchange", tanpa tautan.

Bagaimana cara mendapatkan URL (stackexchange.com)?

Rubén
sumber
1
Berikut ini adalah skrip yang dapat melakukannya: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech
3
Catatan untuk pengunjung: jika Anda mencari cara untuk mengekstrak URL dari tautan yang diformat yang bukan =hyperlink()(sesuatu yang disisipkan ke dalam lembar), maka maaf: tidak ada. Pertama-tama, jangan menyisipkan teks kaya ke spreadsheet.
Gandakan stackoverflow.com/questions/28474308/… ?
sampablokuper
1
catatan untuk pengunjung 2: Anda bisa mendapatkan keduanya jika Anda mengunduh spreadsheet dalam html. atau lebih tepatnya, mereka mudah diekstrak dari html .... tidak ideal, tetapi ini adalah cara.
albert

Jawaban:

10

Setelah melihat jawaban Ruben, saya memutuskan untuk menulis fungsi kustom yang berbeda untuk tugas ini, dengan fitur-fitur berikut:

  1. Parameter diberikan sebagai rentang, bukan sebagai string: yaitu, =linkURL(C2)bukan =linkURL("C2"). Ini konsisten dengan cara kerja parameter biasanya, dan membuat referensi lebih kuat: mereka akan dipertahankan jika seseorang menambahkan baris baru di atas.
  2. Array didukung: =linkURL(B2:D5)mengembalikan URL semua hyperlinkperintah yang ditemukan dalam rentang ini (dan mengosongkan sel untuk tempat lain).

Untuk mencapai 1, saya tidak menggunakan argumen yang diteruskan oleh sheet (yang akan menjadi konten teks dari sel target), tetapi menguraikan rumus =linkURL(...)itu sendiri dan mengekstrak notasi rentang dari sana.

/** 
 * 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
}
Komunitas
sumber
bekerja dengan sangat baik, meskipun agak lambat.
Dannid
Secara teknis ini berfungsi, tetapi saya bertanya-tanya apakah mungkin membuat hyperlink baru berdasarkan linkURL()hasil. misalnya =HYPERLINK(linkURL(C2),"new label")sepertinya tidak bekerja untuk saya.
skube
1
@ skube Itu adalah efek samping dari bagaimana saya mengkodekan fungsi: itu hanya dapat digunakan sendiri, tidak bersama-sama dengan yang lain. Anda masih dapat membuat hyperlink baru di =hyperlink(D2, "new label")mana D2 memiliki rumus tautanURL. Atau, gunakan fungsi kustom Rubén.
3

Jawaban singkat

Gunakan fungsi khusus untuk mendapatkan string yang dikutip di dalam formula sel.

Kode

Posting eksternal yang dibagikan dalam komentar oleh Yisroel Tech mencakup skrip yang menggantikan setiap rumus dalam rentang aktif dengan string yang dikutip pertama dalam rumus yang sesuai. Berikut ini adalah adaptasi sebagai fungsi khusus skrip itu.

/** 
 * 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');
  }
}
Rubén
sumber
1
Fungsi ini lebih baik bagi saya, karena dapat digunakan di dalam ekspresi lain. Omong-omong ia menggunakan notasi {"A1"} untuk menangani sel.
vatavale
2

Dengan asumsi sel memiliki fungsi hyperlink;

Temukan dan ganti =hyperlinkmenjadi "hyperlink" atau "xyz"

Maka Anda hanya perlu melakukan pembersihan data untuk memisahkan mereka. Coba gunakan teks pisah ke kolom atau =splitfungsi. Keduanya akan digunakan ,sebagai pembatas.

Sekali lagi ganti "[tanda kutip ganda] dengan [tidak ada]

Tampaknya lebih sederhana dengan cara ini ..

Jeet Shah
sumber