Skip to main content

What does this node do?

The Google Sheets node connects your workflows to Google Sheets. Read data from spreadsheets, write results back, and automate your spreadsheet workflows. Common uses:
  • Read input data (URLs, contacts, keywords)
  • Store workflow results
  • Build automated reports
  • Sync data between systems

Quick setup

1

Connect Google account

Go to Builder → Integrations → Google and authenticate
2

Add the Google Sheets node

Find it in IntegrationsGoogleSheets
3

Enter spreadsheet ID and range

Specify which data to read or write

Configuration

Required fields

spreadsheet_id
string
required
The unique identifier of your Google Sheet.How to find it: From the URL: docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/editExample: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
operation
string
required
The operation to perform.
OperationDescription
readRead data from the sheet
writeWrite data to the sheet
appendAdd rows to the end
updateUpdate existing cells
range
string
required
The cell range in A1 notation.Examples:
  • Sheet1!A:D - Columns A through D
  • Sheet1!A1:D100 - Specific range
  • Sheet1!A2:D - Skip header row
  • Data!A:Z - Named sheet

Optional fields

values
array
Data to write (for write/append operations).Format as array of arrays:
[
  ["Name", "Email", "Status"],
  ["Alice", "[email protected]", "Active"],
  ["Bob", "[email protected]", "Pending"]
]
value_input_option
string
default:"USER_ENTERED"
How to interpret input values.
OptionBehavior
RAWValues stored as-is
USER_ENTEREDParsed as if typed by user
include_headers
boolean
default:"true"
Treat first row as headers (returns objects instead of arrays).

Output

Read operation

With headers:
{
  "spreadsheet_id": "1BxiMVs...",
  "range": "Sheet1!A1:C3",
  "rows": 2,
  "columns": 3,
  "data": [
    {"Name": "Alice", "Email": "[email protected]", "Status": "Active"},
    {"Name": "Bob", "Email": "[email protected]", "Status": "Pending"}
  ]
}
Without headers:
{
  "data": [
    ["Name", "Email", "Status"],
    ["Alice", "[email protected]", "Active"],
    ["Bob", "[email protected]", "Pending"]
  ]
}

Write operation

{
  "spreadsheet_id": "1BxiMVs...",
  "range": "Sheet1!A1:C3",
  "operation": "write",
  "updated_cells": 9,
  "updated_rows": 3,
  "status": "success"
}

Examples

Read URLs for scraping

Operation: Read
Range: URLs!A2:A (skip header)
Access data: {{GoogleSheets_0.data}}

Save analysis results

Operation: Append
Range: Results!A:E
Values:
[[
  "{{url}}",
  "{{title}}",
  "{{wordCount}}",
  "{{score}}",
  "{{timestamp}}"
]]

Update existing records

Operation: Update
Range: Data!A2:D2
Updates specific cells without affecting others.

Common patterns

Read → Process → Write

Incremental append

Adds rows without overwriting existing data.

Sheet as database

Use Sheets as a simple database:
  1. Read to get current state
  2. Process and transform
  3. Write updates back

A1 notation reference

NotationMeaning
A1Single cell
A1:B2Range from A1 to B2
A:AEntire column A
1:1Entire row 1
A:CColumns A through C
Sheet1!A1:B2Range on specific sheet

Best practices

Use named ranges

Create named ranges in Sheets for stable references:
❌ Sheet1!A1:D100  (might change)
✅ DataTable       (named range)

Include headers

Always use headers for readable data:
❌ [["Alice", "[email protected]"]]
✅ [{"name": "Alice", "email": "[email protected]"}]

Handle empty sheets

Check for empty results:
Conditional:
  If {{GoogleSheets_0.rows}} equals 0
    → Handle empty
  Else
    → Process data

Use specific ranges

Be precise to improve performance:
❌ A:Z     (reads all columns)
✅ A:D     (only needed columns)

Common issues

  • Ensure Google account has access to the sheet
  • Re-authenticate in Settings → Integrations
  • Check sheet sharing settings
  • Verify spreadsheet ID is correct
  • Check sheet name (case-sensitive)
  • Ensure account has access
  • Check include_headers setting
  • Verify range includes all needed columns
  • Check for merged cells (can cause issues)
  • Use append instead of write to add rows
  • Specify exact range for updates
  • Check range doesn’t overlap existing data