【问题标题】:Google Apps Script Calendar Service: How to avoid exceeding maximum execution time?Google Apps 脚本日历服务:如何避免超过最大执行时间?
【发布时间】:2020-03-24 16:12:27
【问题描述】:

我需要通过 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中的事件?

【问题讨论】:

    标签: javascript google-apps-script google-calendar-api


    【解决方案1】:

    答案:

    使用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)
      }
    }
    

    它会使脚本变慢一点,但每次运行它时,它都会从上次停止的日历事件继续。

    参考资料:

    【讨论】:

      【解决方案2】:

      我之前用过类似下面的东西:

      在每个循环开始时检查是否有足够的缓冲时间来完成循环。

      每当单个循环时间超过缓冲时间时更新缓冲时间。

      使用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) 
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多