微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UrlFetchApp.fetch将中止脚本吗? 修改点:修改后的脚本:注意:参考文献:修改后的脚本:

如何解决UrlFetchApp.fetch将中止脚本吗? 修改点:修改后的脚本:注意:参考文献:修改后的脚本:

我创建一个包含3个工作表的电子表格,“链接”,“有效链接”和“无效链接”,然后使用以下代码检查“链接”表中的每一行,如下所示:

function myFunction() {
  var rows = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Links").getDatarange().getValues();
  
  rows.forEach(function(row,index) 
  {
    if (index !== 0) 
    { 
      var url = row[1];
      var page = UrlFetchApp.fetch(url).getContentText();
      var number = page.match("sample.com");
      
      if (!number)
        SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Valid Links").appendRow(url);
      else
        SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Invalid Links").appendRow(url);
    }
  });
}

但是,当我调试到UrlFetchApp.fetch(url)时,脚本突然中止。没有显示错误或异常。为什么?

我在Google Script Community上问了这个问题,但没有人回答。所以我不得不在这里问。我不知道如何在Google Script社区中获取问题的特定URL,因此我必须复制并粘贴问题。抱歉。

更新

在Tanaike的帮助下,我修复了错误

  1. 我认为row [1]指向A列,但实际上它指向B列,这是一个未定义的值,因此会引起错误

  2. !number应该更改为number,好像(number)表示匹配,因此结果是有效的链接

解决方法

我相信您的目标如下。

  • 您想通过使用Valid Links检查URL来将值放入Invalid LinksUrlFetchApp.fetch工作表中。
  • 要检查的URL放在Links工作表的“ B”列中。

修改点:

  • 在这种情况下,如何使用muteHttpExceptions作为UrlFetchApp.fetch的选项?这样,即使请求失败,也可以检索响应值。
    • muteHttpExceptions的默认值为false。在这种情况下,当请求发生错误时,脚本将停止。看来这是当前的规范。但是,当muteHttpExceptionstrue时,即使请求发生错误,脚本也不会停止。
  • 在脚本中,使用appendRow(url)var url = row[1];是列“ B”中的值。在这种情况下,url必须为[url]
  • var number = page.match("sample.com");的情况下,当sample.com中包含page时,url被放在Invalid Links表中。如果sample.com中未包含page,则url将放在Valid Links表中。我不确定这是否是您期望的结果。但是请注意这一点。
  • 我认为使用var ss = SpreadsheetApp.getActiveSpreadsheet();时,可以降低处理成本。

当以上几点反映到您的脚本时,它如下所示。

修改后的脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();  // Added
  var rows = ss.getSheetByName("Links").getDataRange().getValues();  // Added
  rows.forEach(function(row,index) {
    if (index !== 0) {
      var url = row[1];
      var page = UrlFetchApp.fetch(url,{muteHttpExceptions: true}).getContentText();  // Modified
      var number = page.match("sample.com");
      if (!number) {
        ss.getSheetByName("Valid Links").appendRow([url]);  // Added
      } else {
        ss.getSheetByName("Invalid Links").appendRow([url]);  // Added
      }
    }
  });
}

注意:

  • 使用fetchAll时,可以进一步降低处理成本。但是我不确定URL的数量。因此,我不使用fetchAll方法就像上面那样修改了脚本。

参考文献:

已添加:

关于the following new question

另一个问题,当url为wisesoft.co.uk时,出现错误SSL错误wisesoft.co.uk(第10行,文件“代码”),脚本也中止。我使用Chrome浏览器,发现https错误,但是可以通过http版本访问该网站,如何忽略该错误并继续获取内容?

在这种情况下,如何按以下方式使用try...catch

修改后的脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var rows = ss.getSheetByName("Links").getDataRange().getValues();
  rows.forEach(function(row,index) {
    if (index !== 0) {
      var url = row[1];
      try {
        var page = UrlFetchApp.fetch(url,{muteHttpExceptions: true}).getContentText();
        var number = page.match("sample.com");
        if (!number) {
          ss.getSheetByName("Valid Links").appendRow([url]);
        } else {
          ss.getSheetByName("Invalid Links").appendRow([url]);
        }
      } catch(e) {
        ss.getSheetByName("Invalid Links").appendRow([url]);
      }
    }
  });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。