如何使用公式从Google表格中的链接中提取网址?

时间:2016-02-05 18:10:20

标签: google-sheets formula

我从网站上复制了一系列超链接,然后将它们粘贴在Google工作表中。值显示为链接文本,而不是超链接公式,并且仍然正确链接。对于每一行,我尝试仅提取URL(不是友好文本)并将其插入相邻列。如何使用公式来实现这一目标?

例如:

=SOMEFUNCTION(cellThatHoldsLink, returnedURLOnly)

This and similar scenarios不适用,因为粘贴的数据不是公式。 我将接受脚本(GAS)解决方案或任何解决方案,但更愿意使用公式。我发现了几十个HYPERLINK操作脚本,但在这个特定场景中没有任何内容,甚至没有找到如何访问持有该URL的属性。感谢。

11 个答案:

答案 0 :(得分:3)

如果您乐意使用Google Apps脚本,请使用以下功能从文本中获取超链接。当你通过单元格时,你应该发送双引号。例如:=GETURL("A4")获取A4超链接。

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

例如,请参阅here

编辑:忽略此答案。这仅适用于在单元格中链接网址的情况。

答案 1 :(得分:3)

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

function GETLINK(input){

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

}

如果单元格 A1 有链接,您需要将其引用为 =GETLINK("A1") 如果您有很多链接,则不会动态更新,因此请使用 =GETLINK(cell("Address",A1)) 来解决这个问题。

感谢 morrisjr1989 {{3}}。

答案 2 :(得分:2)

内置的SpreadsheetApp服务似乎不支持提取此类网址,但“Advanced” Sheets服务可以支持。

根据Google's instructions启用高级表格服务,然后尝试以下代码:

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_URL的{​​{3}},您应该通过对包含该链接的单元格的引用来调用它;例如,=EXTRACT_URL(B3)

不幸的是,它不会立即起作用,因为自定义函数的高级表格服务custom function。因此,此脚本将一个名为“Extract URLs”的菜单添加到电子表格菜单栏,其中一个菜单项标记为“Process = EXTRACT_URL(A1)formula”。单击它时,它将使用URL本身替换EXTRACT_URL函数的所有用法。

答案 3 :(得分:2)

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

const path = require('path');
...
app: path.join(__dirname, '../other-project/src/index.js'),

答案 4 :(得分:1)

你可以使用importxml来输入整个数据表及其内容:

=IMPORTXML(A1,"//tr")

在它旁边我们拉入了标签中的url字符串

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

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

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

答案 5 :(得分:1)

找到一个有效on Google Groups的答案(特洛伊):

  1. 发布电子表格(复制网址)
  2. 创建新电子表格并使用IMPORTXML功能(将网址替换为您在步骤1中获得的网址)
  3. 您将获得数据 - 然后您可以将值复制并粘贴到您需要的地方
  4. 取消发布电子表格(如果您不希望公开)
  5. 可以通过脚本完成,但我现在没有时间。 :)

答案 6 :(得分:1)

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

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

此公式将得出结果:

https://www.wikipedia.org/

不需要自定义功能。

答案 7 :(得分:1)

所以,通过一些研究,我可以看到谷歌表格中有两种类型的链接

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

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

对于第二类,您可以先使用 extract URLs 插件,然后使用 linkURL

答案 8 :(得分:0)

I was able to solve this for Jotform in a very simple way.

I was looking to include the Edit link in a query, but it would only give me the text "Edit Submission."

However, I noticed that I had the form ID in Column R. I was then able copy the JotForm link and combine it with the cell reference "https://www.jotform.com/edit/"&R2

答案 9 :(得分:0)

做到这一点的快速方法-如果单元格行受到限制--->

  1. 右键单击单元格,然后单击“编辑链接”
  2. 删除文本,然后单击“应用”
  3. 对后面的每个单元格使用f4

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

答案 10 :(得分:0)

Ryan Tarpine的“例子”大有帮助。谢谢!

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

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 + '")');
        }
      }
    }
  }
}

我要处理整张纸,请用以下代码替换第4-6行:

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