Google Sheets Import & Export (No OAuth, Reliable)
Pricing
from $0.05 / 1,000 row writtens
Google Sheets Import & Export (No OAuth, Reliable)
Append, replace, upsert or read Google Sheets from any dataset. No Google sign-in to expire: just share the sheet. Chunked writes with retries, automatic new columns and clear error messages.
Pricing
from $0.05 / 1,000 row writtens
Rating
0.0
(0)
Developer
Stubborn Otter Software
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Send any Apify dataset to a Google Sheet, or read a Sheet into a dataset, without connecting your Google account. There's no sign-in to expire, so scheduled runs keep working.
Why this Actor
| Common problem | What this Actor does |
|---|---|
| Google sign-in gets blocked or expires, breaking scheduled runs | No sign-in. You share the sheet with our service account, once. |
| Big uploads fail with "Internal error encountered" | Writes in chunks with automatic retries, and shrinks the chunks if Google keeps refusing. |
| "Requested writing within range…" errors | Adds rows and columns to the tab before writing. |
| Hitting Google's cell limit halfway through | Checks the 10-million-cell limit first and tells you what to do. |
| Append mode wiping existing data | Append never deletes anything (covered by an automated test). |
| "Spreadsheet ID must be 44 characters" | Paste any Sheets link or ID. |
| Can't choose a tab | Type a tab name; it's created if it doesn't exist. |
| AI agents (MCP) can't complete a Google sign-in | Works from Claude, ChatGPT and other agents: no sign-in step. |
Set up in 1 minute
- Open your Google Sheet and click Share.
- Add
sheets-bot@stubborn-otter-sheets.iam.gserviceaccount.comas an Editor. - Run the Actor with your sheet's link.
The service account can only open sheets you've shared with it. Rows pass straight from your dataset to your sheet; nothing is stored. Prefer your own Google Cloud account? Paste your own service account key into Your own service account key, and share the sheet with that account instead.
Modes
- Append (default): adds rows after your existing data, or at the top under the header. New fields become new columns automatically.
- Replace: clears the tab, then writes the header and rows.
- Upsert: rows whose key column(s) match (e.g.
url,id) are updated, and the rest are appended. Columns you don't send are kept as they are. Perfect for scheduled scrapers that re-check the same items. - Read: exports the tab to this run's dataset (the header row becomes field names).
Nested data is flattened (price.value, seller.name), lists of values are joined with commas, and lists of objects are stored as JSON text.
Use it after another Actor (integration)
In the other Actor's Integrations tab, add this Actor and set:
{"spreadsheet": "https://docs.google.com/spreadsheets/d/…/edit","datasetId": "{{resource.defaultDatasetId}}","mode": "upsert","keyColumns": ["url"]}
Every time the scraper finishes, its results land in your sheet, with duplicates updated instead of repeated.
Input examples
Append pasted rows to a tab called "Leads":
{ "spreadsheet": "https://docs.google.com/spreadsheets/d/…/edit", "sheetName": "Leads","data": [{ "company": "Example Co", "url": "https://example.com" }] }
Read a tab:
{ "spreadsheet": "https://docs.google.com/spreadsheets/d/…/edit", "mode": "read", "sheetName": "Prices" }
Output
A summary is saved to the run's key-value store as OUTPUT:
{ "mode": "upsert", "sheet": "Leads", "rowsAppended": 120, "rowsUpdated": 880, "columnsAdded": ["rating"],"duplicatesInInput": 3, "url": "https://docs.google.com/spreadsheets/d/…/edit" }
In read mode, the rows are in the run's dataset.
Pricing
Pay per event: a small charge per run, plus a charge per row written or read (see the Pricing tab). Dry run mode checks everything and reports what would change, for free. The Actor respects your maximum cost per run: if the limit allows only part of the data, it writes the first rows that fit and tells you.
Errors, in plain English
Every failure ends with one sentence saying what to fix. For example:
- "This sheet isn't shared with sheets-bot@…. Open the sheet, click Share, add it as Editor, then run again."
- "Tab 'Leeds' not found. Tabs in this spreadsheet: Leads, Archive" (in read mode; other modes create the tab)
- "Dataset 'abc' has no items, so there's nothing to write. If this runs after another Actor, check that run produced results."
- "This would make the spreadsheet 10,400,000 cells, over Google's limit…"
Limits
- Google allows 10,000,000 cells per spreadsheet, counting every tab's full grid (including empty cells).
- Text starting with
=is written as plain text by default, so scraped data can't run as formulas. Choose "As if typed" if you want formulas and dates interpreted.