Skip to content

Instantly share code, notes, and snippets.

@quad
Last active June 3, 2024 11:03
Show Gist options
  • Save quad/35577aaca8880f6245b929cadbda2fbf to your computer and use it in GitHub Desktop.
Save quad/35577aaca8880f6245b929cadbda2fbf to your computer and use it in GitHub Desktop.
Block out work calendar from personal calendar

Steps

  1. Create a new Apps Script project
  2. Copy-paste in Code.gs
    • Change srcId to the address for your source calendar
  3. Add Google Calendar API as a Service in the left sidebar
  4. Add a Trigger via the left sidebar:
    • Function to run: sync
    • Event source: time-driven, hour timer, every hour
    • Notify me of failures: daily
  5. Change timezone to UTC in Project Settings
function sync() {
const srcId = "you@example.com";
const syncWindowInDays = 7;
const now = new Date();
const startDate = new Date(now);
startDate.setDate(now.getDate() - syncWindowInDays);
const endDate = new Date(now);
endDate.setDate(now.getDate() + syncWindowInDays);
const sourceCal = CalendarApp.getCalendarById(srcId);
const destCal = CalendarApp.getDefaultCalendar();
const sourceEvents = new Map(
sourceCal
.getEvents(startDate, endDate)
.filter(e => !e.isAllDayEvent())
.map(e => [eventId(e), e])
);
const TAG_ID = "block.id";
const existingEvents = destCal.getEvents(startDate, endDate)
.map(e => [e.getTag(TAG_ID), e])
.filter(([id, _]) => id != null)
.reduce((acc, [id, e]) => {
if (!sourceEvents.has(id)) {
Logger.log("Deleting stale event: %s [id=%s]", e.getTitle(), id);
e.deleteEvent();
} else if (acc.has(id)) {
Logger.log("Deleting duplicate event: %s [id=%s]", e.getTitle(), id);
e.deleteEvent();
} else {
acc.set(id, e);
}
return acc;
}, new Map());
for (const [id, sourceEvent] of sourceEvents) {
let destEvent = existingEvents.get(id);
if (!destEvent) {
Logger.log("Creating new event: %s [id=%s]", sourceEvent.getTitle(), eventId(sourceEvent))
destEvent = destCal
.createEvent("Blocked", sourceEvent.getStartTime(), sourceEvent.getEndTime())
.setTag(TAG_ID, eventId(sourceEvent))
.setVisibility(CalendarApp.Visibility.PRIVATE)
.removeAllReminders();
}
if ((destEvent.getStartTime().valueOf() != sourceEvent.getStartTime().valueOf()) || (destEvent.getEndTime().valueOf() != sourceEvent.getEndTime().valueOf())) {
Logger.log("Correcting event: %s [sourceId=%s destId=%s]", sourceEvent.getTitle(), eventId(sourceEvent), eventId(destEvent))
destEvent.setTime(sourceEvent.getStartTime(), sourceEvent.getEndTime())
}
}
}
function eventId(event) {
if (event.isRecurringEvent()) {
return event.getId() + "-" + event.getStartTime().toISOString() + "-" + event.getEndTime().toISOString();
}
return event.getId();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment