Last active
March 14, 2024 18:33
-
-
Save fisherevans/1ebb5cc35c20a067fb560f4705a9d6f1 to your computer and use it in GitHub Desktop.
Google App Script - Personal Calendar Sync
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function sync() { | |
var secondaryCalIds = []; | |
secondaryCalIds.push("[email protected]"); | |
secondaryCalIds.push("[email protected]"); | |
var primaryEventTitle = "Personal Appointment"; | |
var eventBufferMinutes = 20; | |
var eventBufferMs = eventBufferMinutes * 60 * 1000; | |
var visiblity = CalendarApp.Visibility.PUBLIC; | |
var color = CalendarApp.EventColor.YELLOW; | |
var today = new Date(); | |
var endDate = new Date(); | |
endDate.setDate(today.getDate() + 28); // how many days in advance to monitor and block off time | |
var secondaryEvents = []; | |
for (cid in secondaryCalIds) { | |
var secondaryCal = CalendarApp.getCalendarById(secondaryCalIds[cid]); | |
var srcEvents = secondaryCal.getEvents(today, endDate) | |
var secondaryEvents = secondaryEvents.concat(srcEvents); | |
Logger.log('Number of source events: ' + srcEvents.length + ' (' + secondaryCalIds[cid] + ')'); | |
} | |
// create filtered list of existing primary calendar events that were previously created from the secondary calendar | |
var primaryCal = CalendarApp.getDefaultCalendar(); | |
var primaryEventsAll = primaryCal.getEvents(today, endDate); // all primary calendar events | |
var primaryEvents = []; // to contain primary calendar events that were previously created from secondary calendar | |
for (pev in primaryEventsAll) { | |
var primaryEvent = primaryEventsAll[pev]; | |
if (primaryEvent.getTitle() == primaryEventTitle) { | |
primaryEvents.push(primaryEvent); | |
} | |
} | |
Logger.log('Total number of target events: ' + primaryEventsAll.length); | |
Logger.log('Number of managed target events: ' + primaryEvents.length); | |
// process all events in secondary calendar | |
var statsCreated = 0, statsDeleted = 0; | |
var updatedPrimaryEventIds = []; // to contain primary calendar events that were updated from secondary calendar | |
for (sev in secondaryEvents) { | |
secondaryEvent = secondaryEvents[sev]; | |
// include buffer around personal appoint (i.e. travel time) | |
var secondaryStart = new Date(secondaryEvent.getStartTime().getTime() - eventBufferMs); | |
var secondaryEnd = new Date(secondaryEvent.getEndTime().getTime() + eventBufferMs); | |
// if the secondary event has already been blocked in the primary calendar, update it | |
updated = false; | |
for (existingId in primaryEvents) { | |
var primaryEvent = primaryEvents[existingId]; | |
if ((primaryEvent.getStartTime().getTime() == secondaryStart.getTime()) && (primaryEvent.getEndTime().getTime() == secondaryEnd.getTime())) { | |
primaryEvent.setDescription(secondaryEvent.getTitle() + '\n\n' + secondaryEvent.getDescription()); | |
primaryEvent.setVisibility(visiblity); | |
primaryEvent.setColor(color); | |
updatedPrimaryEventIds.push(primaryEvent.getId()); | |
Logger.log('EVENT UPDATED - id: ' + primaryEvent.getId() + ' (' + secondaryEvent.getTitle() + ')'); | |
updated = true; | |
break; | |
} | |
} | |
if(updated) { | |
continue; | |
} | |
// skip all day, multi-day, or weekend events | |
var startDay = secondaryEvent.getStartTime().getDay(); | |
var endDay = secondaryEvent.getEndTime().getDay(); | |
if(secondaryEvent.isAllDayEvent() /*|| startDay != endDay */|| startDay == 0 || startDay == 6) { | |
continue; | |
} | |
// create a new event based on the secondary event | |
var newEvent = primaryCal.createEvent(primaryEventTitle, secondaryStart, secondaryEnd, {description:secondaryEvent.getTitle() + '\n\n' + secondaryEvent.getDescription()}); | |
newEvent.setVisibility(visiblity); | |
newEvent.setColor(color); | |
newEvent.removeAllReminders(); | |
statsCreated = statsCreated + 1; | |
Logger.log('EVENT CREATED - id: ' + newEvent.getId() + ' (' + secondaryEvent.getTitle() + ')'); | |
} | |
// if a primary event previously created no longer exists in the secondary calendar, delete it | |
for (pev in primaryEvents) { | |
if (updatedPrimaryEventIds.indexOf(primaryEvents[pev].getId()) == -1) { | |
var pevIdToDelete = primaryEvents[pev].getId(); | |
Logger.log(pevIdToDelete + ' deleted'); | |
Logger.log('EVENT DELETED - id: ' + pevIdToDelete + ''); | |
statsDeleted = statsDeleted + 1; | |
} | |
} | |
Logger.log('Events created: ' + statsCreated); | |
Logger.log('Events updated: ' + updatedPrimaryEventIds.length); | |
Logger.log('Events deleted: ' + statsDeleted); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment