【问题标题】:Google App Script to Convert a Comma Seperated List of URLs to Hyperlinks in Sheets用于将逗号分隔的 URL 列表转换为工作表中的超链接的 Google App 脚本
【发布时间】:2022-04-01 21:09:14
【问题描述】:

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

背景:

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

问题:

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

解决方案?:

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

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

  //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);
  }

我在想使用逗号可能比正则表达式更容易定位 URL,但我不知道从哪里开始。

示例 URL 单元格输出:

https://drive.google.com/open?id=199Uj-9fvctB6H6yoIRIvvo3x3pbAmRyOhttps://drive.google.com/open?id=1PADRfFT00Hckatf395MG4ZEZ_E1q6weELAdGUqKYiRAhttps://drive.google.com/open?id=1gchCWaOTJ6R7bfuD4-rUY4ZeLeF95FHI

【问题讨论】:

  • 所有的 URL 谷歌驱动器链接都带有 id 吗? IE。里面可以有逗号吗?
  • 如果没有逗号,那么 JavaScript 有一个很棒的内置 split 函数。
  • 首先,我建议将其作为问题发布到issuetracker.google.com/…(Sheets API,因为目前没有 Google Forms API 官方问题跟踪器)。
  • 我不认为这是一个“问题”,也不是一个“错误”。目前还不清楚作者想要这些 URL 的位置。它是在文档还是表格中?无论哪种方式,split(",") 都可以将其分离成一个 URL 数组,然后从那里随心所欲。

标签: google-apps-script google-sheets hyperlink


【解决方案1】:

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

  1. 使用.split() 获取每个单独的网址。
  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())
}

【讨论】:

  • 谢谢,这正是我所需要的!对其他人来说,唯一需要的调整是文本拆分。我说这是一个逗号分隔的列表,但也有一个空格,所以我只需要添加空格即可 var urls = text.split(', ');
  • 好收获。我在答案中添加了空格。
猜你喜欢
  • 2014-02-17
  • 2016-10-24
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多