Google脚本“超过最长执行时间”/ Google Cal脚本

时间:2014-02-07 15:39:28

标签: google-apps-script google-sheets google-calendar-api google-docs

因此,基于大量的互联网调查,我已经设法拼凑了一个使用Google表格创建全天日历条目的脚本。我想要为其创建事件的内容总共大约有450行,但是每次运行脚本时它都永远不会结束,而且它永远不会创建一个EventId(以解决重复的问题),相反,它给了我一个“超过最长执行时间“错误。

    $ function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Export Events",
functionName : "exportEvents"
}];
sheet.addMenu("Calendar Actions", entries);
};

function exportEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 0;  // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "evsck12.com_fp4p25esvij964uhmfs51o9ar8@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[0]);  // First column
var title = row[1];           // Second column
var id = row[3];              // Sixth column == eventId
// Check if event already exists, update it if it does
try {
  var event = cal.getEventSeriesById(id);
}
catch (e) {
  // do nothing - we just want to avoid the exception when event doesn't exist
}
if (!event) {
  var newEvent = cal.createAllDayEvent(title, date).getId();
  row[3] = newEvent;  // Update the data array with event ID
}
else {
  event.setTitle(title);
range.setValues(data);
}
debugger;
}


}

我的问题是这些:

  • 如何避免此错误?如果我将数据分成几张可以工作吗?
  • 对于我的生活,我无法得到偶数部分...我设法在测试页上做到了但我不能再这样了......任何帮助都会很棒!

作为参考,我的工作表设置为 日期/标题/ eventId

感谢!!!!

1 个答案:

答案 0 :(得分:1)

首先在代码中出现一些错误......

  1. 您更新了行[3],但忘了用相应的行值更新数据,我只使用数据作为变量进行了简化。
  2. 您使用row[3]作为第三列,它是row[2](现在data[i][2]
  3. 您在工作表中的错误位置更新了工作表
  4. 下面是工作代码(为了测试目的,我将校准ID更改为我自己的代码......当然还原你的代码)

    至于时间限制,你应该通过有限的一批事件来进行,看看执行记录,看看1需要多长时间,然后乘以...得到一个远低于5分钟的值,这是最大的Google Script中的执行时间。 然后你应该保留行索引(i)的值,并使用时间触发器继续从该索引开始的下一批处理。

    documentation on trigger创建将为您提供帮助,而the scriptProperties是将索引值保存在键/值架构中的理想位置。另见doc。

    如果您遇到问题,请不要犹豫,回答一个新问题。

    function exportEvents() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var headerRows = 1;  // Number of rows of header info (to skip)
      var range = sheet.getDataRange();
      var data = range.getValues();
      var calId = "h22nevo15tm0nojb6ul4hu7ft8@group.calendar.google.com";
      var cal = CalendarApp.getCalendarById(calId);
      for (i in data) {
        if (i < headerRows) continue; // Skip header row(s)
        var date = new Date(data[i][0]);  // First column
        var title = data[i][1];           // Second column
        var id = data[i][2];              // third column == eventId
        // Check if event already exists, update it if it does
        try {
          var event = cal.getEventSeriesById(id);
        }
        catch (e) {
          // do nothing - we just want to avoid the exception when event doesn't exist
    }
        if (!event) {
          Logger.log(event);
          var newEvent = cal.createAllDayEvent(title, date);
          data[i][2] = newEvent.getId();  // Update the data array with event ID
        }
        else {
          event.setTitle(title);
        }
      }
      Logger.log(data);
      sheet.getRange(1,1,data.length,data[0].length).setValues(data);
    
    }