首页 > 解决方案 > 谷歌脚本:搜索和替换文档中链接文本的 url(不是工作表)

问题描述

我正在尝试将链接文本从旧网址搜索并替换为新网址。

它不工作,我花了好几个小时。如果我删除“如果(找到)”,它会给我“TypeError:无法读取 null 的属性'getElement'”,即使我的文件有链接到这个 old_url 的文本。

请帮我。

function myFunction() {
  var old_url  ="http://hurlx1.com";
  var new_url  ="http://urlxa.com";
  var files = DriveApp.getFolderById("my folder id").getFilesByType(MimeType.GOOGLE_DOCS);

  while (files.hasNext()) {
     var file = files.next();
     var doc = DocumentApp.openById(file.getId());
     found=doc.getBody().findText(old_url); 

     if (found) {
         var link_element = found.getElement().asText();
         var start = found.getStartOffset();
         var end = found.getEndOffsetInclusive();
         var correct_link = link_element.getText().slice(start, end);
         link_element.setLinkUrl(start, end, correct_link);
       }
     }
   } 

标签: urlgoogle-apps-scriptreplacegoogle-docs

解决方案


我相信你的情况和目标如下。

  • 在您的 Google 文档中,
    • 文本和超链接与 相同old_url
    • 超链接是old_url. 但文字与old_url.
  • 您想使用 Google Apps 脚本进行old_url更新new_url

为此,这个答案怎么样?

修改点:

  • 关于您的错误消息,当old_url在 Google 文档中找不到的文本时found=doc.getBody().findText(old_url);,即使设置为超链接也会found变为。因为搜索文档正文上的文本,并且无法搜索设置为文本的超链接。我认为这是您的问题的原因。nullold_urlfindText
  • 在您的脚本中,var new_url ="http://urlxa.com";使用了。但是在设置链接时,correct_link使用link_element.setLinkUrl(start, end, correct_link);. 由此,new_url不设置。
  • 当您要更新http://hurlx1.comto new_urlof的文本时var new_url ="http://urlxa.com";,还需要修改文本。
  • 在您的脚本中,只有第一个old_url被更新。如果 Document 中有多个 的值old_url,则需要使用循环更新它们。

修改脚本规范:

此修改后的脚本可用于以下模式。

  • 文本和超链接与 相同old_url
    • 在这种情况下, 的文本值old_url也更新为old_url
  • 超链接是old_url. 但文字与old_url.
    • 在这种情况下,仅old_url更新 的超链接。
  • old_urlGoogle 文档中有几个带有超链接的文本。

修改后的脚本:

function myFunction() {
  var old_url  ="http://hurlx1.com";
  var new_url  ="http://urlxa.com";
  var files = DriveApp.getFolderById("my folder id").getFilesByType(MimeType.GOOGLE_DOCS);

  while (files.hasNext()) {
    var file = files.next();
    var doc = DocumentApp.openById(file.getId());
    var body = doc.getBody();

    // The following script is used for the situation that the text and hyperlink are the same with `old_url`.
    var found = body.findText(old_url);
    while (found) {
      var link_element = found.getElement().asText();
      var start = found.getStartOffset();
      var end = found.getEndOffsetInclusive();
      var correct_link = link_element.getText().slice(start, end);
      link_element.setLinkUrl(start, end, new_url).replaceText(old_url, new_url);
      found = body.findText(old_url, found);
    }

    // The following script is used for the situation that although the hyperlink is `old_url`, the text is different from `old_url`.
    var text = body.editAsText();
    for (var i = 0; i < text.getText().length; i++) {
      if (text.getLinkUrl(i) == old_url) {
        text.setLinkUrl(i, i + 1, new_url);
      }
    }
  }
}

参考:


推荐阅读