Extraire le texte du lien et l'URL d'une cellule hyperliée

17

Supposons que j'ai un lien hypertexte dans la cellule A1: =hyperlink("stackexchange.com", "Stack Exchange")

Ailleurs dans la feuille, j'aimerais avoir des formules qui obtiennent le texte du lien et l'URL de A1, séparément. J'ai trouvé un moyen d'obtenir uniquement le texte du lien:

=""&A1 

(concaténation avec une chaîne vide). Cela renvoie "Stack Exchange", sans lien.

Comment obtenir l'URL (stackexchange.com)?

Rubén
la source
1
Voici un script qui peut le faire: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech
3
Note aux visiteurs: si vous cherchez un moyen d'extraire l'URL d'un lien formaté qui n'est pas un =hyperlink()(quelque chose qui a été collé dans une feuille), alors désolé: il n'y en a pas. Il est préférable de ne pas coller de texte riche dans des feuilles de calcul pour commencer.
Duplicate de stackoverflow.com/questions/28474308/… ?
sampablokuper
1
note aux visiteurs 2: vous pouvez les obtenir tous les deux si vous téléchargez la feuille de calcul en html. ou plutôt, ils sont facilement extractibles depuis le html .... pas idéal, mais c'est un moyen.
albert

Réponses:

10

Après avoir vu la réponse de Rubén, j'ai décidé d'écrire une fonction personnalisée différente pour cette tâche, avec les fonctionnalités suivantes:

  1. Le paramètre est fourni sous forme de plage et non sous forme de chaîne: c'est-à-dire =linkURL(C2)au lieu de =linkURL("C2"). Cela est cohérent avec la façon dont les paramètres fonctionnent généralement et rend les références plus robustes: elles seront conservées si quelqu'un ajoute une nouvelle ligne au-dessus.
  2. Les tableaux sont pris en charge: =linkURL(B2:D5)renvoie les URL de toutes les hyperlinkcommandes trouvées dans cette plage (et les cellules vides pour les autres emplacements).

Pour atteindre 1, je n'utilise pas l'argument passé par la feuille (qui serait le contenu textuel de la cellule cible), mais plutôt l'analyse de la formule =linkURL(...)elle-même et l'extraction de la notation de plage à partir de 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
}
Communauté
la source
fonctionne avec brio, bien qu'un peu lent.
Dannid
Cela fonctionne techniquement, mais je me demande s'il est possible de créer un nouveau lien hypertexte basé sur le linkURL()résultat. par exemple =HYPERLINK(linkURL(C2),"new label")ne semble pas fonctionner pour moi.
skube
1
@skube C'est un effet secondaire de la façon dont j'ai codé la fonction: elle ne peut être utilisée que seule, pas avec d'autres. Vous pouvez toujours créer un nouveau lien hypertexte comme =hyperlink(D2, "new label")où D2 a la formule linkURL. Vous pouvez également utiliser la fonction personnalisée de Rubén.
3

Réponse courte

Utilisez une fonction personnalisée pour obtenir la chaîne entre guillemets dans une formule de cellule.

Code

Le post externe partagé dans le commentaire par Yisroel Tech comprend un script qui remplace chaque formule de la plage active par la première chaîne citée dans la formule correspondante. Ce qui suit est une adaptation en tant que fonction personnalisée de ce 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');
  }
}
Rubén
la source
1
Cette fonction est meilleure pour moi, car elle peut être utilisée dans d'autres expressions. Soit dit en passant, il utilise la notation {"A1"} pour adresser la cellule.
vatavale
2

En supposant que la cellule a la fonction hyperlien;

Trouvez et remplacez simplement =hyperlinkpar "hyperlien" ou "xyz"

Il vous suffit ensuite de nettoyer les données pour les séparer. Essayez d'utiliser le texte divisé en colonnes ou en =splitfonction. Les deux utiliseraient ,comme délimiteur.

Remplacez à nouveau les "[guillemets doubles] par [rien]

Semble beaucoup plus simple de cette façon ..

Jeet Shah
la source