Rows become Calendar events and Calendar edits come back to the sheet, with no monthly limit, automatic sync, guests and one calendar per row.
What you need
- A Google account with Google Sheets and Google Calendar, on a computer for the first sync.
- About 3 minutes. No coding. No other accounts.
5-minute setup
With Make a copy it takes about 3 minutes.
- Click Make a copy on the product page (or the copy link in your receipt). Google makes your own copy of the sheet, with the script already inside.
- In your copy, click the Calendar Sync menu at the top (it appears a few seconds after the sheet opens), then Start here.
- Google asks for permission once. Click Continue, pick your account, click Advanced, then Go to Sheet Calendar Sync (unsafe), then Allow. It says unverified because the script lives in your own copy. The Start here tab and Calendar Sync > Permissions: what and why explain each permission.
- In the sidebar click Try it with sample rows, then Preview, then Sync now. Open Google Calendar to see the [Sample] events. Delete the [Sample] rows and sync again to remove them.
- Type your own rows in the Events tab.
- Paste the licence key from your receipt in the sidebar under Pro licence and click Unlock Pro. (The pasted-script way below has Pro built in; no key needed.)
If you clicked Cancel, nothing changed: use the menu again and Google asks again. On a phone the menu and sidebar are not available (a Google limit); edit rows on your phone and sync from a computer.
Other way: paste the script into a sheet you already have
- Open your sheet. Click Extensions > Apps Script.
- Delete the code you see. For each file in the
addonfolder, add a file with the same name and paste the text in. Use + > Script for.gsfiles and + > HTML forSidebar.html. - Click Project Settings (the gear). Tick Show "appsscript.json" manifest file. Paste our
appsscript.jsonover it. - Click Services +, pick Google Calendar API, and click Add.
- Click Save. Go back to your sheet, reload it and use Calendar Sync > Set up sheet. A sample is in
samples/events-sample.csv.
Columns it reads: Title, Start, End, All day, Location, Description, Time zone, Calendar, Guests. Only Title and Start are needed.
- A date with no time makes an all-day event. An End date makes it run over several days.
- Times use the sheet's time zone (File > Settings). Put a zone like America/New_York in Time zone to change one row.
- Type cancel in Status to delete that event. Type skip to leave a row alone.
How it works
- Two-way. Edit a row and the event changes. Edit the event in Calendar and the row changes. If both changed, the sheet wins (you can switch this in Settings).
- No duplicates. Each row gets an Event ID before the event is made, so a re-run or a crash never makes a second copy. A copied row gets its own new event.
- Deleted rows. If you delete a row, its event is deleted on the next sync (or kept, if you choose that). If more than 20 would go at once, it stops and asks first.
- Checks. Impossible dates, end before start, unknown time zones and times that do not exist on a clock-change night are flagged in Sync note. Nothing is sent for those rows.
- Limits. If Google says "slow down", it waits 1, 2, 4, 8 and 16 seconds and tries again. If Google's daily limit is hit, it stops and carries on next run.
- Undo. Undo last sync puts back what the last sync changed.
- Wrong calendar or no access. A mistyped Calendar ID, or a calendar you can only view, gives one clear message before anything is written.
- Help and updates. Calendar Sync > Get help opens the help page. The sidebar shows a notice when a newer version exists (it reads one small public file; nothing about you is sent).
- Pro. No monthly limit. Automatic sync every 1, 6 or 24 hours (sidebar > Settings). A Calendar column sends a row to any calendar you can edit. A Guests column adds invitees; Google does not email them.
Test it yourself
With Node.js 18 or newer: node tests/run_tests.js. Optional browser check of the sidebar (keyboard, 300px and phone widths): node tests/sidebar_browser.mjs (needs Playwright; it skips otherwise). It runs the real add-on code against stand-ins for Sheets, Calendar and settings. No Google login. It should print 137/137 checks passed.
AI disclosure and limits
- No AI is used. The add-on is plain code that runs in your Google account.
- Recurring events made in Calendar sync as their first date only. Repeat rules are not written from the sheet.
- It does not send invitations or emails.
- Google's own limits apply (events per day, runs of up to 6 minutes). Long sheets may need two runs.
- Not tested on a live Google account yet: the tests use stand-ins for Google's services.
Privacy
Your sheet and calendar data stay in your Google account. The add-on can only see the spreadsheet it is in and your calendar events. It does not read Gmail or Drive. The only outside call is the licence check, made by your browser when you type a key; it sends the key and the product name, nothing else.
Support is self-serve: this README, TROUBLESHOOTING.md and versioned updates. See SUPPORT.md.