進階日曆服務可讓您在 Apps Script 中使用公開的 Google Calendar API。這個 API 與 Apps Script 的內建日曆服務非常相似,可讓指令碼存取及修改使用者的 Google 日曆,包括使用者訂閱的其他日曆。在大多數情況下,內建服務較容易使用,但這項進階服務提供一些額外功能,包括設定個別事件的背景顏色。
參考資料
如需這項服務的詳細資訊,請參閱公開版 Google 日曆 API 的參考說明文件。與 Apps Script 中的所有進階服務一樣,進階日曆服務會使用與公開 API 相同的物件、方法和參數。詳情請參閱「如何決定方法簽章」。
/** * Creates an event in the user's default calendar. * @see https://developers.google.com/calendar/api/v3/reference/events/insert */functioncreateEvent(){constcalendarId='primary';conststart=getRelativeDate(1,12);constend=getRelativeDate(1,13);// event details for creating event.letevent={summary:'LunchMeeting',location:'TheDeli',description:'Todiscussourplansforthepresentationnextweek.',start:{dateTime:start.toISOString()},end:{dateTime:end.toISOString()},attendees:[{email:'gduser1@workspacesample.dev'},{email:'gduser2@workspacesample.dev'}],// Red background. Use Calendar.Colors.get() for the full list.colorId:11};try{// call method to insert/create new event in provided calandarevent=Calendar.Events.insert(event,calendarId);console.log('EventID:'+event.id);}catch(err){console.log('Failedwitherror%s',err.message);}}/** * Helper function to get a new Date object relative to the current date. * @param {number} daysOffset The number of days in the future for the new date. * @param {number} hour The hour of the day for the new date, in the time zone * of the script. * @return {Date} The new date. */functiongetRelativeDate(daysOffset,hour){constdate=newDate();date.setDate(date.getDate()+daysOffset);date.setHours(hour);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0);returndate;}
/** * Lists the calendars shown in the user's calendar list. * @see https://developers.google.com/calendar/api/v3/reference/calendarList/list */functionlistCalendars(){letcalendars;letpageToken;do{calendars=Calendar.CalendarList.list({maxResults:100,pageToken:pageToken});if(!calendars.items||calendars.items.length===0){console.log('Nocalendarsfound.');return;}// Print the calendar id and calendar summaryfor(constcalendarofcalendars.items){console.log('%s(ID:%s)',calendar.summary,calendar.id);}pageToken=calendars.nextPageToken;}while(pageToken);}
/** * Lists the next 10 upcoming events in the user's default calendar. * @see https://developers.google.com/calendar/api/v3/reference/events/list */functionlistNext10Events(){constcalendarId='primary';constnow=newDate();constevents=Calendar.Events.list(calendarId,{timeMin:now.toISOString(),singleEvents:true,orderBy:'startTime',maxResults:10});if(!events.items||events.items.length===0){console.log('Noeventsfound.');return;}for(consteventofevents.items){if(event.start.date){// All-day event.conststart=newDate(event.start.date);console.log('%s(%s)',event.summary,start.toLocaleDateString());continue;}conststart=newDate(event.start.dateTime);console.log('%s(%s)',event.summary,start.toLocaleString());}}
/** * Creates an event in the user's default calendar, waits 30 seconds, then * attempts to update the event's location, on the condition that the event * has not been changed since it was created. If the event is changed during * the 30-second wait, then the subsequent update will throw a 'Precondition * Failed' error. * * The conditional update is accomplished by setting the 'If-Match' header * to the etag of the new event when it was created. */functionconditionalUpdate(){constcalendarId='primary';conststart=getRelativeDate(1,12);constend=getRelativeDate(1,13);letevent={summary:'LunchMeeting',location:'TheDeli',description:'Todiscussourplansforthepresentationnextweek.',start:{dateTime:start.toISOString()},end:{dateTime:end.toISOString()},attendees:[{email:'gduser1@workspacesample.dev'},{email:'gduser2@workspacesample.dev'}],// Red background. Use Calendar.Colors.get() for the full list.colorId:11};event=Calendar.Events.insert(event,calendarId);console.log('EventID:'+event.getId());// Wait 30 seconds to see if the event has been updated outside this script.Utilities.sleep(30*1000);// Try to update the event, on the condition that the event state has not// changed since the event was created.event.location='TheCoffeeShop';try{event=Calendar.Events.update(event,calendarId,event.id,{},{'If-Match':event.etag});console.log('Successfullyupdatedevent:'+event.id);}catch(e){console.log('Fetchthrewanexception:'+e);}}
/** * Creates an event in the user's default calendar, then re-fetches the event * every second, on the condition that the event has changed since the last * fetch. * * The conditional fetch is accomplished by setting the 'If-None-Match' header * to the etag of the last known state of the event. */functionconditionalFetch(){constcalendarId='primary';conststart=getRelativeDate(1,12);constend=getRelativeDate(1,13);letevent={summary:'LunchMeeting',location:'TheDeli',description:'Todiscussourplansforthepresentationnextweek.',start:{dateTime:start.toISOString()},end:{dateTime:end.toISOString()},attendees:[{email:'gduser1@workspacesample.dev'},{email:'gduser2@workspacesample.dev'}],// Red background. Use Calendar.Colors.get() for the full list.colorId:11};try{// insert eventevent=Calendar.Events.insert(event,calendarId);console.log('EventID:'+event.getId());// Re-fetch the event each second, but only get a result if it has changed.for(leti=0;i < 30;i++){Utilities.sleep(1000);event=Calendar.Events.get(calendarId,event.id,{},{'If-None-Match':event.etag});console.log('Neweventdescription:'+event.start.dateTime);}}catch(e){console.log('Fetchthrewanexception:'+e);}}
/** * Retrieve and log events from the given calendar that have been modified * since the last sync. If the sync token is missing or invalid, log all * events from up to a month ago (a full sync). * * @param {string} calendarId The ID of the calender to retrieve events from. * @param {boolean} fullSync If true, throw out any existing sync token and * perform a full sync; if false, use the existing sync token if possible. */functionlogSyncedEvents(calendarId,fullSync){constproperties=PropertiesService.getUserProperties();constoptions={maxResults:100};constsyncToken=properties.getProperty('syncToken');if(syncToken && !fullSync){options.syncToken=syncToken;}else{// Sync events up to thirty days in the past.options.timeMin=getRelativeDate(-30,0).toISOString();}// Retrieve events one page at a time.letevents;letpageToken;do{try{options.pageToken=pageToken;events=Calendar.Events.list(calendarId,options);}catch(e){// Check to see if the sync token was invalidated by the server;// if so, perform a full sync instead.if(e.message==='Synctokenisnolongervalid,afullsyncisrequired.'){properties.deleteProperty('syncToken');logSyncedEvents(calendarId,true);return;}thrownewError(e.message);}if(events.items && events.items.length===0){console.log('Noeventsfound.');return;}for(consteventofevents.items){if(event.status==='cancelled'){console.log('Eventid%swascancelled.',event.id);return;}if(event.start.date){conststart=newDate(event.start.date);console.log('%s(%s)',event.summary,start.toLocaleDateString());return;}// Events that don't last all day; they have defined start times.conststart=newDate(event.start.dateTime);console.log('%s(%s)',event.summary,start.toLocaleString());}pageToken=events.nextPageToken;}while(pageToken);properties.setProperty('syncToken',events.nextSyncToken);}
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2024-12-21 (世界標準時間)。"],[[["The Advanced Calendar service in Apps Script allows you to access and modify Google Calendar data using the public Google Calendar API."],["It offers features beyond the built-in Calendar service, such as setting event background colors and using HTTP request headers for conditional updates and retrievals."],["Sample code snippets demonstrate various functionalities like creating, listing, and syncing calendar events, and conditionally modifying or retrieving specific events."],["Before using this advanced service, ensure it's enabled in your Apps Script project settings."],["Refer to the Google Calendar API reference documentation and support guide for detailed information and troubleshooting."]]],[]]