How to create Google Calendar events from Google Sheets
Short answer: put one event per row (Title, Date, Start, End), then either run a small Apps Script that calls CalendarApp.createEvent for each row, or use a Sheets add-on such as Schedule Sync. The hard part isn't creating events once; it's updating them later without duplicates. That needs each row to remember the ID of the event it created.
1. Set up the sheet
Use one row per event and a header row like this:
| Title | Date | Start | End | Location | Guests |
|---|---|---|---|---|---|
| Team kickoff | 2026-10-05 | 09:30 | 10:30 | Room A | |
| Conference | 2026-10-07 | Center |
Leave Start empty for an all-day event. If End is earlier than Start (22:00 → 02:00), the event ends the next day.
2. Option A: a simple Apps Script (creates events once)
Open Extensions → Apps Script, paste this and run it. It creates events in your default calendar and writes each event's ID into column G so you can see which rows were done:
function createEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var tz = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var rows = sheet.getDataRange().getDisplayValues();
var cal = CalendarApp.getDefaultCalendar();
for (var i = 1; i < rows.length; i++) {
var r = rows[i];
if (!r[0] || r[6]) continue; // no title, or already created
var start = Utilities.parseDate(r[1] + ' ' + (r[2] || '00:00'), tz, 'yyyy-MM-dd HH:mm');
var ev = r[2]
? cal.createEvent(r[0], start, Utilities.parseDate(r[1] + ' ' + r[3], tz, 'yyyy-MM-dd HH:mm'), { location: r[4] })
: cal.createAllDayEvent(r[0], start, { location: r[4] });
sheet.getRange(i + 1, 7).setValue(ev.getId());
}
}
For this script, format the Date column as yyyy-mm-dd and the time columns as hh:mm (Format → Number → Custom date and time). Schedule Sync itself accepts other common date formats.
Tip: the script reads getDisplayValues() (the text you see) instead of raw values. Time-only cells are stored as moments on 30 December 1899, and converting those through a time zone can shift them by minutes or hours.
Limits: this version doesn't update or delete events when you edit rows, and it doesn't handle overnight events. Apps Script also stops after 6 minutes, so very long sheets need batching.
3. Option B: Schedule Sync (creates, updates and removes)
Schedule Sync is a Google Sheets add-on built for keeping a sheet and a calendar in sync:
- Preview first: see how many events will be created, changed and removed before anything happens.
- Update in place: each row remembers its event, so editing a time moves the same event instead of creating a duplicate.
- Safe removal: delete a row and its event is removed; events it didn't create are never touched.
- Shift rosters: a separate mode turns a staff grid with shift codes into events (guide).
It's free for up to 50 events per schedule; Pro is $5/month. Try it free →
Common questions
Can I add guests? Yes. Put email addresses in a Guests column; choose whether invitations are emailed.
Which calendar do events go to? Any calendar you own. A separate calendar is safest, since you can hide or delete it in one step.
Why are my event times off by a few hours? The spreadsheet's time zone (File → Settings) and your calendar's time zone differ. The moment is right; the calendar just shows it in its own zone. Make the two match.
Related: How to put a shift schedule on Google Calendar · The reverse: export Google Calendar to Google Sheets