it-swarm.com.de

Extrahieren Sie den Linktext und die URL aus einer Zelle mit Hyperlink

Angenommen, ich habe einen Hyperlink in Zelle A1: =hyperlink("stackexchange.com", "Stack Exchange")

An einer anderen Stelle im Blatt möchte ich Formeln haben, die den Linktext und die URL von A1 separat abrufen. Ich habe einen Weg gefunden, um nur den Linktext zu erhalten:

=""&A1 

(Verkettung mit leerer Zeichenkette). Dies gibt "Stack Exchange" zurück, nicht verbunden.

Wie erhalte ich die URL (stackexchange.com)?

17
user79865

Nachdem ich die Antwort von Rubén gesehen hatte , habe ich beschlossen, eine andere benutzerdefinierte Funktion für diese Aufgabe mit den folgenden Funktionen zu schreiben:

  1. Der Parameter wird als Bereich und nicht als Zeichenfolge bereitgestellt, dh =linkURL(C2) anstelle von =linkURL("C2"). Dies stimmt mit der Funktionsweise von Parametern überein und macht die Referenzen robuster: Sie werden beibehalten, wenn eine neue Zeile hinzugefügt wird.
  2. Arrays werden unterstützt: =linkURL(B2:D5) gibt die URLs aller hyperlink Befehle in diesem Bereich zurück (und leere Zellen für andere Stellen).

Um 1 zu erreichen, verwende ich nicht das Argument, das vom Arbeitsblatt übergeben wird (das wäre der Textinhalt der Zielzelle), sondern analysiere stattdessen die Formel =linkURL(...) selbst und extrahiere die Bereichsnotation von dort.

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

Kurze Antwort

Verwenden Sie eine benutzerdefinierte Funktion, um die in Anführungszeichen gesetzte Zeichenfolge in eine Zellenformel einzufügen.

Code

Der externe Beitrag, der von Yisroel Tech in comment geteilt wird, enthält ein Skript, das jede Formel im aktiven Bereich durch die erste in Anführungszeichen gesetzte Zeichenfolge in der entsprechenden Formel ersetzt. Das Folgende ist eine Anpassung als benutzerdefinierte Funktion dieses Skripts.

/** 
 * 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');
  }
}
3
Rubén

Angenommen, die Zelle hat die Hyperlink-Funktion;

Suchen und ersetzen Sie einfach =hyperlink durch "Hyperlink" oder "xyz".

Dann müssen Sie nur noch einige Daten bereinigen, um sie zu trennen. Versuchen Sie, den geteilten Text in Spalten oder die Funktion =split zu verwenden. Beide würden , als Trennzeichen verwenden.

Ersetzen Sie den " [doppelte Anführungszeichen] erneut durch [nichts]

Scheint auf diese Weise viel einfacher zu sein.

2
Jeet Shah