【问题标题】:Reducing Execution time of UrlFetch in google AppScripts减少 google App Scripts 中 UrlFetch 的执行时间
【发布时间】:2018-08-11 03:11:16
【问题描述】:

我有一个包含 URL 列表的电子表格。 我正在尝试搜索 URL 是否包含特定类,并根据响应在其旁边的单元格中设置 0 或 1。 我已经制作了一个脚本,它可以达到目的,但是我遇到了执行超时错误,所以我只想有什么办法可以减少它的执行时间。

这里是代码

function ulrFetch(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var class = ss.getRange(1, 5).getValue();
  var lr = ss.getLastRow();
  var urlList = ss.getRange(3, 8, lr-1).getValues();
  var length = urlList.length
  for (var i = 0;i<length;i++){
    var url = urlList[i];
    var response = UrlFetchApp.fetch(url.toString());
    var result = response.getContentText();
    var index = result.indexOf(class);
    if (index > -1){
      
      ss.getRange(i+3, 5).setValue('1');
    }
    else {
      ss.getRange(i+3, 5).setValue('0');
    }
  }
}

提前致谢!!

【问题讨论】:

  • 能问一下var length = urlList.lengthlength的值吗?我认为在您的情况下,您可以使用fetchAll()。 fetchAll() 可以通过异步处理来工作。但是因为我也觉得length很大的时候可能用不上。
  • @Tanaike 感谢您的回复,urlList 的长度为 720
  • 感谢您的回复。我发布了一个答案,因为我认为 fetchAll() 可能可以使用 720 个请求。你能确认一下吗?

标签: javascript google-apps-script google-sheets


【解决方案1】:

这个修改怎么样?我认为 fetchAll() 可能会使用 720 个请求。所以我想建议使用fetchAll()。修改后的脚本流程如下。

  1. 使用urlList 创建请求。
  2. 使用 fetchAll() 从 URL 中检索值。
  3. 创建用于放入电子表格的值。
  4. 将创建的值放入“E3:E”。

修改后的脚本:

请进行如下修改。

从 :
var urlList = ss.getRange(3, 8, lr-1).getValues();
到 :
var urlList = ss.getRange(3, 8, lr - 1 - 1).getValues();

通过这种修改,可以检索到从第 3 行到最后一行的值。

从 :
for (var i = 0;i<length;i++){
  var url = urlList[i];
  var response = UrlFetchApp.fetch(url.toString());
  var result = response.getContentText();
  var index = result.indexOf(class);
  if (index > -1){

    ss.getRange(i+3, 5).setValue('1');
  }
  else {
    ss.getRange(i+3, 5).setValue('0');
  }
}
到 :
var requests = urlList.map(function(e) {return {url: e[0]}});
var res = UrlFetchApp.fetchAll(requests);
var values = res.map(function(e) {return e.getContentText().indexOf(class) > -1 ? ["1"] : ["0"]});
ss.getRange(3, 5, values.length, 1).setValues(values);

注意:

  • 如果由于 fetchAll() 的限制而发生错误,请告诉我。我想修改脚本。

参考:

如果我误解了你的问题,我很抱歉。

【讨论】:

  • 您好,感谢您提供的答案似乎令人信服,但我在此行“var res = UrlFetchApp.fetchAll(requests);”上收到此错误“无效参数:http://”
  • @Ace Cool 对于给您带来的不便,我深表歉意。在这个修改后的脚本中,urlList 是包含 URL 的二维数组。无法使用 URL 时会发生错误。那么你能提供你想使用的示例 URL 吗?我确认在我的环境中,当可以使用的 URL 用于请求时,它可以工作。
  • 完美!非常感谢您的时间和支持接受了您的回答。 :)
  • @Ace Cool 很高兴您的问题得到解决。也谢谢你。
猜你喜欢
  • 2018-04-28
  • 2021-12-02
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多