Apify to Google Sheets API – Export to Google Sheets, No OAuth
Pricing
from $0.10 / 1,000 rows
Apify to Google Sheets API – Export to Google Sheets, No OAuth
Send any Apify dataset to Google Sheets in one step: append, replace or upsert by key column. No Google Cloud project, no OAuth pop-up and no tokens that expire — just share the sheet with one bot email. Rows that did not change are never charged.
Pricing
from $0.10 / 1,000 rows
Rating
0.0
(0)
Developer
Tidyrun
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Google Sheets Export: Dataset to Sheet
Send any Apify dataset to Google Sheets in one step. No Google Cloud project, no OAuth pop-up, no tokens that expire.
Quick start (2 minutes)
-
Open your Google Sheet → Share → add this email as Editor:
sheets-sync-bot@sheets-sync-prod-511105.iam.gserviceaccount.comGoogle may warn that the address can't receive email. That's fine: untick Notify people and click Share anyway.
-
Paste the sheet's URL in Google Sheet URL.
-
Pick the Dataset to export (for example, the dataset of your last scraper run).
-
Pick a Mode and click Start. Not sure? Tick Dry run first: it writes nothing and costs only the run start.
When the run finishes, the status message and the Output tab show Open sheet, a link straight to the tab that was written.
Export after every scraper run
On your scraper or its task, open Integrations, search for Google Sheets Export, pick this Actor and set its input:
{"spreadsheetId": "https://docs.google.com/spreadsheets/d/1AbC.../edit","sheetName": "Products","mode": "upsert","keyColumns": ["url"],"datasetId": "{{resource.defaultDatasetId}}"}
Every time the scraper finishes, its new results land in your sheet. Apify only lets this Actor read the dataset you pass in, nothing else in your account.
Use it from n8n
Install the Apify community node @apify/n8n-nodes-apify (it is already built into n8n Cloud), add an Apify node and point it at tidyrun/google-sheets-export. A flow people build with it:
Export every scraper run to a sheet
Apify trigger (run succeeded) → Get the run's last dataset → Apify: tidyrun/google-sheets-export
Set datasetId to the trigger's dataset, mode to upsert and keyColumns to whatever makes a row unique. Share the sheet with the bot email first, or the run stops with a clear message instead of writing nothing.
Call it from your code
curl -X POST "https://api.apify.com/v2/acts/tidyrun~google-sheets-export/run-sync?token=YOUR_TOKEN" \-H 'Content-Type: application/json' \-d '{"spreadsheetId":"https://docs.google.com/spreadsheets/d/1AbC.../edit","sheetName":"Products","mode":"upsert","keyColumns":["url"],"rows":[{"url":"https://example.com/a","price":19.9}]}'
Send datasetId instead of rows to export a dataset you already have. Add "dryRun": true to see exactly what would be written without touching the sheet.
Modes
| Mode | What it does |
|---|---|
append | Adds rows below existing data. |
replace | Backs up the tab, clears it, writes header and rows, then removes the backup. |
upsert | Updates rows whose Key columns match, appends new ones, skips unchanged ones. Columns you don't send keep their values. |
Nested objects become dot-path columns (price.amount); arrays are written as JSON text. Use Columns to write to pick and order columns. Values are stored as-is, so scraped text starting with = is never executed as a formula.
Why this one
| Common problem | What happens here |
|---|---|
| "This app is blocked" / tokens expire after a few days | No sign-in at all. Share the sheet with the bot email once; it keeps working. |
| Runs fail on large data with 429 quota errors | Requests are paced and batched under Google's limits and retried automatically. 12,000 rows write in about 20 seconds. |
| Upsert creates duplicates | Keys match ignoring case and extra spaces (" ABC-1 " = "abc-1"). |
| Paying to rewrite rows that didn't change | Unchanged rows are skipped and never charged. |
| A failed replace wiped the sheet | Replace copies your tab first; if anything fails, your data is in the backup tab. |
| "The main function threw an exception" | Plain errors that say what to fix, plus a dry run that checks everything before writing. |
| Columns re-sorted or moved | Your column order is kept; new fields are added at the end. |
Output
{"spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1AbC.../edit#gid=0","sheetName": "Products","mode": "upsert","rowsAppended": 120,"rowsUpdated": 380,"rowsUnchanged": 500,"newColumns": ["stock"],"stoppedByChargeLimit": false}
Pricing
| What | Price |
|---|---|
| Row written (appended or updated) | $0.10 per 1,000 |
| Run start | $0.002 per run |
Unchanged rows and failed writes are never charged; a dry run costs only the run start. Example: a daily upsert of 2,000 rows where 300 changed costs $0.002 + $0.03. The run stops cleanly at your maximum charge limit.
FAQ
My company's Google Workspace won't let me share with an outside email. Ask your admin to allow sharing with sheets-sync-bot@sheets-sync-prod-511105.iam.gserviceaccount.com, or use your own service account (below).
A teammate gets "already linked to a different Apify account". The first Apify account that writes to a spreadsheet becomes its owner, so nobody else can write to your sheet just by knowing its ID. Run it from the same Apify account (or organization), or use a copy of the sheet.
Can I stop access? Yes. Remove the bot email from Share at any time.
Your own service account (optional)
Want a dedicated quota or can't share with an outside email? Create a service account with Google Sheets API enabled, share the sheet with its client_email, and paste its JSON key into Your own service account key. Note: Google Cloud organizations created after May 2024 block key creation by default (policy iam.disableServiceAccountKeyCreation).
Limits
- Google allows 20 million cells per spreadsheet and 50,000 characters per cell. Longer cells are truncated and counted in
truncatedCells; writes that would pass the cell limit are refused before anything is written. - Upsert reads the whole tab to match keys, so very large tabs take longer.
Privacy
Rows pass through the Actor run straight to the Google Sheets API. We don't store your data, and the bot only touches spreadsheets you share with it.
Google Sheets is a trademark of Google LLC. This Actor is not affiliated with or endorsed by Google.