Estrarre il testo e l'URL del collegamento da una cella con collegamento ipertestuale


17

Supponiamo di avere un collegamento ipertestuale nella cella A1: =hyperlink("stackexchange.com", "Stack Exchange")

Altrove nel foglio, vorrei avere formule che ottengano il testo e l'URL del link da A1, separatamente. Ho trovato un modo per ottenere solo il testo del link:

=""&A1 

(concatenazione con stringa vuota). Ciò restituisce "Stack Exchange", non collegato.

Come ottenere l'URL (stackexchange.com)?



3
Nota per i visitatori: se stai cercando un modo per estrarre l'URL da un link formattato che non è un =hyperlink()(qualcosa che è stato incollato in un foglio), allora scusa: non ce n'è uno. Per cominciare, è meglio non incollare il testo ricco in fogli di calcolo.


1
nota per i visitatori 2: puoi ottenerli entrambi se scarichi il foglio di calcolo in html. o meglio, sono facilmente estraibili dall'html ... non è l'ideale, ma è un modo.
albert,

Risposte:


10

Dopo aver visto la risposta di Rubén, ho deciso di scrivere una diversa funzione personalizzata per questo compito, con le seguenti caratteristiche:

  1. Il parametro viene fornito come intervallo, non come stringa: ovvero =linkURL(C2)anziché =linkURL("C2"). Ciò è coerente con il modo in cui i parametri di solito funzionano e rende i riferimenti più solidi: saranno mantenuti se qualcuno aggiunge una nuova riga in cima.
  2. Le matrici sono supportate: =linkURL(B2:D5)restituisce gli URL di tutti i hyperlinkcomandi presenti in questo intervallo (e celle vuote per altri luoghi).

Per ottenere 1, non uso l'argomento passato dal foglio (che sarebbe il contenuto del testo della cella di destinazione), ma analizzo invece la formula =linkURL(...)stessa ed estraggo la notazione dell'intervallo da lì.

/** 
 * 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
}

funziona alla grande, anche se un po 'lento.
Dannid,

Funziona tecnicamente, ma mi chiedo se sia possibile creare un nuovo collegamento ipertestuale in base al linkURL()risultato. ad esempio =HYPERLINK(linkURL(C2),"new label"), non sembra funzionare per me.
skube

1
@skube Questo è un effetto collaterale di come ho codificato la funzione: può essere usata da sola, non insieme ad altre. È ancora possibile creare un nuovo collegamento ipertestuale come =hyperlink(D2, "new label")dove D2 ha la formula linkURL. In alternativa, usa la funzione personalizzata di Rubén.

3

Risposta breve

Utilizzare una funzione personalizzata per ottenere la stringa tra virgolette all'interno di una formula di cella.

Codice

Il post esterno condiviso nel commento da Yisroel Tech include uno script che sostituisce ogni formula nell'intervallo attivo con la prima stringa tra virgolette nella formula corrispondente. Di seguito è riportato un adattamento come funzione personalizzata di quello script.

/** 
 * 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
Questa funzione è migliore per me, perché può essere utilizzata all'interno di altre espressioni. A proposito usa la notazione {"A1"} per indirizzare la cella.
vatavale,

2

Supponendo che la cella abbia la funzione hyperlink;

Basta trovare e sostituire =hyperlinkin "collegamento ipertestuale" o "xyz"

Quindi devi solo fare un po 'di pulizia dei dati per separarli. Prova a utilizzare il testo diviso in colonne o la =splitfunzione. Entrambi userebbero ,come delimitatore.

Sostituisci di nuovo le "[virgolette doppie] con [niente]

Sembra molto più semplice in questo modo ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.