How to import a spreadsheet of events into Google Calendar
Google Calendar can take a whole list of events from a spreadsheet, just not the way most people first try. Here is what works, where it breaks, and how to check the result before it lands.
· 8 min read
Two ways in: Google's CSV import or an .ics file
Google Calendar accepts two file types on its Import & export page: CSV and ICS. Both are desktop-web only; the mobile apps have no import option, and sync carries imported events to your phone.
The CSV importer is strict. It expects Google's own header names (Subject, Start Date, Start Time, End Date, End Time, All Day Event, Description, Location, Private), dates in US month/day/year order, and times such as 9:00 AM. There is no preview: a bad header or a misordered date shows up after the events are already in your calendar.
The .ics route means converting the spreadsheet to an iCalendar file first. Columns are matched to calendar fields before Google sees anything, dates are resolved in whatever order your sheet uses, each event carries its own exact time, and you can inspect the result before you commit.
Use Google's CSV import when the file already matches its layout, in practice an export from Outlook or from Google Calendar itself. Use .ics for anything else: your own sheet, a school or booking-system export, day-first dates, or more than one time zone.
Prepare the sheet
Either route needs one event per row and the column names in row 1, with nothing above them; a banner row stops the real headers from being recognized.
- Required: a title column and a start date column. Everything else is optional.
- Dates: one style throughout. ISO (2026-09-14) can't be misread. Numeric dates such as 9/14/2026 or 14.09.2026 work if the whole column uses one order; if no day is above 12, you confirm the order yourself.
- All-day rows: leave both time cells empty. An All Day Event column holding TRUE or Yes is honored but not needed. Multi-day events take the last day in End Date.
- End times: a timed row with no end gets a default length (60 minutes in Koyomi, adjustable). Anything crossing midnight also needs an End Date.
- Descriptions: keep the whole note in one cell; line breaks inside it are preserved. Notes spread across extra rows are read as extra events.
- Links: put the full address, starting with http:// or https://, in a column named URL or Link. Other text there is dropped; anything you want visible in the event body belongs in Description.
A layout with these exact headers is on the template page, as both CSV and Excel.
The time-zone trap
A cell that says 09:00 says nothing about where 09:00 is. Google's CSV import assumes the time zone of the calendar you import into. If that calendar is on Pacific Time and the schedule was written for Berlin, every session lands nine hours early, and nothing warns you.
An .ics file can carry absolute instants instead. Koyomi asks which zone the times were written in (defaulting to your browser's) and writes each event as a UTC timestamp using the offset in force on that date, so a schedule straddling a daylight-saving change comes out right on both sides. Google displays each event in the viewer's calendar zone: 09:00 in Berlin, 00:00 in Los Angeles, which is correct.
The exception is a schedule meant to read the same everywhere, such as a bell timetable. Koyomi's "No timezone" option writes wall-clock times with no zone, and Google places those in the destination calendar's zone, as it would a CSV. A cell that already carries an offset, such as 2026-09-14T09:00:00+02:00, is taken as the instant it states and ignores the zone control.
Step by step: spreadsheet to .ics to Google Calendar
- Create the destination calendar first. At calendar.google.com, click the plus next to Other calendars, choose Create new calendar, name it and set its time zone. The import dialog can only add to a calendar that already exists.
- Get the file. Excel: use the .xlsx or .xls as it is. Google Sheets: File, Download, then .csv for the current tab or .xlsx for the whole workbook. Numbers and LibreOffice: export to either.
- Drop it into the converter. Headers such as Title, Subject, Date, Start Time, Where and Notes are matched automatically; unrecognized columns get a dropdown, and multi-tab workbooks a sheet picker.
- Set the zone and confirm the date order. Choose the zone the schedule was written in. The date-order control shows how numeric dates were read; if the guess is wrong, switch it and the preview updates.
- Read the preview, then download. Every event is listed with its resolved start and end; skipped rows appear with a reason and the offending text quoted. Fix the sheet and drop it again if needed.
- Import in Google Calendar. Back at calendar.google.com: gear, Settings, Import & export. Select the .ics, pick the calendar from step 1 in the Add to calendar dropdown, and click Import. Google reports how many events were added.
Use a dedicated calendar, and how to undo a bad import
Import into a calendar created for the purpose, never your primary one. There is no undo and no way to select everything that came from one file. The fix for a bad import is to delete the whole calendar from its settings, create it again, and import the corrected file. Your primary calendar can't be deleted, only emptied, and emptying it takes your own events with it.
A dedicated calendar also gets its own color, one checkbox to hide the set, and can be shared once instead of emailing the file around.
Re-importing the same file into the same calendar doesn't double the events, provided each event's UID is unchanged; Google matches on UID and updates the existing event. Koyomi derives the automatic UID from the row's position, title and start, so a second conversion of the same sheet lines up with the first import. Move a row, retitle it or change its start and it arrives as a new event beside the old one. An ID column with a unique value per row is used as the UID when present and survives such edits.
Recurring events
A spreadsheet row is one event. Google's CSV layout has no recurrence field and Koyomi writes no recurrence rules, so neither route can say "every Tuesday until December". A spreadsheet expresses the list of occurrences instead, which for most real schedules is the better representation.
For a weekly class, type the first date, type the next one a week later, select both cells and drag the fill handle to the end of term. Each row becomes its own event, so a canceled week is a deleted row and a moved session is an edited date. You lose Google's "this and following events" edit; for a genuinely regular series with no exceptions, creating one recurring event by hand is quicker than any import.
Google Sheets specifics
Google Sheets has no export to Google Calendar. The add-ons and scripts that bridge the gap need write access to your calendar; downloading a file needs nothing.
File, Download, Comma Separated Values (.csv) writes the current tab only, using each cell's display text. A column formatted as "Sep 14" exports without a year and can't be placed: apply a full date format first (Format, Number, Date), or download as Microsoft Excel (.xlsx), which keeps date cells as real dates and includes every tab.
The spreadsheet locale under File, Settings decides whether a CSV comes out as 9/14/2026 or 14/09/2026. Either is fine; consistency within the column is what counts.
Troubleshooting
- Events off by hours: the zone chosen at conversion wasn't the one the times were written in, or on the CSV route the destination calendar's zone was wrong. Fix the zone, convert, delete the calendar and import again.
- Everything on one day: the start date was mapped to the wrong column, or the sheet has times but only one date. Check the mapping dropdowns against the preview.
- Wrong month: a day-first file was read month-first. If no row has a day above 12, nothing can settle it automatically. Set the date-order control to day/month/year and re-check. Google's CSV import has no such control; rewrite the dates as month/day/year or ISO.
- Titles missing or showing "(untitled)": the title column wasn't recognized. Name it Title or Subject, or pick it from the Title dropdown.
- "Could not read a date" warnings: the cell holds a range such as "Sep 1-3", a note, or a weekday with no date. Replace it with a single date.
Do it now
Frequently asked questions
- Can I import an Excel file directly into Google Calendar?
- No. Google Calendar imports CSV and ICS only. Saving as CSV works if you also rewrite headers and dates to Google's layout; converting the .xlsx to .ics skips that.
- How do I import a Google Sheet into Google Calendar?
- Download it as CSV or Excel from the File menu, convert that file to .ics, then import it on the Import & export page at calendar.google.com. Without an add-on or script there is no direct link.
- Why does Google say it was unable to process my file?
- For a CSV: a header Google doesn't recognize, a missing Subject or Start Date column, or an unreadable date. For an .ics: the file isn't real iCalendar text, typically a CSV renamed to .ics. Convert it rather than renaming it.
- Will the imported events notify or invite anyone?
- No. The file lists no attendees and Google emails nobody. Subscribers to a shared calendar see the new events on the next sync.