我正在构建一个脚本,该脚本使用循环的ImportHTML命令来基于邮政编码来抓取天气数据,目前每次运行脚本时都会遇到执行超时的问题
我设置脚本的当前方式在运行时产生了正确的结果,但鉴于脚本从数百个源中提取数据,它需要一段时间,并且不会在Google脚本的当前时间限制内完成。
运行脚本的工作表使用了3个选项卡:
为了尽可能地尝试减少读/写量,我改变了代码,将执行时的ImportHTML命令的每个结果写入附加到数组并在结束时写入此数组。脚本。它当前形式的代码如下:
function getTemps() {
var googleSheet = SpreadsheetApp.getActive();
// Read in Zip code link values
var sheet = googleSheet.getSheetByName('ZIPS');
var zipArray = sheet.getDataRange().getValues();
var arrayLength = zipArray.length;
//Set up sheet values
var blankSyntaxA = 'ImportHtml("https://www.wunderground.com/cgi-bin/findweather/getForecast?query=pz:';
var blankSyntaxB = '&zip=1", "table", 1)';
var tempResult = [];
// Writing Section
var sheet = googleSheet.getSheetByName('Blank');
for (var i = 0; i < arrayLength; i++)
{
var liveSyntax = blankSyntaxA+zipArray[i][0]+blankSyntaxB;
sheet.getRange('A1').setFormula(liveSyntax);
var importedData = sheet.getDataRange().getValues();
tempResult = tempResult.concat(importedData);
}
var sheet = googleSheet.getSheetByName('Result');
sheet.getRange(1,1,tempResult.length,8).setValues(tempResult);
}
我知道可以通过消除For循环中包含的读/写来减少脚本的运行时间,但我不知道如何在不运行&#中的ImportHTML命令的情况下获取必要的HTML表39;空白&#39;片。有没有办法运行该命令来填充&#39; importedData&#39;数组没有写入工作表?
或者,我考虑过对函数的运行时进行检查,并在接近~5分钟的运行时限制时执行中断,然后递归调用回原函数,但我不确定如果这实际上会缓解运行时问题,或者甚至可以考虑递归调用的性质。
关于如何修改此脚本以在脚本超时参数内运行或修改以产生具有所有必需导入数据的完整所需结果的任何建议将不胜感激。谢谢!
答案 0 :(得分:0)
有没有办法运行该命令来填充'importedData'数组而无需写入工作表?
IMPORTHMTL是Google表格内置的电子表格功能。 Google Apps脚本无法运行/评估此类功能。
相关
或者,我考虑过对函数的运行时进行检查,并在接近~5分钟的运行时限制时执行中断,然后递归回调到原始函数,但我不确定是否这样实际上会减轻运行时问题,甚至可以考虑递归调用的性质。
这不是“缓解者”,而是一种解决方法。有几种技术,如批处理和并行处理。
参考
从answer到Threading in Google App Script
Bruce Mcphearson有一个很好的例子。他的榜样 Parallel Processing in Apps Script使用 地图减少锻炼。他也在使用触发器,但也许 可能会提供一些不同的观点。
另一种方法是登录Early Access Program,将执行时间限制延长至30分钟。