Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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应用程序脚本获取XML在超过最大执行时间时结束_Google Apps Script - Fatal编程技术网

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

Google apps script 通过Google应用程序脚本获取XML在超过最大执行时间时结束,google-apps-script,Google Apps Script,我试图通过Google应用程序脚本获取XML,然后将这些值传递给Google工作表。在几次迭代中,一切正常。如果我尝试更多,我将超过执行的最长时间 下面的代码导致错误消息“超出了最大执行时间”。如果我降低迭代次数(3),它就会工作。但我需要遍历大约20K行 function myFunction(){ var url = '<<file name>>'; var bggXml = UrlFetchApp.fetch(url).getContentText();

我试图通过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);


 } 


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


非常感谢

因为您收到的错误表明,您正在达到脚本执行时间限制,根据指定的帐户类型,该时间限制可能为6或30分钟

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

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

SpreadsheetApp.getActiveSheet().getRange(1+i,1).setValue(代码);
电子表格app.getActiveSheet().getRange(1+i,2).setValue(stock100);
电子表格app.getActiveSheet().getRange(1+i,3).setValue(stock801);
为此:

SpreadsheetApp.getActiveSheet().getRange(1+i,1,1,3).setValue([[code,stock100,stock801]]);
将脚本拆分为多个执行: 您还可以通过设置一个基于时间的触发器将循环拆分为不同的执行,该触发器将在前一个执行完成后触发每个后续执行。您必须执行以下操作:

  • 找出在达到时间限制之前可以进行多少次迭代(在下面的示例中,设置为3)。每次执行都必须在完成之前进行此数量的迭代

  • 在函数末尾创建以下基于时间的触发器:。由于这一点,您可以在指定的毫秒数之后运行指定的任何函数。每次执行后,将创建一个触发器来触发下一个触发器

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

示例代码(检查内联注释):
函数myFunction(){
var i_old=//检索上次执行中存储的i(从PropertiesService?电子表格?)(如果第一次执行,则应为0)
var n_int=3//在不达到时间限制的情况下,一次执行可以完成的迭代次数(相应更改)
var total=20//总迭代次数(相应更改)
var url='';
var bggXml=UrlFetchApp.fetch(url.getContentText();
var document=XmlService.parse(bggXml);
var root=document.getRootElement();
var now=新日期();
//循环从上一个i存储开始,直到达到一次执行的指定迭代次数或达到总数:
对于(var i=i_old;i
<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>