Skip to content

Instantly share code, notes, and snippets.

@fisherevans
Last active March 14, 2024 18:33
Show Gist options
  • Save fisherevans/1ebb5cc35c20a067fb560f4705a9d6f1 to your computer and use it in GitHub Desktop.
Save fisherevans/1ebb5cc35c20a067fb560f4705a9d6f1 to your computer and use it in GitHub Desktop.
Google App Script - Personal Calendar Sync
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