Connect Salesforce to Google Sheets
Give a stakeholder a Salesforce view they can open without a login, and let a team maintain a lookup table a flow reads live: a pipeline sheet refreshed on a schedule with a last-updated stamp, and a routing sheet the sales ops team edits that drives lead assignment. Rows are keyed by a column, not a shifting row number, and every write is an ordered run.
Why teams connect Salesforce and Google Sheets
A sheet is where a non-technical stakeholder wants a report, and where a team wants to keep a lookup table they can edit without a ticket. The manual version is a rep exporting a report each Monday, or an ops person copy-pasting a routing table into a flow's configuration.
- A pipeline or forecast sheet is refreshed on a schedule, with headers, formatting, and a last-updated cell, so a manager reads current data without a Salesforce seat
- A routing, pricing, or threshold sheet is read live by a flow, so a change the sales ops team makes takes effect on the next run with no deploy
- Rows are matched on a key column you choose, an ID or an email, never the row number, so an insert or a sort does not corrupt the sync
- Every write is an ordered run log with the range and the values, so a bad refresh can be traced and rolled forward
Worked example
The two flows most revenue-ops teams turn on first.
A refreshed open-pipeline sheet, and a routing sheet that drives lead assignment
One scheduled export flow, and one flow that reads the sheet as a config.
- Export trigger: a schedule every weekday at 07:00 in the sales leader's timezone.
- Query: Salesforce
Query (SOQL)for open opportunities with the owner, stage, amount, close date, and next step. - Write: Google Sheets
Update rangewrites the result toPipeline!A2:Hafter aClear range, keeping the header row and a formula summary below untouched, and setsMeta!B1tonow(). - Routing trigger: a lead-routing flow runs when a Salesforce Lead is created without an owner.
- Read the table: Google Sheets
Find rowinRouting!A:Dwherecountrymatches andsegmentmatches, returningowner_email. A catch-all row withcountry = ANYcovers the gaps. - Assign: Salesforce
Update recordsetsOwnerIdfrom the resolved email. If no rule matches, the flow appends a row toUnrouted!A:Dfor sales ops to fix. - Reprocess: a second flow polls
Unroutedand re-runs assignment once a matching rule is added.
Field mapping
The starting map for the open-pipeline export. The header row is the schema; the key column is what a later update matches on.
| Salesforce field | Sheet column (header) | Notes |
|---|---|---|
Opportunity.Id | opp_id | Key column. A row update matches on this, never on position. |
Opportunity.Name | name | |
Account.Name | account | Resolved in the SOQL, written flat. |
Owner.Name | owner | |
StageName | stage | |
Amount | amount | Written as a number, not a currency string, so the sheet can sum it. |
CloseDate | close_date | Written as an ISO date string so Sheets parses it as a date. |
NextStep | next_step | Truncated to keep the row readable. |
| (flow-generated) | Meta!B1 last-updated | Set to now() on every successful refresh, outside the data range. |
For the routing sheet the direction reverses: the sheet's columns (
country
,
segment
,
owner_email
,
notes
) are the source, and
Find row
returns
owner_email
for the flow to write to
Lead.OwnerId
.
What syncs, each direction
- Scheduled exports. Pipeline, forecast, activity, and renewal reports refreshed on a schedule with a last-updated stamp. (Salesforce to Sheets)
- Row-level updates. A specific opportunity or account row is updated in place when the record changes, matched on the key column. (Salesforce to Sheets)
- Config tables. Routing rules, discount thresholds, territory maps, and enum lookups are read live by flows so a business team owns them. (Sheets to Salesforce)
- Bulk edits and imports. A sheet a team fills in, new leads, account updates, is validated row by row and upserted into Salesforce, with errors flagged in a status column. (Sheets to Salesforce)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Ordered run log. Every write records the spreadsheet, the range, and the values. A bad refresh is visible and can be re-run against the last good query.
- Approval on bulk import. A sheet-to-Salesforce import can pause for review before the first run, so a mis-keyed column does not update a thousand records.
- Scoped access. Google uses OAuth scoped to the specific spreadsheets, or a service account only those sheets are shared with. Salesforce uses a permission set limited to the objects read and written.
- Environments. Build against a Salesforce sandbox and a copy of the sheet, then promote the same flow to production with the production spreadsheet.
Frequently asked questions
Can it update one row without rewriting the whole sheet?
Yes. The update matches on a key column you choose, an ID or an email, and changes only that row's cells. It never uses the row number, which shifts when rows are inserted or sorted.
How fresh is an exported sheet?
As fresh as the schedule. Common choices are every weekday morning for a pipeline sheet, or every 15 minutes for an ops dashboard. A row-level flow can also update a specific record on change.
Is a Google Sheet a safe place for a routing table?
For a small, human-maintained table, yes. Past tens of thousands of rows or with several flows writing it, move the data to a database and keep the sheet as a view. The connector flags this.
What happens if the sheet is missing a required column?
The flow stops with a clear error naming the column, rather than writing to the wrong place. Fix the header and replay.
Can it react to a sheet edit on the schedule you set?
Not natively. Google Sheets has no change webhook. The flow polls on a schedule, or you add an Apps Script trigger to the sheet for an event-driven start.
Connectors on this page
Salesforce
CRM
- Operations
- 1,296
- Typed outputs
- 57.9%
- Change triggers
- 95 (poll)
- Authentication
- OAuth2
Google Sheets
- Operations
- 17
- Typed outputs
- 100%
- Change triggers
- Poll or inbound webhook
- Authentication
- OAuth2
Bring one real integration
We will build it with you against your own systems, with the run log open.