Skip to content

Instantly share code, notes, and snippets.

@shayelkin
Created January 22, 2026 04:56
Show Gist options
  • Select an option

  • Save shayelkin/89b55c0660d71f2526beb37f15fb0804 to your computer and use it in GitHub Desktop.

Select an option

Save shayelkin/89b55c0660d71f2526beb37f15fb0804 to your computer and use it in GitHub Desktop.
Google Apps Scripts: Calendar Utils
function colorBy(calId, colorRules) {
const cal = CalendarApp.getCalendarById(calId);
const startDate = new Date(); // now
const endDate = new Date();
endDate.setMonth(endDate.getMonth()+1);
const events = cal.getEvents(startDate, endDate);
for (const [ftype, param, color] of colorRules) {
let filtered = [];
switch (ftype) {
case 'guest':
filtered = events.filter(event => event.getGuestByEmail(param));
break;
case 'title':
filtered = events.filter(event => event.getTitle() == param);
break;
}
for (event of filtered) {
Logger.log(`Coloring ${event.getTitle()} ${color}`)
event.setColor(color);
}
}
}
function blockFrom(srcCalId, dstCalId, eventsFilter=function(e) { return true; }) {
const BLOCKED_FROM_KEY = 'X-Blocked-From';
const srcCal = CalendarApp.getCalendarById(srcCalId);
const dstCal = CalendarApp.getCalendarById(dstCalId);
const startDate = new Date(); // now
const endDate = new Date();
endDate.setMonth(endDate.getMonth()+1);
const srcEventsById = new Map(srcCal.getEvents(startDate, endDate).filter(eventsFilter).map(event => [event.getId(), event]));
const dstEventsBySrcId = new Map(dstCal.getEvents(startDate, endDate).filter(event => event.getTag(BLOCKED_FROM_KEY))
.map(event => [event.getTag(BLOCKED_FROM_KEY), event]));
// Delete events that can't be found in the source
const deleted = [...dstEventsBySrcId].
flatMap(([srcEventId, event]) => srcEventsById.has(srcEventId) ? [] : event);
for (event of deleted) {
Logger.log(`Deleting: ${event.getTitle}`, event);
try {
event.deleteEvent()
} catch (error) {
Logger.log(`Error when deleting: ${error}`);
}
}
// Add or update events
for ([eventId, event] of [...srcEventsById]) {
const existingDstEvent = dstEventsBySrcId.get(eventId);
try {
if (existingDstEvent === undefined) {
Logger.log(`Blocking: ${event.getStartTime()} - ${event.getEndTime()}`)
dstCal.createEvent('busy', event.getStartTime(), event.getEndTime())
.setTag(BLOCKED_FROM_KEY, event.getId())
.setColor(CalendarApp.EventColor.BLUE)
.removeAllReminders();
continue;
}
// The only property we care about updating is the time, every other property is fixed
Logger.log(`Updating: ${existingDstEvent.getStartTime()} -> ${event.getStartTime()} - ${existingDstEvent.getEndTime()} -> ${event.getEndTime()}`)
existingDstEvent.setTime(event.getStartTime(), event.getEndTime());
} catch (error) {
Logger.log(`Error when updating ${event.getTitle()}: ${error}`);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment