Extraiga el texto del enlace y la URL de una celda hipervinculada


17

Supongamos que tengo un hipervínculo en la celda A1: =hyperlink("stackexchange.com", "Stack Exchange")

En otra parte de la hoja, me gustaría tener fórmulas que obtengan el texto del enlace y la URL de A1, por separado. Encontré una manera de obtener solo el texto del enlace:

=""&A1 

(concatenación con cadena vacía). Esto devuelve "Intercambio de pila", sin vincular.

¿Cómo obtener la URL (stackexchange.com)?


1

3
Nota para los visitantes: si está buscando una forma de extraer la URL de un enlace formateado que no es un =hyperlink()(algo que se pegó en una hoja), lo siento: no hay una. Para empezar, es mejor no pegar texto enriquecido en hojas de cálculo.


1
nota para los visitantes 2: puede obtenerlos a ambos si descarga la hoja de cálculo en html. o más bien, son fácilmente extraíbles del html ... no es ideal, pero es una forma.
albert

Respuestas:


10

Después de ver la respuesta de Rubén, decidí escribir una función personalizada diferente para esta tarea, con las siguientes características:

  1. El parámetro se proporciona como un rango, no como una cadena: es decir, en =linkURL(C2)lugar de =linkURL("C2"). Esto es coherente con el funcionamiento habitual de los parámetros y hace que las referencias sean más sólidas: se mantendrán si alguien agrega una nueva fila en la parte superior.
  2. Se admiten matrices: =linkURL(B2:D5)devuelve las URL de todos los hyperlinkcomandos encontrados en este rango (y celdas en blanco para otros lugares).

Para lograr 1, no utilizo el argumento pasado por la hoja (que sería el contenido de texto de la celda objetivo), sino que analizo la fórmula en =linkURL(...)sí y extraigo la notación de rango desde allí.

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

funciona brillantemente, aunque un poco lento.
Dannid

Esto técnicamente funciona, pero me pregunto si es posible crear un nuevo hipervínculo basado en el linkURL()resultado. Por ejemplo =HYPERLINK(linkURL(C2),"new label"), no parece funcionar para mí.
skube

1
@skube Ese es un efecto secundario de cómo codifiqué la función: solo se puede usar sola, no junto con otros. Todavía puede hacer un nuevo hipervínculo, ya =hyperlink(D2, "new label")que D2 tiene la fórmula linkURL. Alternativamente, use la función personalizada de Rubén.

3

Respuesta corta

Use una función personalizada para obtener la cadena entre comillas dentro de una fórmula de celda.

Código

La publicación externa compartida en el comentario de Yisroel Tech incluye un script que reemplaza cada fórmula en el rango activo por la primera cadena citada en la fórmula correspondiente. La siguiente es una adaptación como función personalizada de ese 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');
  }
}

1
Esta función es mejor para mí, porque se puede usar dentro de otras expresiones. Por cierto, usa la notación {"A1"} para direccionar la celda.
vatavale

2

Asumiendo que la célula tiene la función de hipervínculo;

Simplemente busque y reemplace =hyperlinka "hipervínculo" o "xyz"

Luego solo tiene que hacer una limpieza de datos para separarlos. Intente usar el texto dividido en columnas o la =splitfunción. Ambos lo usarían ,como delimitador.

Nuevamente reemplace las "[comillas dobles] con [nada]

Parece mucho más simple de esta manera ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.