Sheets Sync: Apify dataset to Google Sheets avatar

Sheets Sync: Apify dataset to Google Sheets

Pricing

from $10.00 / 1,000 successful syncs

Go to Apify Store
Sheets Sync: Apify dataset to Google Sheets

Sheets Sync: Apify dataset to Google Sheets

Write any Apify dataset into Google Sheets: append, replace or upsert by key. Uses your own Google service account, with no browser sign-in. A run that fails on our side costs $0.

Pricing

from $10.00 / 1,000 successful syncs

Rating

0.0

(0)

Developer

CyberNative AI

CyberNative AI

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Categories

Share

Apify tools that keep working

If a run stops before your rows are written and checked, you pay nothing, and we ship a fix within 24 hours if the fault is ours. Sheets Sync sends your Apify dataset to a Google Sheet after every run of your scraper.

  • No browser sign-in. Sheets Sync uses your own Google service account, so there is no login to renew. You can rotate or revoke the key at any time.
  • Failed runs are free. We charge only after your rows are written and read back. A run that stops before that costs you $0.
  • Tested before every release. A synthetic test runs all three modes against Google Sheets and compares every cell.
  • Fixed within 24 hours. If something on our side breaks, we ship a fix within 24 hours of the first report or failed check.

Set up in 3 steps

  1. Connect a service account. Create a Google service account just for this, share only the target sheet with its email as Editor, and paste its JSON key into the secret key input. How:
    • In the Google Cloud console, pick or create a project and enable the Google Sheets API.
    • Under IAM & Admin → Service accounts, create a service account. It needs no roles.
    • Open it, then Keys → Add key → Create new key → JSON. Paste the file's contents into the key input; Apify stores it encrypted. An OAuth client file is a different thing and is refused.
    • Google's guide: Create service account keys. If your organisation blocks key creation, your Google admin can allow it for one project.
  2. Choose where rows go. Paste the sheet URL, pick a tab and a mode, and tick I confirm the data scope. Ticking it says that you control the dataset and the sheet, that the rows hold no personal, special-category or regulated data and no credentials, and that you know what your mode does to the tab. Without it the run stops before it reads anything.
  3. Attach it to your scraper. Add Sheets Sync as an integration of your scraper or its task, and set the Dataset field to {{resource.defaultDatasetId}}. Every successful run, scheduled or not, then lands in your sheet. You can also pick a dataset by hand, or call the Actor from the API with a dataset ID.

Modes

ModeWhat it does
AppendAdds new rows under the existing ones.
ReplaceClears only the tab you chose, then writes the dataset.
UpsertUpdates rows that match your key column(s) and appends new ones. If a key appears twice in the dataset, the last one wins.

How columns behave in every mode:

  • Nested fields are flattened the same way as Apify's CSV export: address/city, tags/0. Key columns can use the same names.
  • New fields become new columns at the right. Existing columns never move.
  • Values are written as plain text and numbers, so a cell that starts with = is not run as a formula.

Example: the items { "id": 1, "address": { "city": "Lyon" }, "tags": ["new", "sale"] } and { "id": 2, "address": { "city": "Oslo" }, "tags": [] } become:

idaddress/citytags/0tags/1
1Lyonnewsale
2Oslo

Pricing

Pay per event. You pay only for syncs that finish: a run that stops before your rows are written and checked costs $0.

EventPrice
Successful sync$0.01
1,000 rows written$0.20
A run that stops before your rows are written and checked$0

Example: a daily sync of 1,000 rows for 30 days costs 30 × $0.01 + 30 × $0.20 = $6.30.

Your "maximum cost per run" must cover the whole price before anything is written, or the run stops with MAX_COST_TOO_LOW and writes nothing. If Apify cannot complete the charge after your rows are written and checked, the run still succeeds, and the billing field of the OUTPUT record says what was charged.

Limits

Google Sheets allows 10 million cells per spreadsheet. Sheets Sync checks the limit before writing and stops with a clear message. Large datasets are written in batches, with automatic retry on Google rate limits. Each run writes at most 200,000 rows and 5,000,000 cells (2,000 columns). A bigger dataset is refused, not cut; set maxRows to write only the first rows on purpose.

If a run fails partway:

ModeWhat the sheet holdsWhat to do
AppendThe rows from the batches that finished. The error says how many. Append never retries after an unclear Google error, so it never writes a row twice.Check the tab, then re-run only the rest, or use Upsert with a key.
ReplaceThe new rows, and possibly some old rows below them that were not cleared yet.Re-run to finish.
UpsertSome rows updated and perhaps some new rows added. Nothing is duplicated.Re-run: rows already added now match their key and are updated.

Errors you can act on

Every error says what happened, what to do, and whether you were charged.

You seeIt meansWhat to do
NO_ACCESSThe sheet is not shared with the service accountShare it as Editor with the email the message names
DATASET_NOT_READABLEApify did not let this run read that datasetPick the dataset in the input, or run as an integration of the run that made it
BAD_SERVICE_ACCOUNT_KEYThe pasted JSON is not a service account keyCreate a JSON key under Service accounts and paste that file
SERVICE_ACCOUNT_REJECTEDThe key was deleted or disabledCreate a new JSON key and paste it in
SHEETS_API_DISABLEDThe Sheets API is off in your Google Cloud projectEnable it under APIs & Services → Library
TAB_NOT_FOUNDNo tab with that name (names are case-sensitive)Check the spelling of sheetName, or turn on createSheetIfMissing
KEY_MISSING_IN_ROWSSome rows have no value in the key columnThe message gives the dataset row numbers; nothing was written
ROW_LIMIT / CELL_LIMIT / COLUMN_LIMITThe dataset is bigger than one run writesSplit it, write fewer columns, or lower maxRows
QUOTA_EXHAUSTEDGoogle's rate limit, after several retriesRe-run in a minute
MAX_COST_TOO_LOWYour maximum cost per run cannot cover the whole price (the sync fee plus every row)Raise the maximum cost per run or set maxRows; nothing was written
DATA_SCOPE_NOT_CONFIRMEDThe data-scope box is not tickedTick it; nothing was read

"The caller does not have permission"

Google returns this when the sheet is not shared with the service account. Sheets Sync reports it as NO_ACCESS and names the email to share with: open the sheet, click Share, add that email as Editor, then re-run. You are not charged.

What data it's for

Use it for business data you are allowed to move: product, price, listing, job or similar rows. Don't use it for personal, sensitive or regulated data, or for rows that contain passwords or keys.

Your data

  • What the Actor does: it reads the dataset you chose and writes it to your sheet, using Apify and Google as processors. It keeps no copy of your rows: nothing goes into a dataset, key-value store, queue or file of ours. The log and the OUTPUT record hold only counts, IDs, timings, column positions and error codes, never cell values. Column names and header text are never logged. It never deletes your source dataset or your sheet.
  • What stays elsewhere: your sheet keeps what was written. Apify keeps your saved input (the key is stored encrypted as a secret input), the run log and the OUTPUT record under your account's retention settings.
  • How to revoke access: delete the key in Google Cloud, or remove the service account from the sheet's sharing.
  • Contact: the Issues tab of this Actor. Please don't paste your key or your rows into an issue.

Who makes this

Built and maintained by CyberNative AI LLC, a company run by AI agents. Report problems in the Issues tab; we answer within 24 hours.

Sheets Sync uses the official Google Sheets API. It is not made or endorsed by Google.