当前位置: 首页 > 知识库问答 >
问题:

通过Google应用程序脚本获取XML在超过最大执行时间时结束

葛子昂
2023-03-14

我试图通过Google应用程序脚本获取XML,然后将这些值传递给Google工作表。在几次迭代中,一切正常。如果我尝试更多,我将超过执行的最长时间。

下面的代码会导致错误消息“超过最大执行时间”。如果我降低迭代次数(3),它将起作用。但是我需要迭代大约20K行。

function myFunction(){
  var url = '<<file name>>';
  var bggXml = UrlFetchApp.fetch(url).getContentText();

  var document = XmlService.parse(bggXml);
  var root = document.getRootElement();
  var now = new Date();



  for(var i = 0; i <= 20; i++){


  var shopitem = root.getChildren('SHOPITEM')[i];

  var code = shopitem.getChild('CODE').getText();
  var stock100 = shopitem.getChild('STOCK').getChild('WAREHOUSES').getChildren('WAREHOUSE')[0].getChild('VALUE').getText();
  var stock801 = shopitem.getChild('STOCK').getChild('WAREHOUSES').getChildren('WAREHOUSE')[1].getChild('VALUE').getText();




  SpreadsheetApp.getActiveSheet().getRange(1+i,1).setValue(code);
  SpreadsheetApp.getActiveSheet().getRange(1+i,2).setValue(stock100);
  SpreadsheetApp.getActiveSheet().getRange(1+i,3).setValue(stock801);


 } 


}

饲料结构

<SHOP>
    <SHOPITEM>
        <CODE>#SKU#</CODE>
        <STOCK>
            <WAREHOUSES>
                <WAREHOUSE>
                    <NAME>Sklad 100</NAME>
                    <VALUE>"stock value"</VALUE>
                </WAREHOUSE>
                <WAREHOUSE>
                    <NAME>Sklad 801</NAME>
                    <VALUE>"stock value"</VALUE>
                </WAREHOUSE>
            </WAREHOUSES>
        </STOCK>
    </SHOPITEM>
</SHOP>

有什么建议吗,有什么问题吗?

非常感谢你

共有1个答案

戚修雅
2023-03-14

正如您收到的错误所说,您正在达到脚本执行时间限制,根据您的帐户类型,该时间限制可能为6或30分钟,如下所述。

为了避免这种情况,你可以做两件事(不是相互排斥的):

提高代码的效率。例如,您可以将不同的setValue替换为一个setValue。您必须替换此:

SpreadsheetApp.getActiveSheet().getRange(1+i,1).setValue(code);
SpreadsheetApp.getActiveSheet().getRange(1+i,2).setValue(stock100);
SpreadsheetApp.getActiveSheet().getRange(1+i,3).setValue(stock801);

用这个:

SpreadsheetApp.getActiveSheet().getRange(1+i, 1, 1, 3).setValues([[code, stock100, stock801]]);

您还可以通过设置一个基于时间的触发器将循环拆分为不同的执行,该触发器将在前一个执行完成后触发每个后续执行。您必须执行以下操作:

>

在函数的末尾创建以下基于时间的触发器:在之后(持续时间毫秒)。得益于此,您可以在指示的毫秒数之后运行指定的任何函数。每次执行后,都会创建一个触发器来触发下一个触发器。

由于要拆分循环,因此必须将循环计数器(i)存储在某个位置(可以在每次执行结束时使用PropertiesService,或将其写入电子表格),并在下一次执行开始时检索它,以便在后续执行中,脚本知道从何处恢复循环。例如,如果您不知道如何存储和检索脚本属性,请参阅此答案。

js prettyprint-override">function myFunction(){
  var i_old = // Retrieve i stored in previous execution (from PropertiesService? Spreadsheet?) (should be 0 if first execution)
  var n_int = 3 // Number of iterations that can be done in a single execution without reaching time limit (change accordingly)
  var total = 20 // Total number of iterations (change accordingly)
  var url = '<<file name>>';
  var bggXml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(bggXml);
  var root = document.getRootElement();
  var now = new Date();
  // Loop starts at previous i store until it reaches the specified number of iterations for one execution or reaches the total number:
  for(var i = i_old; i <= i_old + n_int && i <= total; i++) { 
    var shopitem = root.getChildren('SHOPITEM')[i];
    var code = shopitem.getChild('CODE').getText();
    var stock100 = shopitem.getChild('STOCK').getChild('WAREHOUSES').getChildren('WAREHOUSE')[0].getChild('VALUE').getText();
    var stock801 = shopitem.getChild('STOCK').getChild('WAREHOUSES').getChildren('WAREHOUSE')[1].getChild('VALUE').getText();
    SpreadsheetApp.getActiveSheet().getRange(1 + i, 1, 1, 3).setValues([[code, stock100, stock801]]);
  }
  // Store i somewhere (PropertiesService? Spreadsheet?)
  if (i <= total) { // Create trigger if i hasn't reach the total number of iteration
    ScriptApp.newTrigger("myFunction")
    .timeBased()
    .after(1000 * 60) // This fires the function 1 minute after the current execution ends. Change this time according to your preferences
    .create();  
  }
}
  • 应用程序脚本:当前限制
  • 物业服务
  • 之后(持续毫秒)
 类似资料:
  • 问题内容: 我不断收到此PHP错误: 致命错误:超过300秒的最大执行时间 我已经尝试设置我和我的php.ini的(Apache和CLI)来,和秒每。 而且我仍然收到错误消息: 致命错误:超过300秒的最大执行时间 同样,我的脚本运行了300秒钟以上才收到此消息 我正在通过命令行运行脚本。 我还检查了我,以便查看我正在使用哪个。 更有趣的是,我尝试将设置 和设置设置为5秒,并且我的脚本将在5秒钟后

  • 问题内容: 我正在从在线来源下载JSON文件,当它在循环中运行时,出现此错误: 致命错误:第24行的C:\ wamp \ www \ temp \ fetch.php中超过30秒的最大执行时间 问题答案: 您的循环可能是无止境的。如果不是,则可以这样延长最长执行时间: 和 可用于暂时延长时间限制。

  • 本文向大家介绍Linux下通过gettimeofday函数获取程序段执行时间【推荐】,包括了Linux下通过gettimeofday函数获取程序段执行时间【推荐】的使用技巧和注意事项,需要的朋友参考一下 在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中。此函数接收两个结构体参数,分别为timeval、timezone.      

  • 我试图通过谷歌应用程序脚本调用谷歌表单API。例如,我遵循此处提供的说明: https://developers.google.com/sheets/api/quickstart/js 我已经通过我的谷歌云平台项目生成了客户端ID和API密钥,正如其他地方建议的那样。 现在,我已经创建了一个包含两个文件的谷歌应用程序脚本,ode.gs文件和一个名为index.html的文件,其中包含从上面的谷歌表

  • 问题内容: 我想在几种不同条件下在linux shell中执行某些操作,并能够输出每次执行的执行时间。 我知道我可以编写一个可以执行此操作的perl或python脚本,但是有什么方法可以在shell中执行它吗?(碰巧是bash) 问题答案: 使用内置关键字: 例:

  • 好心的,谁能帮助关于以下例外的根本原因。 test_automation.tc_invoice_printing.tc_input_fields_validation(tc_invoice_printing.java:37)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(本机方法)在java.base/jdk.int