Skip to content

Instantly share code, notes, and snippets.

@pricco
Last active December 19, 2017 17:00
Show Gist options
  • Save pricco/fd8ae2c8af51a5f6370ed15df83578e4 to your computer and use it in GitHub Desktop.
Save pricco/fd8ae2c8af51a5f6370ed15df83578e4 to your computer and use it in GitHub Desktop.
Merge multiple google calendars (copy events from many sources into one calendar)
// 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(
[
"source1@group.calendar.google.com", // Calendar id
"source2@group.calendar.google.com",
"source3@group.calendar.google.com",
],
"target@group.calendar.google.com" // Use a new calendar as target
);
}
@pricco
Copy link
Author

pricco commented Dec 18, 2017

Create a trigger on the AppScript editor to run this function every hour.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment