Google App脚本中的日期失败

时间:2016-11-09 14:08:43

标签: javascript google-apps-script

我维护一个我应该按月执行的脚本。该脚本在google工作表的一列中的2588个URL上运行,并从每个URL中检索上次修改日期属性,并将日期输出到右侧的新列中。建议用于衡量每个URL的当前日期和上次修改日期之间的差距。

在下面的示例中,您可以看到脚本在D列URL列表上运行。前36个URL很好,上次修改日期属性正确获取。但该文件的其余部分显示的是31/12/1969日期,截图如下所示:

The Problematic dates

在我在这里阅读了一些问题之后,我明白了由于脚本的某些问题,日期表示失败/ 0。 Google Apps Script Runtime Limitations

我的代码如下:

    function modifiedGap() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //The Google sheet to access
  var sheet = ss.getSheetByName("Fund List");
  //The array of URLs to check
  var urls = sheet.getRange("D2:D2588").getDisplayValues();

  for (var i = 0 ; i < urls.length; i++) {
    var startTime= (new Date()).getTime();

    if (urls[i].toString() != '') {
      //Converting each URL to string and retrieving its Properties into a new Array
      var url = UrlFetchApp.fetch(urls[i].toString());
      var tweets = url.getAllHeaders();

      //Forming an array of Properties by Keys & Values
      var userProperties = PropertiesService.getUserProperties();
      userProperties.setProperties(tweets);
      var tweetsKeys = Object.keys(tweets);

      //Retrieving the link modification date from the property meta-data & outputs it as a String to the cell from the right respectivley.
      var date = new Date(userProperties.getProperty(tweetsKeys[7]));
      sheet.getRange(i + 2, 13).setValue(date);
    }
//    if (isTimeUp(startTime, Math.max(averageExec, execTime)) === true) {
//      autoTrigger(execProperties);
//      throw new Error('Script reseting');
//    }
  }
}

//
//function isTimeUp(start, need) {  
//  var cutoff = 500000 // in miliseconds (5 minutes)
//  var now = new Date();
//  return cutoff - (now.getTime() - start.getTime()) < need; 
//}

似乎网址的响应时间不同,有些网站没有响应。因此脚本崩溃了。有人可以详细说明如何跳过这些例外吗?

1 个答案:

答案 0 :(得分:2)

您添加的内容似乎检查了6分钟的限制,而不是屏幕截图中高亮显示的20000次提取呼叫或50000次PropertyService读/写呼叫。

用于防止6分钟限制的代码块对我来说似乎有些偏差。您尝试检查是否已经过了30毫秒。这里的示例是我在每个循环结束时执行的代码:

if (typeof execProperties.nextPageId !== 'undefined' && execProperties.nextPageId) {
  if (isTimeUp(startTime, Math.max(averageExec, execTime)) === true) {
    autoTrigger(execProperties);
    throw new Error('Script reseting');
  }
}

,其中

function isTimeUp(start, need) {  
  var cutoff = 500000 // in miliseconds (5 minutes)
  var now = new Date();
  return cutoff - (now.getTime() - start.getTime()) < need; 
}

你可以忽略第一个if语句,因为它只是检查我们是否会打扰另一个迭代。只需在循环结束时,检查循环执行一次所需的时间并更新循环的平均执行时间,然后将剩余时间与允许的最大时间进行比较。