为什么我的Apps脚本突然停止工作?

时间:2018-02-19 13:44:10

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

我在Google表格中使用了以下Apps脚本代码几个月没有问题。

每天晚上9点至晚上10点由时间触发器触发,它会从我的Google日历中提取同一天的每个事件,并将相应的行与这些详细信息添加到Google表格中。

// Add Google Calendar events to Google Sheets.
// Sheet row additions to fire Zapier ClickTime actions.
// Script originally from https://blog.ouseful.info/2010/03/05/grabbing-google-calendar-event-details-into-a-spreadsheet/

function caltest3(){
  //http://www.google.com/google-d-s/scripts/class_calendar.html#getEvents
  // The code below will retrieve events between 2 dates for the user's default calendar and
  // display the events the current spreadsheet
  var cal = CalendarApp.getDefaultCalendar();
  var sheet = SpreadsheetApp.getActiveSheet();

  // Today's date, via https://stackoverflow.com/questions/46548281/how-to-reference-todays-date-in-javascript
  var today = new Date();
  var dd = today.getDate();
  var mm = today.getMonth();
  var yyyy = today.getFullYear();


  // Use Google Calendar classes, https://developers.google.com/apps-script/reference/spreadsheet/sheet#appendRow(Object):

  // Get all events between this range
  var events = cal.getEvents(new Date(yyyy, mm, dd, 0, 0, 0), new Date(yyyy, mm, dd, 23, 0, 0));

  // For every event, 
  for (var i=0;i<events.length;i++) {

    // Calculate hour length of event
    var hours = Math.abs(events[i].getEndTime() - events[i].getStartTime()) / 36e5;

    // Combine elements of event
    // var details=[[events[i].getStartTime(),  events[i].getEndTime(), hours, events[i].getTitle(), events[i].getDescription()]];

    // Appends a new row with columns to the bottom of the spreadsheet containing the values in the array
    sheet.appendRow([events[i].getStartTime(),  events[i].getEndTime(), hours, events[i].getTitle(), events[i].getDescription()]);

  }
}

但是,一夜之间,我收到了谷歌的这条消息......

  

您的脚本Calendar Transfer最近未能完成   成功。故障摘要如下所示。配置   此脚本的触发器,或更改您的接收设置   未来的失败通知,请点击此处。

     

脚本由文档日历列表使用。

     

enter image description here   此致Google Apps脚本

这些行最后一次成功添加到2月15日。在2月16日或17日没有任何事件要添加,所以2月18日是第一次失败。

这里发生了什么?

是否与从经典日历切换到新日历有关?

或者看起来在添加到表格时遇到了一些问题?

第34行是标记为Appends a new row ...的最后一行。

1 个答案:

答案 0 :(得分:1)

我在这个网站上搜索并搜索“服务超时”错误。看起来这个错误意味着Google服务器的响应速度不够快。

  

注意:Google服务器的响应时间不确定。有时他们比其他人更快,希望很少这么慢,“服务超时”错误发生。

一种解决方案是使用Bruce McPherson的exponential backoff库或类似的东西。

  

什么是指数退避

     

这是推荐的技术,用于调用速率受限的服务。如果检测到它们失败并且可以使用特殊等待算法恢复错误,则将重试几次。这是一种比在每次调用之间使用Utilities.sleep更好的技术,因为它只在需要时才等待,因此不会浪费任何执行时间。

另一种方法是在时间驱动的触发脚本失败时创建要运行的脚本变体。

参考文献: