A lightweight, stateless Google Apps Script that automatically mirrors your personal calendar events as private holds on your work calendar.
1
stars
15
commits
JavaScript
primary language
Sep 3, 2026
updated
A Google Apps Script that mirrors your personal calendar as [DNS] External Appointment holds on your work calendar, so colleagues see that you are busy without seeing why.
workHoldId, a private extended property), so tools that only see your personal calendar can tell holds from real conflicts. Optional.tagPersonalEvents off. Free/busy is not enough.Code.js into it.CONFIG at the top: your personal calendar address(es), work hours, and anything else you want changed.+ in the sidebar).install from the function dropdown and grant the permissions it asks for (Advanced › Go to project).Each run logs what it created, updated, and removed under Executions.
CONFIG and save. The next run applies it to existing holds.workHoldId is present while the event has a hold within the 28-day window and cleared once it needs none. A recurring event carries it on the series, so every occurrence shows it.uninstall, take it out of CONFIG, then run install. Holds are looked up by calendar, so its holds would otherwise stay.Code.js and run install once. It rebuilds the holds.uninstall. It removes the trigger and every hold.node --test runs Code.js against in-memory stand-ins for the Calendar API. Node 20 or newer, no dependencies.
JavaScript
100.0%
A lightweight, stateless Google Apps Script that automatically mirrors your personal calendar events as private holds on your work calendar.
1
stars
15
commits
JavaScript
primary language
Sep 3, 2026
updated
A Google Apps Script that mirrors your personal calendar as [DNS] External Appointment holds on your work calendar, so colleagues see that you are busy without seeing why.
workHoldId, a private extended property), so tools that only see your personal calendar can tell holds from real conflicts. Optional.tagPersonalEvents off. Free/busy is not enough.Code.js into it.CONFIG at the top: your personal calendar address(es), work hours, and anything else you want changed.+ in the sidebar).install from the function dropdown and grant the permissions it asks for (Advanced › Go to project).Each run logs what it created, updated, and removed under Executions.
CONFIG and save. The next run applies it to existing holds.workHoldId is present while the event has a hold within the 28-day window and cleared once it needs none. A recurring event carries it on the series, so every occurrence shows it.uninstall, take it out of CONFIG, then run install. Holds are looked up by calendar, so its holds would otherwise stay.Code.js and run install once. It rebuilds the holds.uninstall. It removes the trigger and every hold.node --test runs Code.js against in-memory stand-ins for the Calendar API. Node 20 or newer, no dependencies.
JavaScript
100.0%