我的谷歌应用脚本正在迭代用户的谷歌驱动器文件并复制,有时将文件移动到其他文件夹。该脚本始终在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