2 回答

TA貢獻2051條經驗 獲得超10個贊
這與兩天前提出的問題非常相似,該問題涉及將事件電子表格與日歷同步。聽起來您好像想將電子表格視為它所引發的事件的主控者,這將大大簡化問題。該答案涵蓋了您需要做的基本工作。如果您只想修改現有代碼,則下面有一個實現。
我有來自此Blog的代碼的修改版本,該版本將修改預先存在的日歷條目以匹配電子表格中的信息。我對電子表格的排列方式有所不同,這反映在代碼中。
日期| 標題| 開始時間 結束時間| 位置| 描述 事件ID
創建新事件時,腳本會填充事件ID列,然后在以后的調用中使用該事件ID列從日歷中檢索事件,從而避免重復。
腳本
/**
* Adds a custom menu to the active spreadsheet, containing a single menu item
* for invoking the exportEvents() function.
* The onOpen() function, when defined, is automatically invoked whenever the
* spreadsheet is opened.
* For more information on using the Spreadsheet API, see
* https://developers.google.com/apps-script/service_spreadsheet
*/
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Export Events",
functionName : "exportEvents"
}];
sheet.addMenu("Calendar Actions", entries);
};
/**
* Export events from spreadsheet to calendar
*/
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 = "YOUR_CALENDAR_ID";
var cal = CalendarApp.getCalendarById(calId);
for (i=0; i<data.length; i++) {
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 tstart = new Date(row[2]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[3]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var loc = row[4];
var desc = row[5];
var id = row[6]; // 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) {
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(title);
event.setDescription(desc);
event.setLocation(loc);
// event.setTime(tstart, tstop); // cannot setTime on eventSeries.
// ... but we CAN set recurrence!
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}
刪除/重新創建
在此替代方案中,eventID用于查找和刪除先前存在的事件。之后,將使用電子表格中的數據創建一個新事件。這樣的好處是可以更新事件的所有值,包括開始和停止時間(請參見下面的注釋)。另一方面,對原始事件所做的任何更改都將丟失-例如,如果邀請了其他人參加該事件,或者添加了自定義提醒。
要使用此替代方法,只需將匹配的代碼替換為:
// Check if event already exists, delete it if it does
try {
var event = cal.getEventSeriesById(id);
event.deleteEventSeries();
row[6] = ''; // Remove event ID
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent; // Update the data array with event ID
debugger;
筆記
getEventSeriesById錯誤的文檔指出,null如果沒有找到匹配的事件,它將返回,而拋出異常。(討厭?。┮虼?,我將其封裝在try / catch塊中,以繼續游泳。
不幸的是,當getEventSeriesById檢索事件時,它returns是一個EventSeries不支持該setTime()方法的對象。如果您不希望更改事件的時間,則可以。否則,您可以通過設置重復規則和時間將更Event改為,或者刪除舊事件并創建一個新事件,如Delete / Recreate所示。問題1154。EventSeries
電子表格總是贏。通過Google日歷記錄的任何事件更改(在相關字段中)都會被腳本覆蓋。
- 2 回答
- 0 關注
- 703 瀏覽
添加回答
舉報