How to add events from Google Sheets to Google Calendar (and keep them in sync)
By Caner Kaya, Kayabyte
Google Calendar has no setting that links it to a spreadsheet. There are three free ways to get rows from Google Sheets into Calendar:
- Import a CSV file. Good for a one-off schedule. The events don’t change when you edit the sheet later.
- A short Apps Script. Free and re-runnable, as long as the script stores each event’s ID in the sheet.
- An automation tool such as Zapier or Make. Good at creating an event when a row is added. Updates and deletes take extra work.
All three can create events. Where they differ is what happens when a row changes, when a row is deleted, and when you run them twice. Below is each one step by step.
How do I import events from a spreadsheet into Google Calendar?
Google Calendar can import a CSV file. Google describes it in Import events to Google Calendar.
- Give your sheet these column headers, in English and spelled exactly like this: Subject and Start Date are required. Start Time, End Date, End Time, All Day Event, Description, Location and Private are optional.
- Fill in one event per row. Google’s examples use dates like 05/30/2020 and times like 10:00 AM. All Day Event and Private take True or False.
- In Google Sheets, choose File > Download > Comma Separated Values (.csv).
- Open Google Calendar on a computer. Importing isn’t possible in the mobile app.
- Click Settings, then Import & export.
- Choose your CSV file, pick the calendar to add the events to, and click Import. Without a choice, events go into your primary calendar.
Things to know before you rely on it:
- It’s a one-time copy. Google says imported events “don’t stay in sync”. Editing the sheet afterwards changes nothing in Calendar.
- The CSV format has no column for guests, and Google says guests and conference data aren’t imported.
- Repeating events in a CSV come in as a series of one-time events.
- Google’s article doesn’t mention any check for duplicates, and the CSV has no event ID column. Treat every import as adding new events, so importing the same file twice gives you two of each.
Tip: import into a calendar of its own. Next to Other calendars, click Add other calendars > Create new calendar (Google’s steps). If the import goes wrong, you can delete that calendar and start again instead of removing events one by one.
How do I add events from Google Sheets with Apps Script?
Apps Script is free and built into Google Sheets. A script can read your rows and create events with CalendarApp. The important part is to write each event’s ID back into the sheet. Without that, every run creates the same events again.
- Make a sheet with Title in column A, Start in B, End in C and an empty Event ID in D. Start and End must be real date-and-time cells, not text.
- Choose Extensions > Apps Script (Google’s guide).
- Replace the code with this, save, and click Run. The first time, Google asks you to authorize the script.
function syncToCalendar() {
const sheet = SpreadsheetApp.getActiveSheet();
const rows = sheet.getDataRange().getValues();
const calendar = CalendarApp.getDefaultCalendar();
for (let i = 1; i < rows.length; i++) { // row 1 holds the headers
const [title, start, end, eventId] = rows[i];
if (!title || !(start instanceof Date) || !(end instanceof Date)) continue;
const event = eventId ? calendar.getEventById(eventId) : null;
if (event) {
event.setTitle(title);
event.setTime(start, end);
} else {
const created = calendar.createEvent(title, start, end);
sheet.getRange(i + 1, 4).setValue(created.getId());
}
}
}Run it again after you change a row and the same event is updated, because the script finds it by the stored ID (getEventById returns null if the event doesn’t exist or you can’t access it, and then the script creates a new one). To run it on a schedule, open Triggers in the Apps Script editor, click Add Trigger and choose a time-driven trigger (Google’s guide).
What this script doesn’t do:
- Deletes. Deleting a row leaves its event in Calendar. Deleting the event in Calendar doesn’t touch the row.
- Changes made in Calendar. If someone moves the event in Calendar, the next run moves it back to the time in the sheet.
- Guests, location, description, colour or all-day events. CalendarApp can do these (createEvent options include description, location, guests and sendInvites), but you have to add them.
- Large sheets. Google lists the quotas in Quotas for Google Services: a script can run for 6 minutes per execution, and you can create 5,000 calendar events a day on a personal account or 10,000 on Google Workspace. Time-driven triggers get 90 minutes of total run time a day on a personal account and 6 hours on Workspace. Google adds that quotas can change without notice. A long sheet needs code that stops and carries on in the next run.
Also note that CalendarApp needs full access to your calendars (the calendar scope in Google’s reference), so the consent screen asks for access to all the calendars you can use. That’s fine for your own script, but read the screen before you allow it.
Google’s own conference sign-up sample uses the same idea: it creates one event per row and saves the event ID in the sheet. It’s built for a one-time setup, though, not for re-running.
Can Zapier or Make sync Google Sheets with Google Calendar?
Yes, for new rows. Tools like Zapier and Make watch a sheet and run an action when something changes. A typical setup is “when a new row is added, create a Google Calendar event”. Zapier’s Google Sheets and Google Calendar integration, for example, has triggers for new and updated rows and actions to create, update, find and delete events (Zapier’s integration page).
Where it gets harder:
- Updates. To update an event when its row changes, the automation has to know which event belongs to the row. That usually means a second step that writes the event ID back into the sheet, plus a separate “updated row” automation that looks it up.
- Deletes. Zapier has no trigger for a deleted row. The usual workaround is a Status column you set to “Delete” instead of deleting the row.
- Duplicates. If an “updated row” trigger fires on a row that has no stored event ID yet, it creates a second event. Zapier also notes that deleting rows can interfere with how it tracks which rows it has already processed, and that new rows only trigger when added at the bottom of the sheet (Zapier help).
- Cost. Zapier counts each successful action as a task (how tasks are counted), so a sheet with hundreds of rows, each creating and later updating an event, uses tasks quickly.
Where the built-in options stop
None of the free routes gives you all of this at once:
- Updating the same event when a row changes, without duplicates. CSV import can’t. A script or automation can, only if it stores the event ID.
- Removing events when a row is cancelled.
- Bringing changes made in Calendar back into the sheet.
- Handling hundreds of rows within the Apps Script time limits.
- Guests, colours and calendars per row without writing more code.
Free workarounds worth trying first
- One-off schedule? Use the CSV import into a calendar of its own. It’s the quickest route and there’s nothing to maintain.
- Small, stable list? Use the script above. Add a Status column and a line that calls
event.deleteEvent()when it says “Cancel”, and you’ve covered deletes too. - Events added one at a time from a form or another app? An automation tool’s “new row” trigger is a good fit, as long as you don’t need updates.
An add-on that keeps rows and events in sync
Full disclosure: I built Kayabyte Calendar Sync & Timesheets, an add-on for Google Sheets™ that turns rows into Google Calendar™ events.
- Add Title and Start columns (End, Duration, All day, Location, Description, Guests, Calendar, Colour and Status are optional) and click Sync to Calendar.
- Each row gets an Event ID and a Sync status. Run it again after you edit rows and the same events are updated, not duplicated.
- Write Cancel or Delete in the Status column to remove the event from Calendar.
- If an event is deleted in Calendar, the row is marked “Deleted in Calendar” and isn’t created again.
- It can also import events from a calendar into a sheet, and re-importing refreshes the same rows.
- It only changes events it created from the same spreadsheet, and guests are only emailed if you switch that on.
What it doesn’t do: on the free plan you sync by hand, up to 100 rows or events per run, and changes made in Calendar don’t come back into the sheet. Two-way sync, hourly automatic sync and timesheets are part of Pro ($5 per user per month, with a 14-day free trial). Each run stops before the Apps Script time limit, so a very long sheet takes more than one run. It works in Google Sheets only, not Excel.
It’s on the Google Workspace™ Marketplace.
FAQ
Does Google Calendar sync with Google Sheets automatically? No. There’s no built-in link. Imported events are a one-time copy, so you need a script, an automation tool or an add-on to keep them in step.
Why do I get duplicate events every time I run my script? The script doesn’t remember which events it already made. Save each event’s ID in the sheet when you create it, and update that event on the next run instead of creating a new one.
Can I import a spreadsheet into Google Calendar on my phone? No. Google says importing works on a computer only.
Can I invite guests from a spreadsheet? Not with CSV import, which doesn’t bring in guests. With Apps Script, the guests and sendInvites options of createEvent add them. Test with your own address first, because invitations go out straight away.
Last checked: 22 October 2026
Questions or corrections: support@kayabyte.dev. Google Sheets™, Google Calendar™, Google Workspace™ and Google Apps Script™ are trademarks of Google LLC. Zapier and Make are trademarks of their owners. Kayabyte is an independent developer and is not affiliated with or endorsed by Google LLC.