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


17

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)?


1
Hier ist ein Skript, das dies ermöglicht: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
Hinweis für Besucher: Wenn Sie nach einer Möglichkeit suchen, die URL aus einem formatierten Link zu extrahieren, bei dem es sich nicht um einen handelt =hyperlink()(etwas, das in ein Blatt eingefügt wurde), ist dies leider nicht der Fall. Am besten fügen Sie Rich-Text zunächst nicht in Kalkulationstabellen ein.


1
Hinweis für Besucher 2: Sie können beide erhalten, wenn Sie die Tabelle in HTML herunterladen. oder vielmehr, sie sind leicht aus dem HTML zu extrahieren ... nicht ideal, aber es ist ein Weg.
Albert

Antworten:


10

Nachdem ich Rubéns Antwort gelesen hatte, entschied ich mich, eine andere benutzerdefinierte Funktion für diese Aufgabe zu schreiben, mit den folgenden Funktionen:

  1. Der Parameter wird als ein Bereich vorgesehen ist , nicht als String: das heißt, =linkURL(C2)statt =linkURL("C2"). Dies stimmt mit der Funktionsweise von Parametern überein und macht die Referenzen robuster: Sie werden beibehalten, wenn eine neue Zeile oben hinzugefügt wird.
  2. Arrays werden unterstützt: =linkURL(B2:D5)Gibt die URLs aller hyperlinkin diesem Bereich gefundenen Befehle 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 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
}

funktioniert hervorragend, wenn auch etwas langsam.
Dannid

Das funktioniert technisch, aber ich frage mich, ob es möglich ist, einen neuen Hyperlink basierend auf dem linkURL()Ergebnis zu erstellen . zB =HYPERLINK(linkURL(C2),"new label")scheint bei mir nicht zu funktionieren.
Skube

1
@skube Das ist ein Nebeneffekt der Kodierung der Funktion: Sie kann nur für sich alleine verwendet werden, nicht zusammen mit anderen. Sie können immer noch einen neuen Hyperlink =hyperlink(D2, "new label")erstellen, da D2 die linkURL-Formel hat. Alternativ können Sie die benutzerdefinierte Funktion von Rubén verwenden.

3

Kurze Antwort

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

Code

Der externe Beitrag, der in dem Kommentar von Yisroel Tech 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');
  }
}

1
Diese Funktion ist für mich besser, weil sie in anderen Ausdrücken verwendet werden kann. Übrigens verwendet es die Notation {"A1"}, um die Zelle zu adressieren.
Vatavale

2

Angenommen, die Zelle hat die Hyperlink-Funktion.

Suchen und ersetzen Sie einfach =hyperlink"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 =splitFunktion zu verwenden. Beide würden ,als Begrenzer verwenden.

Ersetzen Sie erneut die "[doppelten Anführungszeichen] durch [nichts]

Scheint auf diese Weise viel einfacher zu sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.