DocsRPA → Google Sheets

Google Sheets

Use a spreadsheet as the input list and the output log, so one process handles different rows on every run.

Google Sheets

The Google Sheet action reads a sheet into a variable, writes rows back, or clears a range — so a process can pull its input data from a spreadsheet and log its results to one. Combined with For Loop Data, that's the usual "run this once per row" pattern.

Public sheets need no setup at all

If the sheet is shared as Anyone with the link → Viewer, a Read works straight away — paste the spreadsheet ID and worksheet name and press Test. No key, no service account, nothing to configure.

Writing is different. Link sharing only ever grants read access, so Write and Clear always need the service-account setup below, even on a sheet that is public.

One-time setup (private sheets, and any write)

Access uses a Google service account — a robot Google account you create and share sheets with.

  1. In the Google Cloud console, create (or pick) a project and enable the Google Sheets API.
  2. Go to Credentials → Create credentials → Service account and create one.
  3. Open the new service account → Keys → Add key → Create new key → JSON. A .json file downloads.
  4. In Parallel, open ⚙ Settings → Google Sheets, paste the entire contents of that file, and click Connect. Parallel verifies the key immediately.
  5. Settings then shows the service account's email address. Open any spreadsheet you want to use, click Share, and share it with that address — Viewer is enough to read, Editor is required to write or clear.
The key never leaves your machine. It's encrypted at rest with your OS keychain and is deliberately excluded from cloud sync — unlike processes and schedules, which do sync, a private key stays on the machine you pasted it into. You'll need to paste it again on a second machine.

The Test button

Each Google Sheet step has its own Test button. It checks something Settings' Test can't: that this specific spreadsheet ID, worksheet, and range are reachable — which is where the usual mistake shows up, forgetting to share the sheet with the service account. A pass reports how many rows it found.

Test always performs a read, so it never touches your data — which also means it can't prove Editor access. A step set to Write or Clear can pass Test and still fail at run time if the sheet is only shared as Viewer.

Fields

FieldWhat it does
Operation typeRead, Write, or Clear.
Spreadsheet IDFrom the sheet's URL — the part between /d/ and /edit.
Worksheet nameThe tab's name, e.g. Sheet1. Names containing spaces are handled for you.
ScopeOptional A1 range within that tab, e.g. A1:B10. Blank means the whole sheet.
The first line is set to key Read onlyReshapes the result into objects keyed by the header row instead of a raw grid of rows.
Save to Read onlyVariable the result is stored in, as a JSON string.
Values Write onlyOne row per line, cells separated by commas. Every cell goes through ${...} interpolation.
Append Write onlyAdds rows after the last existing row instead of overwriting the range — the right choice for logging results.

Test

The step has its own Test button. It checks the things that are usually wrong: the spreadsheet ID, the worksheet name, the range — and above all, whether you actually shared the sheet with the service account. Settings has a Test too, but that only proves the key works, not that any particular sheet is reachable.

Test always reads, never writes — clicking it can't modify your data. The trade-off is that a passing test proves the sheet is reachable, not that you have Editor access, so a Write or Clear step can still fail on permissions after Test passes. Share as Editor if the step writes.

Example: run a process once per row

Read a sheet of accounts, loop over the rows, and append a result line for each — the shape most Sheets-driven automations take.

1. Google Sheet — Read
     Spreadsheet ID: 1AbC…                Worksheet: Accounts
     ☑ The first line is set to key       Save to: rows

2. Run JavaScript
     Script: JSON.parse(vars).map(r => r.email).join('\n')
     (turn the JSON into one email per line for the loop below)

3. For Loop Data — items: the emails, itemVariable: email
     └─ Go to URL:  https://example.com/login
     └─ Type:       selector #email, text ${email}
     └─ Google Sheet — Write
          Worksheet: Results   ☑ Append
          Values:    ${email},done
A read stores JSON text, since process variables are strings. To iterate it, parse it with a Run JavaScript step first (as above) — For Loop Data takes a plain list, not JSON.