Last active
December 19, 2017 17:00
-
-
Save pricco/fd8ae2c8af51a5f6370ed15df83578e4 to your computer and use it in GitHub Desktop.
Merge multiple google calendars (copy events from many sources into one calendar)
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
// Reference: https://developers.google.com/apps-script/reference/calendar/calendar-app | |
function sync(sources, target) { | |
var start = new Date((new Date()).getTime() - 10 * 3600000 * 24); | |
var end = new Date((new Date()).getTime() + 120 * 3600000 * 24); | |
var targetCalendar = CalendarApp.getCalendarById(target); | |
if (!targetCalendar) { | |
return; | |
} | |
var targetEvents = targetCalendar.getEvents(start, end); | |
for (var sourceIndex=0; sourceIndex<sources.length; sourceIndex++) { | |
var source = sources[sourceIndex]; | |
// Clean deleted events | |
var clean = function (targetEvents) { | |
for (var i=0; i<targetEvents.length;) { | |
if ((targetEvents[i].getTag('original') || '').indexOf(source) == 0) { | |
targetEvents[i].deleteEvent(); | |
targetEvents.splice(i, 1); | |
} else { | |
i++; | |
} | |
} | |
}; | |
var sourceCalendar = CalendarApp.getCalendarById(source); | |
if (!sourceCalendar) { | |
clean(targetEvents); | |
return; | |
} | |
// clean(); | |
// Create or update events... | |
var sourceEvents = sourceCalendar.getEvents(start, end); | |
for (var sourceEventIndex=0; sourceEventIndex<sourceEvents.length; sourceEventIndex++) { | |
var sourceEvent = sourceEvents[sourceEventIndex]; | |
var original = sourceCalendar.getId() + "::" + sourceEvent.getId(); | |
var targetEvent = null; | |
for (var i=0; i<targetEvents.length; i++) { | |
if (targetEvents[i].getTag('original') == original) { | |
targetEvent = targetEvents[i]; | |
targetEvents.splice(i, 1); | |
break; | |
} | |
} | |
if (!targetEvent) { | |
if (sourceEvent.isAllDayEvent()) { | |
targetEvent = targetCalendar.createAllDayEvent(sourceEvent.getTitle(), sourceEvent.getStartTime(), sourceEvent.getEndTime()); | |
} else { | |
targetEvent = targetCalendar.createEvent(sourceEvent.getTitle(), sourceEvent.getStartTime(), sourceEvent.getEndTime()); | |
} | |
targetEvent.setTag('original', original); | |
} | |
if (sourceEvent.getTitle() != targetEvent.getTitle()) { | |
targetEvent.setTitle(sourceEvent.getTitle()); | |
} | |
if (sourceEvent.isAllDayEvent() != targetEvent.isAllDayEvent() || | |
sourceEvent.getStartTime().valueOf() != targetEvent.getStartTime().valueOf() || | |
sourceEvent.getEndTime().valueOf() != targetEvent.getEndTime().valueOf()) { | |
if (sourceEvent.isAllDayEvent()) { | |
targetEvent.setAllDayDate(sourceEvent.getStartTime()); | |
} else { | |
targetEvent.setTime(sourceEvent.getStartTime(), sourceEvent.getEndTime()) | |
} | |
} | |
if (sourceEvent.getDescription() != targetEvent.getDescription()) { | |
targetEvent.setDescription(sourceEvent.getDescription()); | |
} | |
}; | |
// Remove deleted events | |
clean(targetEvents); | |
}; | |
// Delete orphans... | |
for (var i=0; i<targetEvents.length; i++) { | |
targetEvents[i].deleteEvent(); | |
} | |
} | |
function syncTeam() { | |
sync( | |
[ | |
"[email protected]", // Calendar id | |
"[email protected]", | |
"[email protected]", | |
], | |
"[email protected]" // Use a new calendar as target | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Create a trigger on the AppScript editor to run this function every hour.