Calrows
Updated 1 October 2026
For billing, payroll, reporting or just seeing where the month went, you want calendar events as rows in a spreadsheet. Google Calendar has no "export to Sheets" button, so here are the four ways that work, which one to pick, and the mistakes to avoid.
Install the free Calrows add-on, open your sheet, go to Extensions › Calrows › Open sidebar › Import from Calendar, pick the calendar and a date range, and click Import events into a new sheet. You get one row per event with title, start, end, all-day, description, location, guests and colour.
| Method | Pick a date range | Clean columns | Past events | Effort | Cost |
|---|---|---|---|---|---|
| Calendar's own Export (.ics file) | No, whole history | No, needs converting | Yes | High | Free |
| Apps Script (code below) | Yes | Yes | Yes | Medium, some coding | Free |
| Automation tools (IFTTT, Zapier) | No | Yes | No, only new events from now on | Low | Free tiers, then paid |
| A Sheets add-on such as Calrows | Yes | Yes | Yes | Two clicks | Free up to 50 events per export |
The new tab has these columns: Title, Start, End, All day, Description, Location, Guests and Color. All-day events show the right dates (Google stores their end date as the following day; Calrows corrects that). Each occurrence of a recurring event becomes its own row.
Two things the other methods can't do:
In your sheet, open Extensions › Apps Script, paste this, change the dates, and click Run. It writes one month of your main calendar into a new tab.
function exportCalendarToSheet() {
var cal = CalendarApp.getDefaultCalendar(); // or CalendarApp.getCalendarById('team@group.calendar.google.com')
var start = new Date('2026-09-01T00:00:00'); // first day to include
var end = new Date('2026-10-01T00:00:00'); // the day AFTER the last day
var rows = [['Title', 'Start', 'End', 'All day', 'Location', 'Guests', 'Description']];
cal.getEvents(start, end).forEach(function (e) {
var allDay = e.isAllDayEvent();
var s = allDay ? e.getAllDayStartDate() : e.getStartTime();
var en = allDay ? new Date(e.getAllDayEndDate().getTime() - 86400000) : e.getEndTime(); // all-day end is the next day
var guests = e.getGuestList().map(function (g) { return g.getEmail(); }).join(', ');
rows.push([e.getTitle(), s, en, allDay, e.getLocation(), guests, e.getDescription()]);
});
var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('Calendar export ' + new Date().getTime());
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}
Three things to watch:
In Google Calendar, go to Settings › Import & export › Export. You get a ZIP containing one .ics file per calendar.
.ics files as rows. You need a converter to turn it into CSV first, and the result usually needs cleaning: time zones, repeating-event rules and line breaks come out messy.It's the right tool for a backup or moving to another calendar app, not for getting last month's events into a spreadsheet.
Automation services can add a row to a sheet each time a new event is created. That's useful for a running log, but they don't export events that already exist, and they don't update rows when an event is moved or deleted.
Use any method above to get the events into Google Sheets, then choose File › Download › Microsoft Excel (.xlsx). The rows, columns and dates carry over to Excel. To keep the dates as real dates (not text), leave the Start and End columns formatted as date-time before you download.
Not directly. Google Calendar only exports a whole calendar as an .ics file, which Sheets can't open as rows. Use an add-on such as Calrows, an Apps Script, or an automation tool.
Calendar's own export has no date range. In Calrows: Extensions › Calrows › Open sidebar › Import from Calendar, set From and To, then click Import events into a new sheet.
Yes. Each occurrence inside the date range becomes its own row. Calrows marks those rows read-only so it never edits the whole series by accident.
Yes, if it's shared with your Google account. Shared calendars appear in the calendar list next to your own.
With Calrows, yes: click Pull Calendar changes, or on Pro turn on automatic sync with "also pull calendar changes" to refresh it every hour. Apps Script and .ics exports are one-off copies.
Calrows is free for exports of up to 50 events at a time. Pro removes the limit and is a one-time payment with no auto-renewal. Apps Script is free but needs some coding.