Extrair o texto e o URL do link de uma célula com hiperlink


17

Suponha que eu tenha um hiperlink na célula A1: =hyperlink("stackexchange.com", "Stack Exchange")

Em outras partes da planilha, gostaria de ter fórmulas que obtenham o texto e o URL do link de A1, separadamente. Encontrei uma maneira de obter apenas o texto do link:

=""&A1 

(concatenação com string vazia). Isso retorna "Stack Exchange", desvinculado.

Como obter o URL (stackexchange.com)?


1
Aqui está um script que pode fazê-lo: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
Nota aos visitantes: se você estiver procurando uma maneira de extrair o URL de um link formatado que não seja um =hyperlink()(algo que foi colado em uma planilha), lamento: não existe um. É melhor não colar texto rico em planilhas para começar.


1
nota aos visitantes 2: você pode obtê-los se fizer o download da planilha em html. ou melhor, eles são facilmente extraíveis do html .... não é o ideal, mas é uma maneira.
albert

Respostas:


10

Depois de ver a resposta de Rubén, decidi escrever uma função personalizada diferente para esta tarefa, com os seguintes recursos:

  1. O parâmetro é fornecido como um intervalo, não como uma sequência: ou seja, em =linkURL(C2)vez de =linkURL("C2"). Isso é consistente com o modo como os parâmetros geralmente funcionam e torna as referências mais robustas: elas serão mantidas se alguém adicionar uma nova linha no topo.
  2. Matrizes são suportadas: =linkURL(B2:D5)retorna os URLs de todos os hyperlinkcomandos encontrados nesse intervalo (e células em branco para outros lugares).

Para atingir 1, não uso o argumento transmitido pela planilha (que seria o conteúdo de texto da célula de destino), mas analise a fórmula =linkURL(...)e extraia a notação de intervalo a partir daí.

/** 
 * 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 brilhantemente, embora um pouco lento.
Dannid

Tecnicamente, isso funciona, mas estou imaginando se é possível criar um novo hiperlink com base no linkURL()resultado. por exemplo =HYPERLINK(linkURL(C2),"new label"), não parece funcionar para mim.
Skype #

1
@skube Esse é um efeito colateral de como eu codifiquei a função: ela só pode ser usada por si só, não em conjunto com outras pessoas. Você ainda pode criar um novo hiperlink como =hyperlink(D2, "new label")onde D2 tem a fórmula linkURL. Como alternativa, use a função personalizada de Rubén.

3

Resposta curta

Use uma função personalizada para obter a string entre aspas dentro de uma fórmula de célula.

Código

A postagem externa compartilhada no comentário da Yisroel Tech inclui um script que substitui cada fórmula no intervalo ativo pela primeira string citada na fórmula correspondente. A seguir, é apresentada uma adaptação como função personalizada desse 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
Essa função é melhor para mim, porque pode ser usada dentro de outras expressões. A propósito, ele usa a notação {"A1"} para endereçar a célula.
precisa saber é o seguinte

2

Supondo que a célula tenha a função de hiperlink;

Basta encontrar e substituir =hyperlinkpor "hiperlink" ou "xyz"

Então você só precisa fazer uma limpeza de dados para separá-los. Tente usar o texto dividido em colunas ou a =splitfunção. Ambos usariam ,como um delimitador.

Substitua novamente as "[aspas duplas] por [nada]

Parece muito mais simples assim ..

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.