Created
January 22, 2026 04:56
-
-
Save shayelkin/89b55c0660d71f2526beb37f15fb0804 to your computer and use it in GitHub Desktop.
Google Apps Scripts: Calendar Utils
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 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