Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script Google Sheets脚本超时解决方案_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script Google Sheets脚本超时解决方案

Google apps script Google Sheets脚本超时解决方案,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在构建一个脚本,它使用一个循环ImportHTML命令根据邮政编码在web上抓取天气数据,并且当前遇到了一个问题,每次运行脚本时执行超时 我当前设置脚本的方式在运行时会产生正确的结果,但考虑到脚本从数百个源中提取数据,这需要一段时间,并且不会在Google脚本的当前时间限制内完成 运行脚本的工作表使用3个选项卡: ZIPS,其中包含从 从中提取天气数据的站点 Blank,它只是脚本执行中使用的中间页 结果,将放置最终输出的位置 为了尽量减少读写量,我将代码从执行ImportHTML命令时写入

我正在构建一个脚本,它使用一个循环ImportHTML命令根据邮政编码在web上抓取天气数据,并且当前遇到了一个问题,每次运行脚本时执行超时

我当前设置脚本的方式在运行时会产生正确的结果,但考虑到脚本从数百个源中提取数据,这需要一段时间,并且不会在Google脚本的当前时间限制内完成

运行脚本的工作表使用3个选项卡:

  • ZIPS,其中包含从 从中提取天气数据的站点
  • Blank,它只是脚本执行中使用的中间页
  • 结果,将放置最终输出的位置
  • 为了尽量减少读写量,我将代码从执行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);
    }
    
    函数getTemps(){ var googleSheet=SpreadsheetApp.getActive(); //读取邮政编码链接值 var sheet=googleSheet.getSheetByName('ZIPS'); var zipArray=sheet.getDataRange().getValues(); var arrayLength=zipArray.length; //设置图纸值 var blankSyntaxA='ImportHtml('https://www.wunderground.com/cgi-bin/findweather/getForecast?query=pz:'; var blankSyntaxB='&zip=1,“表”,1'; var tempResult=[]; //写作部分 var sheet=googleSheet.getSheetByName('Blank'); 对于(变量i=0;i 我知道通过消除For循环中包含的读/写操作可以减少脚本的运行时间,但我不确定如何在不运行“Blank”工作表中的ImportHTML命令的情况下获得必要的HTML表。有没有一种方法可以运行该命令来填充“importedData”数组而不写入工作表

    或者,我曾考虑对函数的运行时进行检查,并在接近~5分钟的运行时限制时实施中断,然后对原始函数进行递归调用,但我不确定这是否真的会缓解运行时问题,甚至考虑到递归调用的性质,这是否可行

    对于如何修改此脚本以在脚本超时参数内运行,或如何修改以使用所有必要的导入数据生成完整的预期结果,我们将不胜感激。谢谢

    有没有一种方法可以运行该命令来填充“importedData”数组而不写入工作表

    ImportHTL是Google Sheets内置的电子表格功能。谷歌应用程序脚本无法运行/评估此类功能

    相关的

    或者,我曾考虑对函数的运行时进行检查,并在接近~5分钟的运行时限制时实施中断,然后对原始函数进行递归调用,但我不确定这是否真的会缓解运行时问题,甚至考虑到递归调用的性质,这是否可行

    这不是一种“缓解措施”,而是一种变通方法。有几种技术,如批处理和并行处理

    参考文献

    从到

    我们有一个很好的例子。他的榜样 使用 地图在运动中减少。他也在使用触发器,但也许 可能会提供一些不同的观点


    另一种选择是登录以将执行时间限制延长到30分钟。

    我可能错了,但超时不是因为中的服务加载太多而生成的吗?我试着打开它,但它已经五分钟没有响应了。我在互联网浏览器中启动wunderground.com上的服务时没有遇到任何问题,所以不确定它是否在服务端。但是,脚本运行的最大障碍似乎是for循环运行时加载ImportHTML命令所需的时间。因此,我不确定这是否与服务端有关,或者这仅仅是运行重复命令调用并在循环的每次迭代中读取/写入结果的本质。难道没有一种方法可以通过一次调用将所有需要的数据都带到服务吗?(可能会传递多个邮政编码或类似的信息)我想这就是我目前所坚持的。网站的设置方式是前3位邮政编码的链接列表,如下所示:点击链接会显示一个html表格,其中包含与链接前3位匹配的位置的天气数据,例如:我希望为每个链接提取此表格,特别是“地点”和“温度”列,但我不知道如何通过一次拉动来实现这一点,或者这是否可能。但是,您是在尝试获取每个邮政编码的信息,还是只需要几个?ImportHTML通过接收
    url
    type\u\u\u html\u结构
    index\u所述结构的
    u代码
    ,这允许您通过调用
    ImportHTML(“https://www.wunderground.com/weather-by-zip-code.asp“,”列表“,18)
    。然后,您可以使用代码查询每个起始拉链(用零填充它们以完成三位数)。这将大大减少对该服务的调用