dig*_*eez 5 javascript synchronization google-calendar-api google-sheets google-apps-script
我正在尝试创建一个Google Apps脚本,以使Google日历和云端硬盘上的“主电子表格”保持同步-这可能吗?我发现了这两篇文章:
http://blog.ouseful.info/2010/03/04/maintaining-google-calendars-from-a-google-spreadsheet/
http://blog.ouseful.info/2010/03/05/grabbing-google-calendar-event-details-into-a-spreadsheet/
我很确定这可以使用很多if语句和逻辑来完成,但是也许有更简单的方法吗?
我最后只提供了以下简单脚本。真正需要做的只是基于两列添加事件,这将花费很长时间来开发。
function onOpen() {
//spawns a menu with a button that triggers AddToCal
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Add event to calendar",
functionName : "AddToCal"
}];
sheet.addMenu("Data To Calendar Plugin", entries);
};
function AddToCal(){
//get the current row
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cell = ss.getActiveCell();
var R = cell.getRow();
//grab values for current row to pass to calendar event
var date_of_event = ss.getRange('G'+R).getValue();
var date = new Date(date_of_event);
var event_title = ss.getRange('A'+R).getValue();
//access the calendar
var cal = CalendarApp.getCalendarById('[IDREMOVED]');
cal.createAllDayEvent(event_title,date);
ss.toast("Event added to " + cal.getName());
}
Run Code Online (Sandbox Code Playgroud)
是的,可以编写一个双向事件同步脚本,但这并不简单。您引用的这两篇文章的部分可以重用,但是与实际同步将面临的挑战相比,它们是非常基本的。您可能需要阅读针对事件预订系统使用Google Apps脚本,该系统的确会基于电子表格创建日历条目(但不会进行持续的同步)。我过去已经对该脚本进行了一些调试。
同步需要支持:
CalendarEvent.getEventSeries()处理(或选择避免)这是您可以从以下代码开始的伪代码:
Open Calendar, Read Calendar events into calArray (will all attributes you care for)
Open Spreadsheet, Read Spreadsheet events into sheetArray
For each event in calArray:
Search for calEvent in sheetArray.
If found, compare lastUpdated values.
If equal, do nothing
Otherwise copy most recently updated to least recently updated
Continue with next event
If not found then copy calEvent to new sheetEvent, including lastUpdated value.
Continue with next event
For each event in the sheetArray (...that hasn't been handled yet)
Similar logic above.
Write updated sheetArray to spreadsheet.
Write updated calEvents to calendar API (see note 1 below)
Run Code Online (Sandbox Code Playgroud)
笔记:
作为批量更新的替代方法,可以对calEvents进行所有更新,并将其立即更新为数组并写入日历API。尽管触摸lastUpdated值是一个好主意,但这将消除本地跟踪更改的需要。
您将CalendarEvent.getLastUpdated()在读取calEvent时使用,并将类似的值存储在电子表格中(与onEdit触发器绑定),以方便进行比较。
它将简化比较以CalendarEvent.getId()针对电子表格中的事件进行记录。您还CalendarEvent.setTag(key,value)可以使用它来将自定义元数据记录到日历中,例如,指示源自电子表格或已与电子表格同步的事件。(这些标记无法通过GCal UI访问,因此只能通过脚本访问。)
您应该考虑要处理的日期范围或事件数,并限制脚本的范围。否则,您一定会在实际操作中遇到执行时间限制。
某些日历事件特征无法在电子表格中轻松表达,例如: