Connect Google Sheets to Airtable

Pull a range or a whole tab into a pipeline, or write results back into a sheet on a schedule. Works as both a source and a destination.

What you can pull from Google Sheets

A Google Sheets job pulls records into a flat table on your schedule. Nested fields are flattened into ordinary columns, so what lands in Airtable is ready to sort, filter and total rather than needing another cleanup step.

  • Any tab or A1 range
  • Header-mapped columns
  • Append or overwrite

Options you can set

spreadsheet_id
Spreadsheet ID, or the full Google Sheets URL - the ID is extracted from it
sheet_name
Which tab to read or write — defaults to Sheet1
range
A1 notation range, e.g. A1:Z1000. Omit to read the whole sheet

How it lands in Airtable

Airtable accepts append, upsert writes. Upsert is the one that matters on a schedule: it merges on a key you choose, so matching rows are updated in place and only genuinely new records are created. Append instead, and a daily job multiplies your data.

Upsert merges on up to three key fields. Matching records are updated in place; only genuinely new rows are created.

  • At most 3 merge fields - Airtable rejects more.
  • Writes go 10 records per request, at 4 requests per second by default (Airtable’s own ceiling is 5) - roughly 2,400 records a minute.
  • typecast is on by default, letting Airtable coerce strings into select, number and date fields rather than rejecting the write.
  • unknown_fields defaults to error, so a renamed source column fails loudly instead of silently dropping data. Set it to skip if you would rather drop.

Authentication

You connect Google Sheets 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 Sheets is asked for

spreadsheets sensitive
Read and write the sheets you point a job at
userinfo.email non-sensitive
Label the connection so it is identifiable

What is deliberately not requested

drive.readonly — A *restricted* scope - the tier requiring an independent security assessment - and it would grant read access to every file in your Drive. It existed only so the connection test could list a few spreadsheets. That convenience is not worth the access, so you paste a spreadsheet URL instead of browsing Drive.

Keeping runs incremental

Not for this source: Each run reads the configured range in full. Where that is expensive, narrow the job itself and run it less often.

Pair a narrowed read with an upsert write and a re-run costs almost nothing: the rows it already knows are updated, and nothing is duplicated. That combination is what makes a frequent schedule affordable.

A worked example

A sheet promoted to a base

Read the tab, cast the columns as they load, and upsert on whatever the sheet uses as an ID. Because the sheet has no types, the mapping step is doing the real work here - decide what each column becomes before the first run.

Schedule: 0 * * * *read it back in plain English

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.

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.

Do not key an upsert on email

People change their email address. When they do, upsert cannot match, so it creates a second record - the exact duplicate you were trying to prevent, plus a stale one. Use a stable ID from the source system.

The key field has to be written

If you restrict which columns get written and the key field is not among them, there is nothing to match on and every row is treated as new.

A row that is a fact per period needs a compound key

For a daily history, one row is one entity per day. Key on the entity alone and each day overwrites the last, leaving no history at all.

A sheet has no primary key, so you have to nominate one

Upsert needs a stable column. If the sheet has no ID column, add one before you start - row position is not stable and will not survive a sort.

Set it up in four steps

  1. 1

    Connect Google Sheets

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

  2. 2

    Connect Airtable

    Connect your Airtable account once, then pick a base and table.

  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 Airtable with the latest Google Sheets data.

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

No. The job runs server-side and writes into Airtable through its API, so there is nothing installed in the destination 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 Sheets.

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.

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.

How do I stop duplicate records appearing?

Use upsert rather than append, and key it on a stable identifier from the source. Append creates new records every run, so a daily job leaves seven copies of every row by the end of the week.

How fast can it write?

Airtable accepts 10 records per request, and writes are paced at 4 requests a second by default against a ceiling of 5 - roughly 2,400 records a minute. That is comfortable for thousands of rows and worth planning around for hundreds of thousands.

Is the Google Sheets connector free to use?

You can connect Google Sheets and start syncing on the free plan.