Connect Google Calendar to Google Sheets

Read events from any calendar you can see, with attendee counts, durations and responses flattened into columns. The date presets look forward as well as back, because upcoming events are the common case.

Coming soon — join the list to get early access

What you can pull from Google Calendar

Google Calendar exposes 1 object you can pull, each as its own job. Every run will pull the records into a flat table, so nested fields arrive as ordinary columns that Google Sheets can sort, filter and total without further work.

Events

One row per event, with attendee counts and responses summarised into columns rather than left as a nested list.

Columns returned by events
ColumnTypeNotes
event_idstringThe stable upsert key
summarystringThe event title
startdatetime
enddatetime
is_all_dayboolean
duration_minutesintegerComputed, so you do not have to
locationstring
statusstringconfirmed, tentative or cancelled
organizer_emailstring
attendee_countinteger
attendees_acceptedinteger
attendees_declinedinteger
createddatetime
updateddatetime

Options you can set

calendar_id
'primary' is the connected account's own calendar; otherwise a calendar ID, usually an email address — defaults to primary
date_range
today, next_7_days, next_30_days, next_90_days, last_7_days, last_30_days or custom — defaults to next_30_days
time_zone
IANA time zone used to render times in the response

How it lands in Google Sheets

Google Sheets accepts append and overwrite writes. Overwrite replaces the target range, which suits a snapshot; append adds rows underneath, which suits a log you are accumulating. There is no upsert here, so rows are added or replaced rather than merged.

  • Append adds rows below existing content; overwrite replaces the target range.
  • No upsert: a spreadsheet has no primary key, so there is nothing to merge on. Use Airtable or Postgres if rows must be updated in place.
  • Google caps a spreadsheet at 10 million cells across all tabs. Filter before writing rather than after.

Authentication

You connect Google Calendar once through OAuth and the credential is stored server-side, never pasted into a cell or a formula. Only the scopes the connector actually calls are requested — the table below lists each one and what it is for.

What Google Calendar is asked for

calendar.readonly sensitive
Read events from calendars you can already see
userinfo.email non-sensitive
Label the connection

Keeping runs incremental

Yes. Pull a moving window rather than the whole calendar. Unlike the reporting sources these presets look forward as well as back, because upcoming events are the common case.

Because Google Sheets has no upsert, decide what a re-run should mean before you schedule it. Overwrite keeps a current snapshot; append accumulates history and will grow without bound.

Common gotchas

Most of what goes wrong with a scheduled sync is not a bug — it is a detail of how one side behaves that nobody wrote down. These are the ones that come up for this pair.

The default window looks forward, not back

next_30_days is the default because upcoming events are the usual reason to pull a calendar. If you are reporting on what happened, choose one of the last_ presets.

Recurring events expand into instances

A weekly meeting is many rows, one per occurrence in the window, each with its own event ID. Count carefully before treating row count as meeting count.

An open-ended range beats a padded one

Writing to A2:D is better than A2:D1000 for appends: the padded form reserves rows you may not need and makes the append boundary ambiguous.

Set it up in four steps

  1. 1

    Connect Google Calendar

    Connect your Google account once, then choose a calendar.

  2. 2

    Connect Google Sheets

    Connect your Google account once. Paste a spreadsheet URL or ID.

  3. 3

    Shape the data

    Select the columns you want, filter rows, cast types and add computed fields. Everything else is dropped before it reaches the destination.

  4. 4

    Schedule it

    Run once, or on a cron. Every run refreshes Google Sheets with the latest Google Calendar data.

Do I need an add-on or extension for this?

No. The job runs server-side and writes into Google Sheets through its API, so there is nothing installed in the spreadsheet itself. It keeps running when nobody has the file open, and a copy of the file does not need anything installed to work.

How often does the data refresh?

On whatever schedule you set with a cron expression — hourly, daily, or a specific time on specific days. Each run pulls the latest from Google Calendar.

Do I need to write any code?

No. You connect both sides, map the fields in a wizard and set a schedule. Computed fields accept small expressions — abs, round, min, max, len — but there is nothing to host or maintain.

Can it read a colleague’s calendar?

Any calendar the connected account can already see, by calendar ID - usually their email address. It grants no access you did not already have.

Do I have to give access to my whole Google Drive?

No. Only the spreadsheets scope is requested. The Drive scope that most spreadsheet tools ask for is a restricted scope granting read access to every file you own; it is deliberately not requested here, which is why you paste a spreadsheet URL rather than browsing Drive.

Will this keep working if I copy the sheet?

The job writes to a specific spreadsheet ID, so a copy will not receive data until you point a job at it. Nothing is installed in the file itself, though, so copying never breaks the original.

When will Google Calendar be available?

Google Calendar is built and waiting on verification. Join the early-access list and we will let you know the moment it opens.