Google应用脚本超时~5分钟?

时间:2013-01-22 02:53:10

标签: google-apps-script google-drive-api

我的谷歌应用脚​​本正在迭代用户的谷歌驱动器文件并复制,有时将文件移动到其他文件夹。该脚本始终在5分钟后停止,日志中没有错误消息。

我在一次运行中整理了数十个甚至数千个文件。

是否有任何设置或解决方法?

5 个答案:

答案 0 :(得分:43)

配额

  

单个脚本的最长执行时间为6分钟/执行
   - http://api.itextpdf.com/itext/com/itextpdf/text/pdf/codec/TiffImage.html

但是要熟悉自己还有其他一些限制。例如,您只允许1小时/天的总触发运行时间,因此您不能将长函数分解为12个不同的5分钟块。

优化

也就是说,为什么你真的需要花6分钟才能执行。 JavaScript在几秒钟内排序数千行数据应该没有问题。可能会对您的性能造成影响的是Google Apps本身的服务电话。

  

通过最大限度地减少读写次数,您可以编写脚本以最大限度地利用内置缓存。交替读写命令很慢。要加速脚本,使用一个命令将所有数据读入数组,对数组中的数据执行任何操作,并使用一个命令写出数据。
   - https://developers.google.com/apps-script/guides/services/quotas

配料

您可以做的最好的事情是减少服务电话的数量。 Google通过允许大多数API调用的批量版本来实现此目的。

作为一个简单的例子,而不是

for (var i = 1; i <= 100; i++) {
  SpreadsheetApp.getActiveSheet().deleteRow(i);
}

执行此操作

SpreadsheetApp.getActiveSheet().deleteRows(i, 100);

在第一个循环中,您不仅需要在工作表上调用100次deleteRow,而且还需要将活动工作表调用100次。第二种变化应该比第一种变化好几个数量级。

交织读写

此外,您还应该非常小心,不要经常在阅读和写作之间来回走动。您不仅会在批处理操作中失去潜在的收益,而且Google也无法使用其内置缓存。

  

每次执行读取操作时,我们必须先清空(提交)写入缓存,以确保您正在读取最新数据(可以通过调用SpreadsheetApp.flush()强制写入缓存)。同样,每次执行写操作时,我们都必须丢弃读缓存,因为它不再有效。因此,如果您可以避免交错读写,您将获得缓存的全部好处    - https://developers.google.com/apps-script/best_practices

例如,而不是

sheet.getRange("A1").setValue(1);
sheet.getRange("B1").setValue(2);
sheet.getRange("C1").setValue(3);
sheet.getRange("D1").setValue(4);

执行此操作

sheet.getRange("A1:D1").setValues([[1,2,3,4]]);

链接函数调用

作为最后的手段,如果您的功能在六分钟内无法完成,您可以将呼叫链接在一起或分解您的功能以处理较小的数据段。

您可以将数据存储在http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html(临时)或Cache Service(永久)存储区中,以便在执行过程中进行检索(因为Google Apps脚本执行了无状态执行)。

如果您想启动其他活动,可以使用Properties Service创建自己的触发器,或在紧迫的时间表上设置定期触发器。

答案 1 :(得分:11)

找出一种分割工作的方法,因为它只需不到6分钟,因为这是任何脚本的限制。在第一遍中,您可以在电子表格中迭代并存储文件和文件夹列表,并为第2部分添加时间驱动的触发器。

在第2部分中,在处理列表时删除列表中的每个条目。如果列表中没有项目,请删除触发器。

这就是我处理一张大约1500行的表格,这些表格可以传播到十几种不同的电子表格中。由于对电子表格的调用次数,它会超时,但会在触发器再次运行时继续。

答案 2 :(得分:2)

我开发了一个Google Apps脚本库,该库使用UserProperties和编程触发器来运行批量超过6分钟。您可以在GAS项目中导入此库,并使用API​​包装代码,以便它可以运行FOREVER(实际上,我们受限于与触发器可以运行的小时数相关的配额)

您可以在此处了解所有相关信息:http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html

答案 3 :(得分:0)

如果您是商业客户,现在可以注册Early Access to App Maker,其中包括Flexible Quotas

  

在灵活的配额制度下,此类硬配额限制将被删除。脚本在达到配额限制时不会停止。相反,它们会延迟到配额可用,此时脚本执行将恢复。一旦开始使用配额,它们将以常规费率重新填充。为了合理使用,脚本延迟很少见。

答案 4 :(得分:0)

如果您将G Suite用作企业,企业或EDU 客户,则运行脚本的执行时间将设置为:

每次执行30分钟

请参阅:https://developers.google.com/apps-script/guides/services/quotas