How to export Google Calendar to Excel

Google Calendar doesn't have an export-to-Excel button. The manual workaround with a pivot table — and the approach that skips the export entirely.

5 min read Adrien

When a client asks for a detailed time breakdown, the answer is somewhere in Google Calendar. Every session, every call, every hour worked — logged with exact start and end times.

The problem: none of it comes out as a spreadsheet. Google Calendar has no “export to Excel” button. Getting your hours into a format you can send or use for invoicing takes a few extra steps.

Here’s what those steps look like — and where they tend to break.

Getting the data out of Google Calendar

Google Calendar can export your events, but not to Excel. It exports to .ics — a plain-text format that calendar apps use to exchange data.

To export: click the gear icon (top right) → Settings → “Import & Export” → “Export”. Google packages everything into a .zip. Inside: one .ics file per calendar you own — your main calendar, shared calendars, any secondary ones.

The .ics is a text file. Open one and you’ll see blocks like this:

BEGIN:VEVENT
DTSTART:20240215T090000Z
DTEND:20240215T103000Z
SUMMARY:[Acme] Strategy call
END:VEVENT

DTSTART and DTEND are timestamps in UTC. SUMMARY is the event title. That’s your raw data — now you need to turn it into rows and columns.

Converting the .ics to a usable spreadsheet

.ics files don’t open cleanly in Excel. You need a conversion step.

Several free tools online accept an .ics and output a .csv. The result: a spreadsheet with one row per event and columns for title, start date/time, end date/time, and sometimes duration if the tool calculates it.

If your converter doesn’t include a duration column, add one:

=(end_time - start_time) * 24

That gives decimal hours — 1.5 for a 90-minute session.

From there, a pivot table with the title column as row and the duration column as value gives you hours per client. Filter the title column by client tag (everything starting with [Acme], for example), add a date filter for your billing period, and you have a timesheet.

The whole process — export, conversion, pivot table setup — takes 30–40 minutes the first time. Once you have a template, subsequent months are faster. But you’ll repeat the export-and-import cycle every billing period.

What goes wrong with the manual method

The process works in principle. In practice, three things break it regularly.

Timezones. .ics files store all times in UTC. ICS-to-CSV converters handle timezone conversion inconsistently. If your calendar is set to a timezone offset from UTC — which covers most of Europe — your duration calculations will be wrong until you adjust manually. A 90-minute call at 9am Paris time in winter is stored as 08:00:00Z to 09:30:00Z in the .ics. The hours are technically correct in UTC; they’re wrong in your local time.

Recurring events with exceptions. A weekly standup exports as a separate block for each occurrence. Fine. But when one session was cancelled and another rescheduled, those changes are stored with EXDATE or RECURRENCE-ID flags. Not all converters process these correctly. You can end up with duplicate entries or missing sessions — which you won’t notice until the totals don’t match.

All-day events. Google Calendar all-day events don’t store times. The .ics block reads DTSTART;VALUE=DATE:20240215 — no start time, no end time, no duration. If you use all-day blocks to log full workdays or travel days, those hours won’t appear in the pivot table. They need manual handling every month.

None of these are dealbreakers individually. Together, they mean you’re auditing the export every time rather than trusting it.

The version that skips the export

Google Calendar generates a private iCal URL for each calendar — a read-only link that any app can subscribe to. It’s not a static export; it’s a live feed that updates as your calendar does.

To find it: Settings → click your calendar name in the left sidebar → scroll to “Secret address in iCal format” → copy the URL.

Paste that URL into Timescanner. It reads the events directly, parses client tags from the event titles, handles timezones correctly, and generates the timesheet automatically — hours per client, hours per project, billable vs. non-billable ratio, revenue at your configured rate.

No export. No ICS converter. No pivot table to rebuild each month.

Update an event or add a new session, and the next report reflects it. Connect multiple calendars if your work is spread across them. The URL is read-only — Timescanner sees only the titles and times from the calendar link you provided, nothing else.

If you’re not yet naming events with client tags, the bracket naming convention covers the full system on one page. One tag at the start of each event title is all it takes. Once that’s in place, the timesheet builds itself.

And if the goal is to close a billing period cleanly in one pass, what that process looks like at the end of the month covers the rest.


Timescanner works with Google Calendar, Outlook, iCloud, Proton Calendar, Notion Calendar, Fastmail, Infomaniak, and any iCal-compatible calendar.

Timescanner

Your calendar already knows how much you worked.

No timers. No new habits. Timescanner reads your calendar — Google Calendar, Outlook, iCloud, and more — and generates your billing reports automatically.

Start free trial — 30 days, no credit card