Google Sheets Import & Export (No OAuth, Reliable) avatar

Google Sheets Import & Export (No OAuth, Reliable)

Pricing

from $0.05 / 1,000 row writtens

Go to Apify Store
Google Sheets Import & Export (No OAuth, Reliable)

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

Stubborn Otter Software

Maintained by Community

Actor 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 problemWhat this Actor does
Google sign-in gets blocked or expires, breaking scheduled runsNo 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…" errorsAdds rows and columns to the tab before writing.
Hitting Google's cell limit halfway throughChecks the 10-million-cell limit first and tells you what to do.
Append mode wiping existing dataAppend never deletes anything (covered by an automated test).
"Spreadsheet ID must be 44 characters"Paste any Sheets link or ID.
Can't choose a tabType a tab name; it's created if it doesn't exist.
AI agents (MCP) can't complete a Google sign-inWorks from Claude, ChatGPT and other agents: no sign-in step.

Set up in 1 minute

  1. Open your Google Sheet and click Share.
  2. Add sheets-bot@stubborn-otter-sheets.iam.gserviceaccount.com as an Editor.
  3. 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.