Google Apps 脚本日历服务:如何避免超过最大执行时间?
Google Apps Script Calendar Service: How to avoid exceeding maximum execution time?
我需要通过 Google Apps 脚本编辑几百甚至几千个日历事件。这只是对标题 (event.setTitle()
) 和描述 (event.setDescription()
) 的微小改动,没什么特别的。尝试处理大约 600 个事件,已经超过 360 秒的最长执行时间。
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
for (var i = 0; i < events.length; i++) {
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
}
如何连续处理多个chunk中的事件?
答案:
使用 PropertiesService
保存你到达的地方,这样你就可以在下一个 运行.
的地方继续你离开的地方
代码:
您可以使用PropertiesService
键值对来保存通过events[]
计数的值:
function renameEvents() {
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var sp = PropertiesService.getScriptProperties();
if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
var count = 0;
else if ((sp.getProperty("count") > 0) {
var count = sp.getProperty("count");
}
for (var i = count; i < events.length; i++) {
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
sp.setProperty("count", i)
}
}
它会使脚本变慢一点,但每次您 运行 它都会从上次停止的地方继续日历事件。
参考文献:
我以前用过类似下面的东西:
在每个循环开始时检查是否有足够的缓冲时间来完成循环。
每当单个循环时间超过缓冲时间时更新缓冲时间。
使用 PropertiesService
存储缓冲区和最后一个索引。
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var ps = PropertiesService.getScriptProperties();
var startIndex = ps.getProperty('lastIndex') || 0;
var buffer = ps.getProperty('buffer') || 100;
var startTime = new Date();
var maxTime = 1000*60*6; //6 mins
for (var i = startIndex; i < events.length; i++) {
var loopStart = new Date()
if (loopStart - startTime > (maxTime-buffer) ) {
ps.setProperty('lastIndex', i);
break;
}
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
var loopTime = new Date() - loopStart;
if (loopTime > buffer ) buffer = loopTime * 1.5
}
ps.setProperty('buffer',buffer)
我需要通过 Google Apps 脚本编辑几百甚至几千个日历事件。这只是对标题 (event.setTitle()
) 和描述 (event.setDescription()
) 的微小改动,没什么特别的。尝试处理大约 600 个事件,已经超过 360 秒的最长执行时间。
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
for (var i = 0; i < events.length; i++) {
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
}
如何连续处理多个chunk中的事件?
答案:
使用 PropertiesService
保存你到达的地方,这样你就可以在下一个 运行.
代码:
您可以使用PropertiesService
键值对来保存通过events[]
计数的值:
function renameEvents() {
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var sp = PropertiesService.getScriptProperties();
if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
var count = 0;
else if ((sp.getProperty("count") > 0) {
var count = sp.getProperty("count");
}
for (var i = count; i < events.length; i++) {
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
sp.setProperty("count", i)
}
}
它会使脚本变慢一点,但每次您 运行 它都会从上次停止的地方继续日历事件。
参考文献:
我以前用过类似下面的东西:
在每个循环开始时检查是否有足够的缓冲时间来完成循环。
每当单个循环时间超过缓冲时间时更新缓冲时间。
使用 PropertiesService
存储缓冲区和最后一个索引。
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var ps = PropertiesService.getScriptProperties();
var startIndex = ps.getProperty('lastIndex') || 0;
var buffer = ps.getProperty('buffer') || 100;
var startTime = new Date();
var maxTime = 1000*60*6; //6 mins
for (var i = startIndex; i < events.length; i++) {
var loopStart = new Date()
if (loopStart - startTime > (maxTime-buffer) ) {
ps.setProperty('lastIndex', i);
break;
}
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
var loopTime = new Date() - loopStart;
if (loopTime > buffer ) buffer = loopTime * 1.5
}
ps.setProperty('buffer',buffer)