如何使用公式在单元格文本中间创建超链接?
Posted
技术标签:
【中文标题】如何使用公式在单元格文本中间创建超链接?【英文标题】:How can I create a hyperlink in the middle of cell text using a formula? 【发布时间】:2021-11-27 17:57:45 【问题描述】:有没有办法以编程方式连接包含超链接文本的文本(例如使用公式)?
我正在寻找一种方法来自动创建在单元格中的长文本描述中具有链接的文档,例如发票。
在 Google 表格中,
Google 表格中的 HYPERLINK
函数返回启用超链接的文本和
CONCATENATE
函数允许串在一起或附加各种文本。
Formula | Result |
---|---|
=HYPERLINK("https://***.com", "Stack Overflow") |
Stack Overflow |
=CONCATENATE("SO: ", "https://", "***.com") |
SO: https://***.com (hyperlink not enabled)
|
当HYPERLINK
在CONCATENATE
中使用时,超链接文本显示为纯文本。
Formula | Result |
---|---|
=CONCATENATE("SO: ", hyperlink("https://***.com", "Stack Overflow")) |
SO: Stack Overflow |
在 HYPERLINK 中使用 CONCATENATE 作为 arg 可以正常工作。
Formula | Result |
---|---|
=HYPERLINK(CONCATENATE("https://", "***.com"), "Stack Overflow") |
Stack Overflow |
【问题讨论】:
这与***.com/questions/8970391/… 不是同一个问题[如何在单元格文本中间创建超链接?]。该问题中的 OP 未指定需要程序化或基于公式的解决方案。工作答案也不提供程序化或基于公式的解决方案。 添加 google-apps-script 标签,因为您正在寻找程序化答案。 【参考方案1】:您可以使用此脚本(不是通过公式)设置多个超链接(任意数量)
function multipleHyperLinks()
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A1').setRichTextValue(SpreadsheetApp.newRichTextValue()
.setText("go to ... ***")
.setLinkUrl(10, 23, "https://***.com/search?tab=newest&q=google%20sheets")
.build());
;
RichTextValueBuilder
setLinkUrl(startOffset, endOffset, linkUrl)
顺便说一句,如果要检索所有链接,请使用
function getMultipleLinks()
var sh = SpreadsheetApp.getActive()
var rng = sh.getRange('A1')
var richTexts = rng.getRichTextValue().getRuns()
richTexts.forEach(function(richText)
Logger.log('|'+richText.getText() + '| = ' + richText.getLinkUrl())
)
编辑
这是一个基于 onEdit(e) 函数的自动解决方案:
输入单元格:foo <link1|text1> foo <link2|text2> foo
例如:go to ... <https://***.com/|***>
在开头添加“编辑:”以反转
// mike.steelson
// example
// go to <https://***.com/|***> and <https://www.amazon.fr/|amazon> here
// add Edit: at the beginning to reverse
function onEdit(event)
var sh = event.source.getActiveSheet();
var rng = event.source.getActiveRange();
var value = rng.getValue()
if (value.substring(0,5).toLowerCase()=='edit:')
var richTexts = rng.getRichTextValue().getRuns()
var txt=''
richTexts.forEach(function(richText)
if (richText.getLinkUrl()==null)
txt+=richText.getText()
else
txt+= '<' + richText.getLinkUrl() + '|' + richText.getText() + '>'
)
rng.setValue(txt)
else
var occ1 = ExtractAllRegex(value,'<([^>]+)>',0)
var occ2 = ExtractAllRegex(value,'>([^<]+)<',0)
occ2.push('')
if (sh.getName()=='mySheet' && occ1.length>0)
var richText = SpreadsheetApp.newRichTextValue()
var txt = value.split('<')[0]
for (var i=0; i<occ1.length; i++)
var arr = occ1[i].replace('<','').replace('>','').split('|')
txt += arr[1]
txt += occ2[i].replace('<','').replace('>','')
txt += value.split('>')[value.split('>').length-1]
richText.setText(txt)
var start = value.split('<')[0].length
for (var i=0; i<occ1.length; i++)
var arr = occ1[i].replace('<','').replace('>','').split('|')
var len = arr[1].length
richText.setLinkUrl(start,start+len,arr[0])
start += len + occ2[i].replace('<','').replace('>','').length
rng.setRichTextValue(richText.build())
function ExtractAllRegex(input, pattern,groupId)
return Array.from(input.matchAll(new RegExp(pattern,'g')), x=>x[groupId]);
【讨论】:
我不确定如何测试或实现它。您能否建议一个起点或提供如何将其放入工作表(或任何可访问的位置)以及如何从单元格中调用它的步骤? 好的,我很快就会这样做。 很遗憾,我们无法通过自定义公式 ***.com/questions/49287090/… 单元格编辑部分文本,我将研究另一个友好的解决方案 我已经编辑了我的提案【参考方案2】:如果这是你的目标:
那么这可以实现仅手动编辑单元格(或使用脚本)。使用您认为的任何内部公式都会将其呈现为“纯文本”(例如,删除超链接)
【讨论】:
【参考方案3】:不幸的是,不是那样的。超链接(通过公式)将始终包含单元格中的整个文本,但如果可能,我建议您安排发票中的整个文本,以便将超链接留在单元格中,周围包含所有段落。
这是我如何尝试的想法。
【讨论】:
以上是关于如何使用公式在单元格文本中间创建超链接?的主要内容,如果未能解决你的问题,请参考以下文章