Contents
n8n Google Sheets Tutorial: Automatically Read, Add, and Update Data
Google Sheets is one of the most common “lightweight databases” for sign-up lists, orders, inventory, and customer lists. n8n can automatically read, write, and update spreadsheets, and trigger workflows when new data arrives.
Setup: authorization
- n8n Cloud: Sign in to Google when you create Google Sheets credentials.
- Self-hosted: First create an OAuth client in Google Cloud and enable the Google Sheets API. For the full steps, see Credential management.
Spreadsheet format
n8n treats the first row as column names. Each row after that is one record (an item):
| Name | Session | Status | |
|---|---|---|---|
| Wang Xiaoming | ming@example.com | 10/20 Taipei | Confirmed |
| Li Xiaohua | hua@example.com | 10/27 Taichung | Pending |
After reading, each row becomes:
{ "row_number": 2, "Name": "Wang Xiaoming", "Email": "ming@example.com", "Session": "10/20 Taipei", "Status": "Confirmed" }
Keep column names short and unique, and avoid merged cells.
Common operations
In the Google Sheets node, choose:
| Operation | Description |
|---|---|
| Get Row(s) | Read rows. You can set filters (for example, Status = Pending). |
| Append Row | Add a row at the end. |
| Update Row | Find a row by a column value and update it. |
| Append or Update Row | Update a matching row, or add a new one if no match is found (most common). |
| Delete Rows | Delete rows. |
| Clear | Clear a sheet. |
| Create | Create a new spreadsheet or sheet. |
When choosing a spreadsheet and sheet, you can select one from the list or paste the spreadsheet URL.
Map columns
When adding or updating data, Mapping Column Mode has two options:
- Map Each Column Manually: Enter an expression for each column. For example, enter
{{ $json.name }}for “Name.” - Map Automatically: Automatically map data when its field names match the spreadsheet's column names.
Updates: choose a match column
Update / Append or Update requires Column to match on, such as the “Email” column. Choose a column with unique values.
Watch for new data: Google Sheets Trigger
Google Sheets Trigger periodically checks a spreadsheet and triggers when a row is added or a row is modified. It works well for scenarios such as automatically processing an order added to a spreadsheet.
Note that it uses polling (for example, checking once a minute), so it is not real-time.
Complete example: automate event sign-ups
Goal: A user submits a registration form → the data is written to a spreadsheet → a confirmation email is sent → an admin is notified.
[Form Trigger] ─▶ [Google Sheets: Append or Update] ─▶ [Send Email: confirmation] ─▶ [Telegram: notify admin]
1. Form Trigger
Use n8n's built-in form; you don't need Google Forms:
- Form Title:
Lecture registration - Fields:
- Name (Text, required)
- Email (Email, required)
- Session (Dropdown: 10/20 Taipei, 10/27 Taichung)
After publishing, you'll get a form URL that you can share.
2. Write to the spreadsheet
In the Google Sheets node, choose Append or Update Row:
- Column to match on:
Email - Name:
{{ $json.Name }} - Email:
{{ $json.Email }} - Session:
{{ $json.Session }} - Status:
Registered - Registration time:
{{ $now.toFormat('yyyy-MM-dd HH:mm') }}
Matching by Email means repeat sign-ups from the same person update the existing data instead of adding duplicate rows.
3. Send a confirmation email
Use the Send Email or Gmail node:
Hello {{ $('Form Trigger').item.json.Name }},
Thank you for registering for the {{ $('Form Trigger').item.json.Session }} session.
We've received your registration and will send you a reminder the day before the event.
Because the previous node is Google Sheets, use $('Form Trigger') to read the original form data.
4. Notify the admin
Connect a Telegram or Slack node and send “New registration: name / session.”
Advanced: send daily sign-up statistics
[Schedule: daily at 6:00 PM] ─▶ [Google Sheets: Get Rows] ─▶ [Summarize: count by session] ─▶ [Send Email]
Configure the Summarize node: choose “Session” for Fields to Split By and Count for Aggregation to get the number of registrations for each session.
Frequently asked questions
Slow or errors with large data volumes
The Google Sheets API has rate limits. For large writes:
- Write multiple rows at once instead of making one call per row.
- Use Loop Over Items to process batches, with a Wait node in between.
For tens of thousands of records or more, consider switching to a proper database (PostgreSQL, MySQL) or n8n's built-in Data Tables (available depending on your version).
Numbers are read as strings
Spreadsheet cell formatting affects the results. Use Number() before comparing or calculating.
A column can't be found
Check that the first row contains column names and that there is no extra whitespace before or after a name. After changing a column name, reload the fields in the node.
Updated October 12, 2026