EventLane — Sheets to CalendarGoogle Sheets™ add-on · not on the Marketplace yet · manual sync freeGet notified

How to create Google Calendar events from Google Sheets

Updated 10 November 2026 · 5 min read

Short answer: Google Sheets cannot send rows to Google Calendar on its own. The free way is a short Apps Script: open Extensions → Apps Script, paste a script that calls CalendarApp.createEvent for each row, and run it. It works for a one-time copy. Run it again and you get every event twice, and it does not update or delete events when the sheet changes, unless you write that too. An add-on such as EventLane does the sync for you.

1. Set up the sheet

Whatever you use, start with one row per event and one column per field, with names in row 1. For the script below, a tab named Events with:

A: TitleB: StartC: End
2Front desk — Ana11/16/2026 9:00:0011/16/2026 17:00:00
3Team training11/18/2026 10:00:0011/18/2026 12:00:00

Start and End must be real date-time values, not text. If a cell is left-aligned, Sheets is treating it as text: use Format → Number → Date time.

2. The Apps Script way

  1. In the spreadsheet, open Extensions → Apps Script.
  2. Replace the code in the editor with the script below and click Save.
  3. Choose createEvents in the function list and click Run. The first time, Google asks you to allow the script to manage your calendars.
function createEvents() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Events');
  const rows = sheet.getDataRange().getValues();   // row 1 holds the column names
  const calendar = CalendarApp.getDefaultCalendar();
  for (let i = 1; i < rows.length; i++) {
    const [title, start, end] = rows[i];
    if (!title || !start) continue;               // skip empty rows
    calendar.createEvent(title, new Date(start), new Date(end));
  }
}

Open Google Calendar: the events are there, in your main calendar. To use another calendar, replace getDefaultCalendar() with getCalendarById('…') and the calendar ID from that calendar’s settings.

3. Where the simple script goes wrong

4. Remember the event IDs

The usual fix is to write each event’s ID into the sheet and update the event on the next run instead of creating it again. Add a column D, Event ID, and use this version:

function syncEvents() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Events');
  const rows = sheet.getDataRange().getValues();   // A Title, B Start, C End, D Event ID
  const calendar = CalendarApp.getDefaultCalendar();
  for (let i = 1; i < rows.length; i++) {
    const [title, start, end, id] = rows[i];
    if (!title || !start) continue;
    const event = id ? calendar.getEventById(id) : null;
    if (event) {
      event.setTitle(title);
      event.setTime(new Date(start), new Date(end));
    } else {
      const created = calendar.createEvent(title, new Date(start), new Date(end));
      sheet.getRange(i + 1, 4).setValue(created.getId());
    }
  }
}

This stops the duplicates and carries edits over. It still leaves events behind when you delete a row, and copying a row copies its ID, so two rows then share one event. Each of those needs more code, and so does the time zone.

Google Forms: to create an event for each form response, link the form to a spreadsheet, then in Apps Script add a trigger (Triggers → Add trigger, event type On form submit) that runs a function like the one above for the new row.

5. With an add-on: EventLane

EventLane is our Google Sheets™ add-on for this job. It is not on Google Workspace Marketplace yet. It does what the scripts above leave to you:

How to set it up: EventLane help.

EventLane — Sheets to CalendarSheets to Calendar sync without a script. Not on the Marketplace yet.
Get notified

Questions

Can Google Sheets add events to Google Calendar by itself?

Not without help. Sheets has no built-in Calendar export. You need a short Apps Script, a CSV file imported into Google Calendar, or an add-on.

Why does my script create duplicate events?

Because createEvent always makes a new event. A script that does not remember which rows it already synced creates every event again on each run. Store the event ID in a column and update the event instead.

Why are my events an hour off?

The date-time in the cell is worked out in the spreadsheet's time zone (File, Settings). If your calendar is set to another zone, every event shows up shifted. Set both to the same zone.

Can Google Forms responses create calendar events?

Yes. Link the form to a spreadsheet, then run a script on form submit, or point an add-on such as EventLane at the responses tab.

RelatedEventLane: Sheets to Calendar syncEventLane helpGoogle Forms to Google Calendar