web-dev-qa-db-fra.com

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

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 récupèrent 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 retourne "Stack Exchange", sans lien.

Comment obtenir l'URL (stackexchange.com)?

17
user79865

Après avoir vu 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 la forme d'une plage et non d'une chaîne: c'est-à-dire =linkURL(C2) au lieu de =linkURL("C2"). Cela correspond au fonctionnement habituel des paramètres et rend les références plus robustes: elles seront conservées si quelqu'un ajoute une nouvelle ligne en haut.
  2. Les tableaux sont pris en charge: =linkURL(B2:D5) renvoie les URL de toutes les commandes hyperlink trouvées dans cette plage (ainsi que des cellules vides pour d'autres emplacements).

Pour atteindre 1, je n'utilise pas l'argument transmis par la feuille (ce qui correspond au contenu textuel de la cellule cible), mais j'analyse plutôt la formule =linkURL(...) elle-même et en extrait la notation de plage.

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

Réponse courte

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

Code

La publication externe partagée dans le commentaire par Yisroel Tech inclut un script qui remplace chaque formule de la plage active par la première chaîne entre guillemets 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');
  }
}
3
Rubén

En supposant que la cellule a la fonction hyperlien;

Il suffit de trouver et de remplacer =hyperlink par "lien hypertexte" ou "xyz"

Ensuite, il vous suffit de nettoyer les données pour les séparer. Essayez d’utiliser le texte divisé en colonnes ou la fonction =split. Les deux utiliseraient , comme un délimiteur.

Encore une fois remplacer le " [guillemets doubles] avec [rien]

Cela semble beaucoup plus simple de cette façon.

2
Jeet Shah