Google Apps 脚本搜索和替换 URL 在渲染中截断 1 个字符 link
Google Apps Script search and replace URL truncates 1 character in rendered link
我正在使用下面的代码在 Google 文档中搜索 URL,并将它们变成活动的 link。它工作得很漂亮,除了 link 切断了 URL 的最后一个字符(例如“https://link.com/123" 得到 linked 为 "https://link.com/12").
function updateLinks() {
var linkRegex = "https?:\/\/[^\s]*";
//Open active doc
var body = DocumentApp.getActiveDocument().getBody();
//Find URLs
var link = body.findText(linkRegex);
//Loop through the body finding texts matching the search pattern
while (link != null) {
// Get the link as an object
var linkElement = link.getElement().asText();
// Get the positions of start and end
var start = link.getStartOffset();
var end = link.getEndOffsetInclusive();
//slice only the link out of it
var correctLink = linkElement.getText().slice(start, end);
// Format link
linkElement.setLinkUrl(start, end, correctLink);
// Find next
link = body.findText(linkRegex, link);
}
}
我相信这很简单,但我是一个完全的新手,非常感谢任何建议。提前致谢!
你的代码对我有用
您的原始文件是什么样的?
function updateLinks() {
var linkRegex = "https?:\/\/[^\s]*";
var body = DocumentApp.getActiveDocument().getBody();
var link = body.findText(linkRegex);
while (link != null) {
var linkElement = link.getElement().asText();
var start = link.getStartOffset();
var end = link.getEndOffsetInclusive();
var correctLink = linkElement.getText().slice(start, end);
linkElement.setLinkUrl(start, end, correctLink);
link = body.findText(linkRegex, link);
}
}
我认为您的问题的原因是 slice(start, end)
of linkElement.getText().slice(start, end)
。在这种情况下,它需要是 slice(start, end + 1)
。所以,请修改如下,再测试一下。
发件人:
var correctLink = linkElement.getText().slice(start, end);
收件人:
var correctLink = linkElement.getText().slice(start, end + 1);
或者,当你想使用linkRegex
时,下面的修改如何?
var correctLink = linkElement.getText().match(new RegExp(linkRegex))[0];
注:
作为附加信息,当一个段落中包含多个URL时,我认为以下修改可能会有用。当然,在这个修改中,即使段落中包含单个 URL,脚本也能正常工作。
来自
var start = link.getStartOffset();
var end = link.getEndOffsetInclusive();
//slice only the link out of it
var correctLink = linkElement.getText().slice(start, end);
// Format link
linkElement.setLinkUrl(start, end, correctLink);
到
var text = linkElement.getText();
var correctLinks = [...text.matchAll(new RegExp(linkRegex, "g"))];
correctLinks.forEach(obj => linkElement.setLinkUrl(obj.index, obj.index + obj[0].length - 1, obj[0]));
参考:
我正在使用下面的代码在 Google 文档中搜索 URL,并将它们变成活动的 link。它工作得很漂亮,除了 link 切断了 URL 的最后一个字符(例如“https://link.com/123" 得到 linked 为 "https://link.com/12").
function updateLinks() {
var linkRegex = "https?:\/\/[^\s]*";
//Open active doc
var body = DocumentApp.getActiveDocument().getBody();
//Find URLs
var link = body.findText(linkRegex);
//Loop through the body finding texts matching the search pattern
while (link != null) {
// Get the link as an object
var linkElement = link.getElement().asText();
// Get the positions of start and end
var start = link.getStartOffset();
var end = link.getEndOffsetInclusive();
//slice only the link out of it
var correctLink = linkElement.getText().slice(start, end);
// Format link
linkElement.setLinkUrl(start, end, correctLink);
// Find next
link = body.findText(linkRegex, link);
}
}
我相信这很简单,但我是一个完全的新手,非常感谢任何建议。提前致谢!
你的代码对我有用
您的原始文件是什么样的?
function updateLinks() {
var linkRegex = "https?:\/\/[^\s]*";
var body = DocumentApp.getActiveDocument().getBody();
var link = body.findText(linkRegex);
while (link != null) {
var linkElement = link.getElement().asText();
var start = link.getStartOffset();
var end = link.getEndOffsetInclusive();
var correctLink = linkElement.getText().slice(start, end);
linkElement.setLinkUrl(start, end, correctLink);
link = body.findText(linkRegex, link);
}
}
我认为您的问题的原因是 slice(start, end)
of linkElement.getText().slice(start, end)
。在这种情况下,它需要是 slice(start, end + 1)
。所以,请修改如下,再测试一下。
发件人:
var correctLink = linkElement.getText().slice(start, end);
收件人:
var correctLink = linkElement.getText().slice(start, end + 1);
或者,当你想使用linkRegex
时,下面的修改如何?
var correctLink = linkElement.getText().match(new RegExp(linkRegex))[0];
注:
作为附加信息,当一个段落中包含多个URL时,我认为以下修改可能会有用。当然,在这个修改中,即使段落中包含单个 URL,脚本也能正常工作。
来自
var start = link.getStartOffset(); var end = link.getEndOffsetInclusive(); //slice only the link out of it var correctLink = linkElement.getText().slice(start, end); // Format link linkElement.setLinkUrl(start, end, correctLink);
到
var text = linkElement.getText(); var correctLinks = [...text.matchAll(new RegExp(linkRegex, "g"))]; correctLinks.forEach(obj => linkElement.setLinkUrl(obj.index, obj.index + obj[0].length - 1, obj[0]));