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 将超链接分配给单元格文本的子集。一种方法如下:
- 使用
.split()
获取每个 urls。
- 使用
SpreadsheetApp.newRichTextValue()
创建一个新的 RichTextValueBuilder。
- 计算单元格内每个 url 的开始和结束偏移量。
- 在 RichTextValueBuilder 上调用
.setLinkUrl(startOffset, endOffset, url)
。
- 使用
.build()
构建富文本值。
- 使用
.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())
}
我通常可以在这里找到足够的信息来拼凑功能性(不优雅!)代码,但在这种情况下我很挣扎,需要一些帮助。
背景:
我有一个 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 将超链接分配给单元格文本的子集。一种方法如下:
- 使用
.split()
获取每个 urls。 - 使用
SpreadsheetApp.newRichTextValue()
创建一个新的 RichTextValueBuilder。 - 计算单元格内每个 url 的开始和结束偏移量。
- 在 RichTextValueBuilder 上调用
.setLinkUrl(startOffset, endOffset, url)
。 - 使用
.build()
构建富文本值。 - 使用
.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())
}