-
-
Save ttrahan/a88febc0538315b05346f4e3b35997f2 to your computer and use it in GitHub Desktop.
| function sync() { | |
| var id="XXXXXXXXXX"; // CHANGE - id of the secondary calendar to pull events from | |
| var today=new Date(); | |
| var enddate=new Date(); | |
| enddate.setDate(today.getDate()+7); // how many days in advance to monitor and block off time | |
| var secondaryCal=CalendarApp.getCalendarById(id); | |
| var secondaryEvents=secondaryCal.getEvents(today,enddate); | |
| var primaryCal=CalendarApp.getDefaultCalendar(); | |
| var primaryEvents=primaryCal.getEvents(today,enddate); // all primary calendar events | |
| var primaryEventTitle="Personal appt"; // update this to the text you'd like to appear in the new events created in primary calendar | |
| var stat=1; | |
| var evi, existingEvent; | |
| var primaryEventsFiltered = []; // to contain primary calendar events that were previously created from secondary calendar | |
| var primaryEventsUpdated = []; // to contain primary calendar events that were updated from secondary calendar | |
| var primaryEventsCreated = []; // to contain primary calendar events that were created from secondary calendar | |
| var primaryEventsDeleted = []; // to contain primary calendar events previously created that have been deleted from secondary calendar | |
| Logger.log('Number of primaryEvents: ' + primaryEvents.length); | |
| Logger.log('Number of secondaryEvents: ' + secondaryEvents.length); | |
| // create filtered list of existing primary calendar events that were previously created from the secondary calendar | |
| for (pev in primaryEvents) | |
| { | |
| var pEvent = primaryEvents[pev]; | |
| if (pEvent.getTitle() == primaryEventTitle) | |
| { primaryEventsFiltered.push(pEvent); } | |
| } | |
| // process all events in secondary calendar | |
| for (sev in secondaryEvents) | |
| { | |
| stat=1; | |
| evi=secondaryEvents[sev]; | |
| // if the secondary event has already been blocked in the primary calendar, update it | |
| for (existingEvent in primaryEventsFiltered) | |
| { | |
| var pEvent = primaryEventsFiltered[existingEvent]; | |
| var secondaryTitle = evi.getTitle(); | |
| var secondaryDesc = evi.getDescription(); | |
| if ((pEvent.getStartTime().getTime()==evi.getStartTime().getTime()) && (pEvent.getEndTime().getTime()==evi.getEndTime().getTime())) | |
| { | |
| stat=0; | |
| pEvent.setTitle(primaryEventTitle); | |
| pEvent.setDescription(secondaryTitle + '\n\n' + secondaryDesc); | |
| // event.setDescription(evi.getTitle() + '\n\n' + evi.getDescription()); | |
| pEvent.setVisibility(CalendarApp.Visibility.PRIVATE); // set blocked time as private appointments in work calendar | |
| primaryEventsUpdated.push(pEvent.getId()); | |
| Logger.log('PRIMARY EVENT UPDATED' | |
| + '\nprimaryId: ' + pEvent.getId() + ' \nprimaryTitle: ' + pEvent.getTitle() + ' \nprimaryDesc: ' + pEvent.getDescription()); | |
| } | |
| } | |
| if (stat==0) continue; | |
| var d = evi.getStartTime(); | |
| var n = d.getDay(); | |
| if (evi.isAllDayEvent()) | |
| { | |
| continue; // Do nothing if the event is an all-day or multi-day event. This script only syncs hour-based events | |
| } | |
| else if (n==1 || n==2 || n==3 || n==4 || n==5) // skip weekends. Delete this if you want to include weekends | |
| // if the secondary event does not exist in the primary calendar, create it | |
| { | |
| var newEvent = primaryCal.createEvent(primaryEventTitle,evi.getStartTime(),evi.getEndTime()); // change the Booked text to whatever you would like your merged event titles to be | |
| // alternative version below that copies the exact secondary event information into the primary calendar event | |
| // var newEvent = primaryCal.createEvent(evi.getTitle(),evi.getStartTime(),evi.getEndTime(), {location: evi.getLocation(), description: evi.getDescription()}); | |
| newEvent.setDescription(evi.getTitle() + '\n\n' + evi.getDescription()); | |
| newEvent.setVisibility(CalendarApp.Visibility.PRIVATE); // set blocked time as private appointments in work calendar | |
| newEvent.removeAllReminders(); // so you don't get double notifications. Delete this if you want to keep the default reminders for your newly created primary calendar events | |
| primaryEventsCreated.push(newEvent.getId()); | |
| Logger.log('PRIMARY EVENT CREATED' | |
| + '\nprimaryId: ' + newEvent.getId() + '\nprimaryTitle: ' + newEvent.getTitle() + '\nprimaryDesc ' + newEvent.getDescription() + '\n'); | |
| } | |
| } | |
| // if a primary event previously created no longer exists in the secondary calendar, delete it | |
| for (pev in primaryEventsFiltered) | |
| { | |
| var pevIsUpdatedIndex = primaryEventsUpdated.indexOf(primaryEventsFiltered[pev].getId()); | |
| if (pevIsUpdatedIndex == -1) | |
| { | |
| var pevIdToDelete = primaryEventsFiltered[pev].getId(); | |
| Logger.log(pevIdToDelete + ' deleted'); | |
| primaryEventsDeleted.push(pevIdToDelete); | |
| primaryEventsFiltered[pev].deleteEvent(); | |
| } | |
| } | |
| Logger.log('Primary events previously created: ' + primaryEventsFiltered.length); | |
| Logger.log('Primary events updated: ' + primaryEventsUpdated.length); | |
| Logger.log('Primary events deleted: ' + primaryEventsDeleted.length); | |
| Logger.log('Primary events created: ' + primaryEventsCreated.length); | |
| } |
I have updated this script to also make it much more efficient (helping the planet just a little), and configurable.
Is there a way to alter this to include multi-day events? (for example, personal holidays)
Additionally is there a way to omit the personal events title and notes from being synced to the "busy" event?
Hi there. Thanks for this. a few questions:
1 - when i set the trigger to "sync", it creates double events. when i set it to hourly update it does not. is there any way to get it working wtih sync trigger without the double events?
2 - i'd like it to only create primary calendar events that occur after 9am on weekdays. is there any way to adjust it for this?
3 - I'd like it to be able to create primary calendar events of all day events. is there a way to enable all day events? thanks so much!
Hello! I did a tiny patch to add support for multiple secondary calendars. Feel free to ignore it. https://gist.github.com/vaurora/a6deb299574b3c23652d776915025b9e