如何使用公式从 Google 工作表中的 Link 中提取 URL?

How to extract URL from Link in Google Sheets using a formula?

我从网站上复制了一系列超链接并将它们粘贴到 google sheet 中。这些值显示为链接文本,而不是超链接公式,并且仍然正确链接。对于每一行,我都试图提取 URL ONLY(不是友好的文本)并将其插入到相邻的列中。这如何使用公式来完成?

例如:

=SOMEFUNCTION(cellThatHoldsLink, returnedURLOnly)

This and similar scenarios不适用,因为粘贴的数据不是公式。 我会接受脚本 (GAS) 解决方案,或任何与此相关的解决方案,但如果可以使用公式来完成,我会更愿意。我发现了数十个 HYPERLINK 操作脚本,但在这个特定场景中没有任何内容,甚至没有找到持有 url 的 属性。谢谢。

如果您喜欢使用 Google Apps 脚本,请使用以下函数从文本中获取超链接。当你传递单元格时,你应该用双引号发送。例如:=GETURL("A4") 获取 A4 超链接。

function GETURL(input) {
  var range = SpreadsheetApp.getActiveSheet().getRange(input);
  var url = /"(.*?)"/.exec(range.getFormulaR1C1())[1];
  return url;
}

例如参考here

编辑:忽略这个答案。仅当 url 在单元格中链接时才有效。

您可以使用 importxml 导入整个数据 table 其内容如下:

=IMPORTXML(A1,"//tr")

在它旁边,我们在标签中引入了 url 个字符串

=IMPORTXML(A1,"//tr/td[1]/a/@href")

最后将字符串与原始域连接起来以创建您的超链接

=ARRAYFORMULA("http://www.bnilouisiana.com/"&INDIRECT("A2:A"&COUNTA(A2:A)))

找到有效的答案 on Google Groups(来自 Troy):

  1. 发布您的电子表格(复制 url)
  2. 创建一个新的电子表格并使用 IMPORTXML 函数(将 url 替换为您在第 1 步中获得的 url)
  3. 您将获得数据 - 然后您可以将值复制并粘贴到您需要的地方
  4. 取消发布电子表格(如果您不想要它public)

可以通过脚本来完成,但我现在没有时间。 :)

built-in SpreadsheetApp service doesn't seem to support pulling such URLs out, but the “Advanced” Sheets 服务。

根据Google's instructions启用Advanced Sheets服务,然后试试这个代码:

function onOpen() {
  var menu = SpreadsheetApp.getUi().createMenu("Extract URLs");
  menu.addItem("Process =EXTRACT_URL(A1) formulas", "processFormulas");
  menu.addToUi();
}

function EXTRACT_URL() {
  return SpreadsheetApp.getActiveRange().getFormula();
}

function processFormulas() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var rows = sheet.getDataRange().getFormulas();
  for (var r = 0; r < rows.length; r++) {
    var row = rows[r];
    for (var c = 0; c < row.length; c++) {
      var formula = row[c];
      if (formula) {
        var matched = formula.match(/^=EXTRACT_URL\((.*)\)$/i);
        if (matched) {
          var targetRange = matched[1];
          if (targetRange.indexOf("!") < 0) {
            targetRange = sheet.getName() + "!" + targetRange;
          }
          var result = Sheets.Spreadsheets.get(spreadsheet.getId(), {
            ranges: targetRange,
            fields: 'sheets.data.rowData.values.hyperlink'
          });
          try {
            var value = result.sheets[0].data[0].rowData[0].values[0].hyperlink;
            sheet.getRange(r + 1, c + 1).setValue(value);
          } catch (e) {
            // no hyperlink; just ignore
          }
        }
      }
    }
  }
}

这将创建一个名为 EXTRACT_URLcustom function,您应该使用对包含 link 的单元格的引用来调用它;例如,=EXTRACT_URL(B3).

遗憾的是它不能立即工作,因为 Advanced Sheets 服务 can't be used directly 通过自定义功能。因此,此脚本将一个名为“Extract URLs”的菜单添加到电子表格菜单栏,其中一个菜单项标记为“Process =EXTRACT_URL(A1) formulas”。当您单击它时,它会将 EXTRACT_URL 函数的所有使用替换为 URL 本身。

我能够以一种非常简单的方式为 Jotform 解决这个问题。

我想在查询中包含编辑 link,但它只会给我文本 "Edit Submission."

但是,我注意到我在 R 列中有表单 ID。然后我能够复制 JotForm link 并将其与单元格引用“https://www.jotform.com/edit/”&R2

快速方法如果单元格行有限--->

  1. 只需右键单击单元格并单击编辑 link
  2. 删除文本并单击应用
  3. 后面的每个单元格使用 f4

如果您对此有更多了解,或者可以通过选择单元格来完成,请提供。让我知道

如果您的超链接在另一个单元格中指定为公式——例如,假设单元格 A1 包含公式 =HYPERLINK("https://www.wikipedia.org/","Wikipedia"),您可以使用正则表达式提取 Link 文本。您需要做的就是:

=REGEXEXTRACT(FORMULATEXT(A1),"""(.+)"",")

此公式将产生结果:

https://www.wikipedia.org/

不需要自定义函数。

Ryan Tarpine 的示例帮了大忙。谢谢!

使用下面的代码,您可以用选定范围内的标准 HYPERLINK 公式替换所有嵌入链接。请注意,必须激活 Advanced Sheets 服务。

function embeddedURLsToHyperlink() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var rows = sheet.getActiveRange().getValues();
  var z = sheet.getActiveRange().getRowIndex();
  var s = sheet.getActiveRange().getColumn();

  for (var r = 0; r < rows.length; r++) {
    var row = rows[r];
    for (var c = 0; c < row.length; c++) {
      var val = row[c];
      if (val) {
        var targetRange = sheet.getRange(r+z, c+s).getA1Notation();
        var result = Sheets.Spreadsheets.get(spreadsheet.getId(), {
          ranges: sheet.getName() + "!" + targetRange,
          fields: 'sheets.data.rowData.values'
        });
        if (result.sheets[0].data[0].rowData[0].values[0].hyperlink) {
          var url = result.sheets[0].data[0].rowData[0].values[0].hyperlink;
          var text = result.sheets[0].data[0].rowData[0].values[0].effectiveValue.stringValue;
          sheet.getRange(r + z, c + s).setFormula('=HYPERLINK("' + url + '","' + text + '")');
        }
      }
    }
  }
}

我想处理完整的 sheet,将第 4-6 行替换为以下代码:

var rows = sheet.getDataRange().getValues();
var z = 1;
var s = 1;

在 2020 年的一些更新之后,我在互联网上找到的所有代码都被破坏了,所以这是我的贡献:

/** 
 * Returns the URL of a hyperlinked cell, if it's entered with control + k. 
 * Author: @Frederico Schardong based on https://support.google.com/docs/thread/28558721?hl=en&msgid=28927581 and https://github.com/andrebradshaw/utilities/blob/master/google_apps/convertHiddenLinks.gs 
 * Supports ranges
 */
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.getRichTextValues();
  var output = [];
  for (var i = 0; i < formulas.length; i++) {
    var row = [];
    for (var j = 0; j < formulas[0].length; j++) {
      row.push(formulas[i][j].getLinkUrl());
    }
    output.push(row);
  }
  return output
}

这可以通过将它们粘贴到或使用 按钮自动创建的 link 完成,方法是转到工具 -> 脚本编辑器并创建以下脚本:

function GETLINK(input){

return SpreadsheetApp.getActiveSheet().getRange(input).getRichTextValue().getLinkUrl();

}

如果单元格 A1 有 link,您需要将其引用为 =GETLINK("A1") 如果你有很多 link,那将不会动态更新,所以使用 =GETLINK(cell("Address",A1)) 来解决这个问题。

感谢 morrisjr1989 在 reddit.

所以,通过一些研究,我可以看到 google 工作表中有两种类型的链接

  1. 超链接(公式如 =HYPERLINK=("www.google.com")
  2. “嵌入式”链接(您无法查看或编辑公式)

对于第一种,您可以直接使用@frederico-schardong 的

对于第二种,您可以先使用 extract URLs 附加组件,然后再使用 linkURL

您可以创建宏“ExtractURLs”,然后使用以下代码对其进行编辑,该代码解析活动单元格中一致的文本样式块,尝试检索 URL,并将它们粘贴到相邻单元格中。


    function ExtractURLs() {
      
      var spreadsheet = SpreadsheetApp.getActive();
    
      var richTextCell = SpreadsheetApp.getActiveRange().getRichTextValue();
    
      var richTextStrings = richTextCell.getRuns();
      
      var linksStr = "";
      var linkCell = spreadsheet.getCurrentCell()
      var link = "";
      var richTextString = "";
    
      for (var x=0; x < richTextStrings.length; x++)
      {
        richTextString = richTextStrings[x].getText();
        
        Logger.log(richTextString);
    
        link = richTextStrings[x].getLinkUrl();
        Logger.log(link);
    
        if (link != null)
        {
         linksStr += link;
         linksStr += ', '; 
        }  
      }  
    
      var targetCell = linkCell.offset(0, 1).activate();
      targetCell.setValue(linksStr.substr(0,linksStr.length-2));
    };

2022 年更新:

  1. 录制一个虚拟宏,保存为“ExtractLinks”。
  2. 然后编辑宏以进入脚本编辑器。
  3. 然后粘贴以下内容并保存:
function ExtractLinks() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var rows = sheet.getActiveRange().getValues();
  var z = sheet.getActiveRange().getRowIndex();
  var s = sheet.getActiveRange().getColumn();

  for (var r = 0; r < rows.length; r++) {
    var row = rows[r];
    for (var c = 0; c < row.length; c++) {
      var val = row[c];
      if (val) {
        var targetRange = sheet.getRange(r+z, c+s).getA1Notation();
        var result = Sheets.Spreadsheets.get(spreadsheet.getId(), {
          ranges: sheet.getName() + "!" + targetRange,
          fields: 'sheets.data.rowData.values'
        });
        if (result.sheets[0].data[0].rowData[0].values[0].hyperlink) {
          var url = result.sheets[0].data[0].rowData[0].values[0].hyperlink;
          var text = result.sheets[0].data[0].rowData[0].values[0].effectiveValue.stringValue;
          sheet.getRange(r + z, c + s).setValue(''+url);
        }
      }
    }
  }
};
  1. 您可以 运行 扩展 > 宏 > ExtractLinks 中的宏

这是对 Natso 代码的改编,适用于一定范围。