如何使用公式从 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):
- 发布您的电子表格(复制 url)
- 创建一个新的电子表格并使用 IMPORTXML 函数(将 url 替换为您在第 1 步中获得的 url)
- 您将获得数据 - 然后您可以将值复制并粘贴到您需要的地方
- 取消发布电子表格(如果您不想要它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_URL
的 custom 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
快速方法如果单元格行有限--->
- 只需右键单击单元格并单击编辑 link
- 删除文本并单击应用
- 对
后面的每个单元格使用 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 工作表中有两种类型的链接
- 超链接(公式如
=HYPERLINK=("www.google.com")
)
- “嵌入式”链接(您无法查看或编辑公式)
对于第一种,您可以直接使用@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 年更新:
- 录制一个虚拟宏,保存为“ExtractLinks”。
- 然后编辑宏以进入脚本编辑器。
- 然后粘贴以下内容并保存:
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);
}
}
}
}
};
- 您可以 运行 扩展 > 宏 > ExtractLinks 中的宏
这是对 Natso 代码的改编,适用于一定范围。
我从网站上复制了一系列超链接并将它们粘贴到 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):
- 发布您的电子表格(复制 url)
- 创建一个新的电子表格并使用 IMPORTXML 函数(将 url 替换为您在第 1 步中获得的 url)
- 您将获得数据 - 然后您可以将值复制并粘贴到您需要的地方
- 取消发布电子表格(如果您不想要它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_URL
的 custom 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
快速方法如果单元格行有限--->
- 只需右键单击单元格并单击编辑 link
- 删除文本并单击应用
- 对 后面的每个单元格使用 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
}
这可以通过将它们粘贴到或使用
function GETLINK(input){ return SpreadsheetApp.getActiveSheet().getRange(input).getRichTextValue().getLinkUrl(); }
如果单元格 A1 有 link,您需要将其引用为 =GETLINK("A1")
如果你有很多 link,那将不会动态更新,所以使用 =GETLINK(cell("Address",A1))
来解决这个问题。
感谢 morrisjr1989 在 reddit.
所以,通过一些研究,我可以看到 google 工作表中有两种类型的链接
- 超链接(公式如
=HYPERLINK=("www.google.com")
) - “嵌入式”链接(您无法查看或编辑公式)
对于第一种,您可以直接使用@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 年更新:
- 录制一个虚拟宏,保存为“ExtractLinks”。
- 然后编辑宏以进入脚本编辑器。
- 然后粘贴以下内容并保存:
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);
}
}
}
}
};
- 您可以 运行 扩展 > 宏 > ExtractLinks 中的宏
这是对 Natso 代码的改编,适用于一定范围。