Google 将逗号分隔的 URL 列表转换为工作表中的超链接的应用脚本

Google App Script to Convert a Comma Seperated List of URLs to Hyperlinks in Sheets

我通常可以在这里找到足够的信息来拼凑功能性(不优雅!)代码,但在这种情况下我很挣扎,需要一些帮助。

背景:

我有一个 Google 表格,用于向复制团队提交复制请求。该表单运行良好,并将响应转储到 Google Sheet。文件被上传到表单,Google Sheet 创建指向文件的超链接,以便可以轻松访问它们。到目前为止一切顺利。

问题:

当用户提交多个文件时,它们将作为单个单元格中 URL 的逗号分隔列表插入到 Google Sheet 中。这些 URL 不会自动转换为超链接,使复制团队更难访问文件。

解决方案?:

我正在尝试编写一个脚本,该脚本将(在提交表单时)检查 URL 单元格是否包含多个 URL(我想检查是否有任何逗号会起作用)然后如果它确实将它们转换为超链接。

在之前的项目中,我使用以下代码在 Google 文档中实现了类似的功能:

  //Convert text to hyperlinks
  var urlRegex = 'http[s]?:\/\/[^ \n\r\v]+';
  var urlElement = body.findText(urlRegex);  

  while (urlElement != null) {    
    var urlText = urlElement.getElement().asText();

    var startOffset = urlElement.getStartOffset();
    var endOffset = urlElement.getEndOffsetInclusive();
    var urlString = urlText.getText().substring(startOffset, endOffset +1);
    
    urlText.setLinkUrl(startOffset, endOffset, urlString);

    urlElement = body.findText(urlRegex, urlElement);
  }

我认为使用逗号可能比正则表达式更容易定位 URLs,但我不确定从哪里开始。

示例 URL 单元格输出:

https://drive.google.com/open?id=199Uj-9fvctB6H6yoIRIvvo3x3pbAmRyO, https://drive.google.com/open?id=1PADRfFT00Hckatf395MG4ZEZ_E1q6weELAdGUqKYiRA, https://drive.google.com/open?id=1gchCWaOTJ6R7bfuD4-rUY4ZeLeF95FHI

为此,您需要使用 RichTextValueBuilder class 将超链接分配给单元格文本的子集。一种方法如下:

  1. 使用 .split() 获取每个 urls。
  2. 使用 SpreadsheetApp.newRichTextValue() 创建一个新的 RichTextValueBuilder。
  3. 计算单元格内每个 url 的开始和结束偏移量。
  4. 在 RichTextValueBuilder 上调用 .setLinkUrl(startOffset, endOffset, url)
  5. 使用 .build() 构建富文本值。
  6. 使用 .setRichTextValue() 将富文本值分配给单元格。

像这样:

function onFormSubmit(e) {
  // Get a Range reference to the cell containing the urls, possibly by using the event object passed in the form submit trigger:
  var cell = e.range.getCell(1, urlColumn); // where urlColumn is the index of the column that contains the urls in question
  var text = cell.getValue();
  var richTextValueBuilder= SpreadsheetApp.newRichTextValue()
  richTextValueBuilder.setText(text);
  var urls = text.split(', ')
  urls.forEach(function(url){
    var startIndex = text.indexOf(url)
    var endIndex = startIndex + url.length;
    richTextValueBuilder.setLinkUrl(startIndex,endIndex,url)
  })
  cell.setRichTextValue(richTextValueBuilder.build())
}