A manually updated spend sheet, mapped into BigQuery with Upsert, so a correction updates a row instead of duplicating it.
No credit card. 14 days. Cancel in one click.
Quick answer: Add Google Sheets and BigQuery as connections, open Pipelines, Build, New Sync, and map the sheet's columns to a BigQuery table. Use Upsert with a real unique key if the sheet gets edited in place, not just appended to, then save it as a scheduled job. Pipelines tier.
A Google Sheets connection added under Databases, pointed at the sheet you want to pull from, and a working BigQuery connection as the target. Pipelines tier.
A marketing team keeps a manual spend sheet with columns campaign, channel, date, and spend, updated by hand a few times a week. Map those four columns to a BigQuery target:
Target table: `my-gcp-project.marketing.campaign_spend` Columns: campaign, channel, date, spend
Because rows in the sheet sometimes get corrected after the fact rather than only appended, set MODE to Upsert and choose a combination like campaign + date + channel as MATCH ON, assuming that combination is unique per row. QueryFlow handles the MERGE into BigQuery on those key columns; a corrected spend number updates the existing row instead of creating a duplicate. Save it as a job running nightly, after the team's usual end-of-day update to the sheet.
A manually maintained sheet gets edited in place more often than a system-generated export does. Insert alone would just pile up a new row every run even when nothing actually changed, or worse, duplicate a row that was only corrected. Upsert with a real unique key avoids both.
A table named sheet_import tells nobody what's in it six months from now. Name the target for what it holds, marketing.campaign_spend, and name the sync itself the same way, "Marketing spend sheet to BigQuery," so it's identifiable in the Pipelines list without opening it to check.
If most of what you sync from sheets lands in the same BigQuery dataset, set that dataset as the connection's Default Dataset when you add it. The Target Table field then only needs the table name, campaign_spend, rather than the fully qualified path every time you build a new sync against the same destination.
Run Dry Run first and check the preview against what the sheet currently shows. After a real run, check the job's history: a clean run reports rows synced with no errors.
| If you see | Fix |
|---|---|
| No BigQuery connections available | Add a BigQuery connection under Databases first, see the BigQuery connect tutorial. |
| Duplicate key values in source | The MATCH ON combination you picked isn't actually unique per row in the sheet. Add another column to the key, or clean up the sheet. |
| Type mismatch on spend or date | A spreadsheet stores everything as text or a loosely typed number by default; check the target column's type matches what the sheet is actually sending. |
| A blank row in the sheet breaks the run | A stray blank row past your data range gets read as a row of nulls. Tighten the source range to exclude it. |
It doesn't watch the sheet for a live edit and sync that instant, it's a scheduled job, so plan the interval around how often the sheet actually changes, not how anxious you feel about it.
The alternative most teams actually do today is exporting the sheet to CSV and loading that manually, or writing a small Apps Script that pushes rows out on a timer. Both work, but both are one more thing to remember or one more script to keep running. A Data Sync job lives next to your other scheduled jobs in QueryFlow, shows up in the same run history, and needs nothing installed inside the spreadsheet itself.
Once one sheet-to-BigQuery sync is working, the same mapping pattern, Sheets connection as source, a MATCH ON that's actually unique, Upsert for anything hand-edited, carries over to any other manually maintained sheet worth getting into the warehouse: a headcount tracker, a vendor list, a manually curated exceptions list a report needs to join against.
See also: Integrations Load a CSV into BigQuery on Mac Sync Databricks to BigQuery.
No. Data Sync reads the sheet directly through QueryFlow's Google Sheets connection; there's no script to write, deploy, or debug inside the spreadsheet.
Insert alone would just add duplicate rows every run. If the sheet gets edited rather than appended to, use Upsert with a MATCH ON column that uniquely identifies each row, a campaign ID or a date-plus-channel combination.
No, it's a scheduled sync, not a live watch on the sheet. It runs on whatever cadence you set, hourly, nightly, or on demand from Build.
Data Sync is a Pipelines feature. Studio covers connecting to and querying both Google Sheets and BigQuery, but not building a sync between them.
14-day free trial, no card. Map it once, sync it nightly.
No credit card. 14 days. Cancel in one click.