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]));
      

参考: