Витягніть текст посилання та URL-адресу з комірки з гіперпосиланнями


17

Припустимо, у мене є гіперпосилання в комірці A1: =hyperlink("stackexchange.com", "Stack Exchange")

В іншому випадку на аркуші я хотів би мати формули, які окремо отримують текст посилання та URL-адресу від А1. Я знайшов спосіб отримати лише текст посилання:

=""&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. Крім того, скористайтеся спеціальною функцією Rubén.

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.