我正在构建一个脚本,该脚本使用循环的ImportHTML命令来根据邮政编码对天气数据进行web搜索,并且当前在每次运行时都会遇到执行超时的问题。
当前设置脚本的方式在运行时会产生正确的结果,但是由于脚本正在从数百个源中提取数据,这需要一段时间,并且不会在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表。是否有一种方法可以运行该命令来填充“importedData”数组而不写入工作表?
或者,我曾经考虑过利用对函数运行时的检查,并在接近5分钟运行时限制时实现中断,然后递归回原来的函数,但我不确定这是否真的会减轻运行时问题,甚至可能考虑到递归调用的性质。
任何关于如何修改此脚本以在脚本超时参数内运行或修改以产生所有必要的导入数据的完整预期结果的建议都将不胜感激。谢谢!
发布于 2018-01-02 19:47:30
是否有一种方法可以运行该命令来填充“importedData”数组而不写入工作表?
IMPORTHMTL是一个内置电子表格功能的谷歌表格。这类函数不能由Google脚本运行/评估。
相关
或者,我曾经考虑过利用对函数运行时的检查,并在接近5分钟运行时限制时实现中断,然后递归回原来的函数,但我不确定这是否真的会减轻运行时问题,甚至可能考虑到递归调用的性质。
而不是一个“缓解器”,这是一个解决办法。有几种技术,如批处理和并行处理。
参考文献
布鲁斯·麦克弗森有一个很好的例子。他的示例应用程序脚本中的并行处理在练习中使用Map。他也在使用触发器,但也许可以提供一些不同的视角。
另一种选择是登录到早期存取计划,将执行时间限制延长到30分钟。
https://stackoverflow.com/questions/46813690
复制相似问题