如何使用公式在单元格文本中间创建超链接? [英] How can I create a hyperlink in the middle of cell text using a formula?

查看:23
本文介绍了如何使用公式在单元格文本中间创建超链接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有办法以编程方式连接包含超链接文本的文本(例如使用公式)?

我正在寻找一种自动创建文档的方法,这些文档在单元格的长文本说明中包含链接,例如发票。


在Google Sheets中, Google Sheets中的HYPERLINK函数返回启用超链接的文本, CONCATENATE函数允许串接或追加各种文本。

公式 结果
=HYPERLINK("https://stackoverflow.com", "Stack Overflow") Stack Overflow
=CONCATENATE("SO: ", "https://", "stackoverflow.com") SO: https://stackoverflow.com(超链接未启用)

但是,当HYPERLINKCONCATENATE内使用时,超链接文本显示为纯文本。

公式 结果
=CONCATENATE("SO: ", hyperlink("https://stackoverflow.com", "Stack Overflow")) SO:堆栈溢出

在超链接中将串联用作参数可以正常工作。

公式 结果
=HYPERLINK(CONCATENATE("https://", "stackoverflow.com"), "Stack Overflow") Stack Overflow

推荐答案

您可以使用此脚本(不按公式)设置多个超链接(任意数量)

function multipleHyperLinks() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1').setRichTextValue(SpreadsheetApp.newRichTextValue()
    .setText("go to ... stackoverflow")
    .setLinkUrl(10, 23, "https://stackoverflow.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://stackoverflow.com/|stackoverflow>

在开头添加‘Edit:’以反转

// mike.steelson
// example
// go to <https://stackoverflow.com/|stackoverflow> 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]);
}

这篇关于如何使用公式在单元格文本中间创建超链接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆