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