我维护一个我应该按月执行的脚本。该脚本在google工作表的一列中的2588个URL上运行,并从每个URL中检索上次修改日期属性,并将日期输出到右侧的新列中。建议用于衡量每个URL的当前日期和上次修改日期之间的差距。
在下面的示例中,您可以看到脚本在D列URL列表上运行。前36个URL很好,上次修改日期属性正确获取。但该文件的其余部分显示的是31/12/1969日期,截图如下所示:
在我在这里阅读了一些问题之后,我明白了由于脚本的某些问题,日期表示失败/ 0。
我的代码如下:
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;
//}
似乎网址的响应时间不同,有些网站没有响应。因此脚本崩溃了。有人可以详细说明如何跳过这些例外吗?
答案 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语句,因为它只是检查我们是否会打扰另一个迭代。只需在循环结束时,检查循环执行一次所需的时间并更新循环的平均执行时间,然后将剩余时间与允许的最大时间进行比较。