我在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最近未能完成 成功。故障摘要如下所示。配置 此脚本的触发器,或更改您的接收设置 未来的失败通知,请点击此处。
脚本由文档日历列表使用。
这些行最后一次成功添加到2月15日。在2月16日或17日没有任何事件要添加,所以2月18日是第一次失败。
这里发生了什么?
是否与从经典日历切换到新日历有关?
或者看起来在添加到表格时遇到了一些问题?
第34行是标记为Appends a new row ...
的最后一行。
答案 0 :(得分:1)
我在这个网站上搜索并搜索“服务超时”错误。看起来这个错误意味着Google服务器的响应速度不够快。
注意:Google服务器的响应时间不确定。有时他们比其他人更快,希望很少这么慢,“服务超时”错误发生。
一种解决方案是使用Bruce McPherson的exponential backoff库或类似的东西。
什么是指数退避
这是推荐的技术,用于调用速率受限的服务。如果检测到它们失败并且可以使用特殊等待算法恢复错误,则将重试几次。这是一种比在每次调用之间使用Utilities.sleep更好的技术,因为它只在需要时才等待,因此不会浪费任何执行时间。
另一种方法是在时间驱动的触发脚本失败时创建要运行的脚本变体。
参考文献: