UrlFetchApp.fetch 会中止脚本吗?

UrlFetchApp.fetch will abort the script?

我创建了一个传播sheet 3 sheets,“链接”,“有效链接”和“无效links”,然后使用以下代码检查每个在“链接”中排sheet,如下:

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 脚本社区上问过这个问题,但没有人回答。所以我必须在这里问。我不知道如何在 Google 脚本社区上获得我的问题的具体 URL,所以我必须复制并粘贴问题。抱歉。

更新

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

  1. 我认为行[1]指的是A列,但它实际上指的是B列,这是一个未定义的值,所以导致错误。

  2. !number应该改成number,好像(number)表示匹配所以结果有效link.

我相信你的目标如下。

  • 您想通过使用 UrlFetchApp.fetch.
  • 检查 URL 来将值赋给 Valid LinksInvalid Links sheet
  • 检查的URL放在Linkssheet的“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 Linkssheet中。当 sample.com 不包含在 page 中时,url 放在 Valid Links sheet 中。我不确定这是否是您期望的结果。但请注意这一点。
  • 我觉得用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 方法。

参考文献:

已添加:

关于,

One more question, when url is wisesoft.co.uk, I get error SSL Error wisesoft.co.uk (line 10, file "Code") and the script also abort. I use Chrome and find https has error but the site can be visited via http version, how to ignore such an error and continue fetch the contents?

在这种情况下,使用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]);
      }
    }
  });
}