我正在尝试创建一个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());
}
解决方法:
是的,可以编写一个双向事件同步脚本,但这并不简单.你提到的这两个帖子都有可以重复使用的部分,但与实际同步所面临的挑战相比,它们相当简单.您可能希望阅读超过Using Google Apps Script for a event booking system ,它会根据电子表格创建日历条目(但不会执行正在进行的同步).我过去做了一些debugging of that script.
同步需要支持:
>在任一地点创建活动
>在任一位置修改事件详细信息(尽管您可以选择仅考虑事件详细信息的子集以进行简化)
>删除任一位置的事件
>复发,例如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)
笔记:
>对calEvents的所有更新都可以立即生成,并立即写入日历API,作为批量更新的替代方案.这将消除在本地跟踪更改的需要,尽管触摸lastUpdated值是个好主意.
>在读取calEvents时,您将需要使用CalendarEvent.getLastUpdated(),并在电子表格中存储类似的值(与onEdit触发器相关联)以便于比较.
>它将简化比较以记录电子表格中的事件CalendarEvent.getId().您还可以使用CalendarEvent.setTag(键,值)将自定义元数据记录到日历中,例如指示源自或已与电子表格同步的事件. (这些标签无法通过GCal UI访问,因此只能通过脚本访问.)
>您应该考虑要处理的日期范围或事件数量,并限制脚本的范围.如果不这样做,您肯定会在实际操作中遇到执行时间限制.
>某些日历事件特征不适合在电子表格中轻松表达,例如:
>嘉宾名单
>提醒清单