如何使用公式在单元格文本中间创建超链接?

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)

HYPERLINKCONCATENATE 中使用时,超链接文本显示为纯文本。

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】:

不幸的是,不是那样的。超链接(通过公式)将始终包含单元格中的整个文本,但如果可能,我建议您安排发票中的整个文本,以便将超链接留在单元格中,周围包含所有段落。

这是我如何尝试的想法。

【讨论】:

以上是关于如何使用公式在单元格文本中间创建超链接?的主要内容,如果未能解决你的问题,请参考以下文章

c#epplus 怎么给单元格添加超链接

如何使用Python来批量处理Excel中单元格的超链接?

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?

excel2013如何让超链接文本字体不发生改变

如何从 Excel 中获取单元格超链接地址?

将单元格链接到多个单元格不包括Google表格中的中间范围