Wyodrębnij tekst linku i adres URL z hiperłączonej komórki

17

Załóżmy, że mam hiperłącze w komórce A1: =hyperlink("stackexchange.com", "Stack Exchange")

W innym miejscu arkusza chciałbym mieć formuły, które osobno otrzymają tekst linku i adres URL z A1. Znalazłem sposób, aby uzyskać tylko tekst linku:

=""&A1 

(konkatenacja z pustym łańcuchem). Zwraca to „Wymiana stosu”, niepołączone.

Jak uzyskać adres URL (stackexchange.com)?

Ruben
źródło
1
Oto skrypt, który może to zrobić: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech
3
Uwaga dla odwiedzających: jeśli szukasz sposobu na wyodrębnienie adresu URL ze sformatowanego linku, który nie jest =hyperlink()(coś, co zostało wklejone do arkusza), przepraszam: nie ma takiego. Na początek najlepiej nie wklejać tekstu sformatowanego do arkuszy kalkulacyjnych.
Duplikat stackoverflow.com/questions/28474308/... ?
sampablokuper
1
uwaga dla odwiedzających 2: możesz je zdobyć, pobierając arkusz kalkulacyjny w formacie HTML. a raczej są łatwe do wyodrębnienia z html .... nie jest to idealne, ale jest to sposób.
Albert

Odpowiedzi:

10

Po zapoznaniu się z odpowiedzią Rubéna postanowiłem napisać inną niestandardową funkcję dla tego zadania, z następującymi funkcjami:

  1. Parametr jest podawany jako zakres, a nie jako ciąg: to znaczy =linkURL(C2)zamiast =linkURL("C2"). Jest to zgodne ze sposobem, w jaki zwykle działają parametry, i sprawia, że ​​odwołania są bardziej niezawodne: zostaną zachowane, jeśli ktoś doda nowy wiersz na górze.
  2. Tablice są obsługiwane: =linkURL(B2:D5)zwraca adresy URL wszystkich hyperlinkpoleceń znalezionych w tym zakresie (i puste komórki dla innych miejsc).

Aby osiągnąć 1, nie używam argumentu przekazanego przez arkusz (który byłby tekstem w komórce docelowej), ale analizowałem =linkURL(...)samą formułę i wyodrębniłem z niej notację zakresu.

/** 
 * 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
}
Społeczność
źródło
działa świetnie, choć trochę wolno.
Dannid
To technicznie działa, ale zastanawiam się, czy możliwe jest utworzenie nowego hiperłącza na podstawie linkURL()wyniku. np. =HYPERLINK(linkURL(C2),"new label")nie wydaje mi się działać.
skube 8.04.16
1
@skube To efekt uboczny tego, jak kodowałem tę funkcję: można jej używać tylko samodzielnie, a nie razem z innymi. Nadal możesz utworzyć nowe hiperłącze, ponieważ =hyperlink(D2, "new label")D2 ma formułę linkURL. Możesz też użyć niestandardowej funkcji Rubéna.
3

Krótka odpowiedź

Użyj funkcji niestandardowej, aby wstawić cytowany ciąg do formuły komórkowej.

Kod

Zewnętrzny post udostępniony w komentarzu przez Yisroel Tech zawiera skrypt, który zastępuje każdą formułę w aktywnym zakresie pierwszym cytowanym ciągiem w odpowiedniej formule. Poniżej znajduje się adaptacja jako niestandardowa funkcja tego skryptu.

/** 
 * 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');
  }
}
Ruben
źródło
1
Ta funkcja jest dla mnie lepsza, ponieważ można jej używać w innych wyrażeniach. Przy okazji używa notacji {"A1"} do adresowania komórki.
vatavale
2

Zakładając, że komórka ma funkcję hiperłącza;

Znajdź i zamień =hyperlinkna „hiperłącze” lub „xyz”

Następnie musisz po prostu wyczyścić dane, aby je rozdzielić. Spróbuj użyć podzielonego tekstu do kolumn lub =splitfunkcji. Oba byłyby używane ,jako separator.

Ponownie zamień "[podwójne cudzysłowy] na [nic]

Wydaje się to znacznie prostsze…

Jeet Shah
źródło