【问题标题】:Replace Hyperlinks in Multiple Google Docs替换多个 Google 文档中的超链接
【发布时间】:2019-10-21 17:28:15
【问题描述】:

我输入了 ziganotschka 在https://stackoverflow.com/a/57865441/12252776 上发布的以下代码:

function myFunction() {
  var oldLink="http://www.googledoclink1.com";
  var newLink="http://www.googledoclinkA.com";
  var oldLink2="http://www.googledoclink2.com";
  var newLink2="http://www.googledoclinkB.com";
  var files = DriveApp.getFiles();   // Note: this gets *every* file in your Google Drive
  while (files.hasNext()) {
    var file = files.next();
    Logger.log(file.getName());
    var doc = DocumentApp.openById(file.getId());
    var link=doc.getBody().findText(oldLink).getElement().asText(); 
    var link2=doc.getBody().findText(oldLink2).getElement().asText(); 
    link.setLinkUrl(newLink);   
    doc.replaceText(oldLink, newLink);
    link2.setLinkUrl(newLink2);   
    doc.replaceText(oldLink2, newLink2);
  }
  Logger.log("Done")
}

...但我收到以下错误消息:

TypeError: Cannot call method "getElement" of null. (line 11, file "Replace Hyperlinks")

我该如何解决这个问题?我该怎么办?

我也只是想从一个文件夹中提取文件,而不是我的 Google Drive 中的所有文件,所以我替换了

var files = DriveApp.getFiles();

var files = DriveApp.getFolderById("insert folder ID").getFiles();

这样会行,对吧?

谢谢你, 劳伦

【问题讨论】:

  • 在你的脚本中,如果Google Document中没有http://www.googledoclink1.comhttp://www.googledoclink2.com的文字,就会出现这样的错误。所以请再次确认。如果您修改后仍出现相同的错误,您能否提供一个示例 Google 文档来复制该问题?当然,请删除您的个人信息。
  • 嗨,我应该澄清一下我将链接更改为我自己的链接。从特定文件夹中提取文件的链接和代码都是我在 ziganotschka 的代码中修改的唯一内容。
  • 感谢您的回复。我注意到已经发布了答案,并且讨论已经进行了。我认为它会解决您的问题。
  • 感谢您的帮助!

标签: google-apps-script hyperlink google-docs drive


【解决方案1】:

关于你的第一个问题:

  • 您正在遍历驱动器/文件夹中的所有文件
  • 其中一些文件可能不包含旧链接“http://www.googledoclink1.com
  • 这会引发错误
  • 您需要执行一个语句来检查链接是否包含,如果不包含,则跳转到下一个文件

关于你的第二个问题:

  • 是的,你可以使用var files = DriveApp.getFolderById("insert folder ID").getFiles();
  • 您也可以使用var files = DriveApp.getFolderById("insert folder ID").getFilesByType(MimeType.GOOGLE_DOCS); 仅检索 Google 文档文件

示例:

function myFunction() {
  var oldLink="http://www.googledoclink1.com";
  var newLink="http://www.googledoclinkA.com";
  var oldLink2="http://www.googledoclink2.com";
  var newLink2="http://www.googledoclinkB.com";
  var files = DriveApp.getFolderById("insert folder ID").getFilesByType(MimeType.GOOGLE_DOCS);
  while (files.hasNext()) {
    var file = files.next();
    if(file){
      var doc = DocumentApp.openById(file.getId());
      var link=doc.getBody().findText(oldLink);
      var link2=doc.getBody().findText(oldLink2);
      if(link){
        link=link.getElement().asText(); 
        link.setLinkUrl(newLink);   
        doc.replaceText(oldLink, newLink);
      }
      if(link2){
        link2=link2.getElement().asText(); 
        link2.setLinkUrl(newLink2);   
        doc.replaceText(oldLink2, newLink2);
      }
    }
  }
  Logger.log("Done")
}

补充:

处理您的评论

示例:假设我有超链接文本:“诊断症状: 循证指南,3e" 和 URL 访问medicine.mhmedical.com/book.aspx?bookid=1088。我想换 该超链接文本与“诊断症状:基于证据的 指南,4e" 与 URL 访问medicine.mhmedical.com/book.aspx?bookid=2715。所以,我想找到 旧超链接的每个实例并将其替换为新的 超链接。我想知道代码中的所有内容都在哪里……是吗 需要引号吗?

示例解决方案:

function myFunction() {
  var oldLinkText="Symptom to Diagnosis: An Evidence-Based Guide, 3e";
  var newLinkText="Symptom to Diagnosis: An Evidence-Based Guide, 4e";
  var oldLinkURL="accessmedicine.mhmedical.com/book.aspx?bookid=1088";
  var newLinkURL="accessmedicine.mhmedical.com/book.aspx?bookid=2715";
  var oldLinkText2="XXX";
  var newLinkText2="XXY";
  var oldLinkURL2="accessmedicine.XXX";
  var newLinkURL2="accessmedicine.XXY";
  var files = DriveApp.getFolderById("insert folder ID").getFilesByType(MimeType.GOOGLE_DOCS);  
  while (files.hasNext()) {
    var file = files.next();
    if(file){
      var doc = DocumentApp.openById(file.getId());
      var link=doc.getBody().findText(oldLinkText);
      var link2=doc.getBody().findText(oldLinkText2);
      if(link){
        link=link.getElement().asText(); 
        link.setLinkUrl(newLinkURL);   
        doc.replaceText(oldLinkText, newLinkText);
      }
      if(link2){
        link2=link2.getElement().asText(); 
        link2.setLinkUrl(newLinkURL2);   
        doc.replaceText(oldLinkText2, newLinkText2);
      }
    }
  }
  Logger.log("Done")
}

【讨论】:

  • 谢谢。我应该澄清一下,我将上面的 URL 链接更改为可能出现在我的 Google 文档中的链接。链接和“从特定文件夹中提取文件”代码都是我在原始代码中修改的唯一内容。上面写着“替换文本”的地方,是我写旧链接文本和新链接文本的地方吗? (不是 URL)另外,上面的这个新代码是否包含您提到的检查链接是否包含的语句,如果没有 - 跳转到下一个文件?谢谢。
  • 语句if(link) 验证具有值oldLink 的链接文本是否包含在文本中 - 如果是,则将链接文本和URL 都替换为newLink。如果不包含oldLink,则代码直接跳转到oldLink2。如果两者都不包含,它会跳转到下一个文档(否则你会因为尝试替换不存在的文本而出错)。是的,“替换文本”是链接文本被替换的地方。
  • 感谢您的澄清。示例:假设我有超链接文本:“诊断症状:循证指南,3e”,URL 为 accessmedicine.mhmedical.com/book.aspx?bookid=1088。我想用 URL accessmedicine.mhmedical.com/book.aspx?bookid=2715 的“诊断症状:循证指南,4e”替换该超链接文本。所以,我想找到旧超链接的每个实例,并用新的超链接替换它。我想知道代码中的所有内容...是否需要引号?
  • 我对我的答案做了补充,希望现在更清楚了。
  • 唯一的问题是,除了代码中已有的链接之外,当我添加其他需要更改的超链接时,我无法使其正常工作:var oldLinkText2="Harrison's Principles of Internal医学,19e"; var newLinkText2="哈里森内科医学原理,20e"; var oldLinkURL2="accessmedicine.mhmedical.com/book.aspx?bookid=1130"; var newLinkURL2="accessmedicine.mhmedical.com/book.aspx?bookid=2129";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多