Извлечь текст ссылки и URL из ячейки с гиперссылкой


17

Предположим, у меня есть гиперссылка в ячейке A1: =hyperlink("stackexchange.com", "Stack Exchange")

В другом месте на листе я хотел бы иметь формулы, которые получают текст ссылки и URL из A1 отдельно. Я нашел способ получить только текст ссылки:

=""&A1 

(конкатенация с пустой строкой). Это возвращает «Обмен стека», не связанный.

Как получить URL (stackexchange.com)?


1
Вот скрипт, который может это сделать: productforums.google.com/forum/#!topic/docs/ymxKs_QVEbs
Yisroel Tech

3
Примечание для посетителей: если вы ищете способ извлечь URL из отформатированной ссылки, которая не является =hyperlink()(чем-то, что было вставлено в лист), то извините: ее нет. Для начала лучше не вставлять форматированный текст в электронные таблицы.


1
Примечание для посетителей 2: вы можете получить их оба, если загрузите электронную таблицу в формате html. или, скорее, они легко извлекаются из HTML .... не идеально, но это способ.
Альберт

Ответы:


10

Увидев ответ Рубена, я решил написать другую пользовательскую функцию для этой задачи со следующими функциями:

  1. Параметр предоставляется как диапазон, а не как строка: то есть =linkURL(C2)вместо =linkURL("C2"). Это согласуется с тем, как обычно работают параметры, и делает ссылки более надежными: они будут поддерживаться, если кто-то добавит новую строку сверху.
  2. Поддерживаются массивы: =linkURL(B2:D5)возвращает URL всех hyperlinkкоманд, найденных в этом диапазоне (и пустые ячейки для других мест).

Чтобы достичь 1, я не использую аргумент, передаваемый листом (который будет текстовым содержимым целевой ячейки), а вместо этого анализирую =linkURL(...)саму формулу и извлекаю из нее запись диапазона.

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

работает блестяще, хотя и немного медленно.
Даннид

Технически это работает, но мне интересно, возможно ли создать новую гиперссылку на основе linkURL()результата. например, =HYPERLINK(linkURL(C2),"new label")кажется, не работает для меня.
skube

1
@skube Это побочный эффект от того, как я закодировал функцию: она может использоваться только сама по себе, а не вместе с другими. Вы все еще можете создать новую гиперссылку, =hyperlink(D2, "new label")где D2 имеет формулу linkURL. Или используйте пользовательскую функцию Рубена.

3

Короткий ответ

Используйте пользовательскую функцию для получения строки в кавычках внутри формулы ячейки.

Код

Внешний пост, который публикуется в комментарии Yisroel Tech, включает скрипт, который заменяет каждую формулу в активном диапазоне первой строкой в ​​кавычках в соответствующей формуле. Ниже приведена адаптация как пользовательская функция этого скрипта.

/** 
 * 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
Эта функция лучше для меня, потому что она может быть использована внутри других выражений. Кстати, он использует нотацию {"A1"} для адресации ячейки.
vatavale

2

Предполагая, что ячейка имеет функцию гиперссылки;

Просто найдите и замените =hyperlinkна «гиперссылка» или «xyz»

Тогда вам просто нужно очистить данные, чтобы разделить их. Попробуйте использовать разделение текста на столбцы или =splitфункцию. Оба будут использовать ,в качестве разделителя.

Снова замените "[двойные кавычки] на [ничего]

Кажется, так проще ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.