Sheets Sync: Apify dataset to Google Sheets
Pricing
from $10.00 / 1,000 successful syncs
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
Maintained by CommunityActor 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
- 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.
- 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.
- 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
| Mode | What it does |
|---|---|
| Append | Adds new rows under the existing ones. |
| Replace | Clears only the tab you chose, then writes the dataset. |
| Upsert | Updates 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:
| id | address/city | tags/0 | tags/1 |
|---|---|---|---|
| 1 | Lyon | new | sale |
| 2 | Oslo |
Pricing
Pay per event. You pay only for syncs that finish: a run that stops before your rows are written and checked costs $0.
| Event | Price |
|---|---|
| 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:
| Mode | What the sheet holds | What to do |
|---|---|---|
| Append | The 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. |
| Replace | The new rows, and possibly some old rows below them that were not cleared yet. | Re-run to finish. |
| Upsert | Some 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 see | It means | What to do |
|---|---|---|
NO_ACCESS | The sheet is not shared with the service account | Share it as Editor with the email the message names |
DATASET_NOT_READABLE | Apify did not let this run read that dataset | Pick the dataset in the input, or run as an integration of the run that made it |
BAD_SERVICE_ACCOUNT_KEY | The pasted JSON is not a service account key | Create a JSON key under Service accounts and paste that file |
SERVICE_ACCOUNT_REJECTED | The key was deleted or disabled | Create a new JSON key and paste it in |
SHEETS_API_DISABLED | The Sheets API is off in your Google Cloud project | Enable it under APIs & Services → Library |
TAB_NOT_FOUND | No tab with that name (names are case-sensitive) | Check the spelling of sheetName, or turn on createSheetIfMissing |
KEY_MISSING_IN_ROWS | Some rows have no value in the key column | The message gives the dataset row numbers; nothing was written |
ROW_LIMIT / CELL_LIMIT / COLUMN_LIMIT | The dataset is bigger than one run writes | Split it, write fewer columns, or lower maxRows |
QUOTA_EXHAUSTED | Google's rate limit, after several retries | Re-run in a minute |
MAX_COST_TOO_LOW | Your 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_CONFIRMED | The data-scope box is not ticked | Tick 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
OUTPUTrecord 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
OUTPUTrecord 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.