chatformdocs

Google Sheets & Excel

Connect Google Sheets in one click, download a file, or give Excel a link that stays current.

Google Sheets

Open a form, go to Integrate → Google Sheets & Excel and press Connect Google Sheets. Google asks you to approve once, and a new sheet appears in your Drive with two tabs:

  • Completed holds every finished response, one row each.
  • Partial holds responses people started and did not finish. A response moves to Completed when it is finished.

Responses already collected are written straight away, and each new one is added within a few seconds of arriving. Unfinished responses reach the sheet a few minutes after the respondent goes quiet.

What Chatform can see

Only the sheets it creates. The permission Google shows is "See, edit, create and delete only the specific Google Drive files you use with this app": Chatform cannot open anything else in your Drive.

Your own columns and tabs

A response is found by its id in column A and written under the matching column headings, so a column you add for your own notes is left alone. A question you add to the form becomes a new column at the end.

Sync now rewrites both tabs from scratch, in the form's question order. It also removes responses you deleted in Chatform. Keep anything you would not want rewritten on a tab of your own in the same sheet.

Partial responses and your plan

The Partial tab needs a plan that includes exporting unfinished responses. On other plans the tab holds a link to upgrade, and fills in on its own once you do. Completed responses are yours on every plan.

Disconnecting

Disconnect stops new responses being added. The sheet stays in your Drive. If you remove Chatform's access from your Google account instead, the card shows Needs reconnect, and reconnecting carries on with the same sheet.

A file

From Integrations → Google Sheets & Excel in the dashboard. Add ?includePartials=true to include unfinished responses.

Those download links go through the browser session, not a key — there is no API key that can call them. From your own code, ask for an export instead and poll it:

curl -X POST https://api.chatform.in/v1/forms/$FORM_ID/exports \
  -H "x-api-key: $CHATFORM_SECRET_KEY" \
  -H "content-type: application/json" \
  -d '{"format": "csv"}'

The API writes csv or json; the typed .xlsx workbook described below is produced by the dashboard only.

Exports →

The workbook is a real .xlsx, not a renamed CSV: typed cells, a frozen bold header, filters, and columns sized to their contents. It also keeps the leading zeros on things that look like numbers and are not — 007, 0044 7700 900123 — which is the single most common way an exported phone column is destroyed.

Create a feed URL in Integrate → Google Sheets & Excel → Create feed URL. In Excel: Data → From Web, paste the URL, and set the refresh interval in the query properties. New responses appear on their own.

Anything else that can import a CSV from a URL works the same way. In a Google Sheet you would rather not connect, that is one cell:

=IMPORTDATA("https://api.chatform.in/p/feed/cff_…​.csv")

What the feed is

A stable CSV of this form's responses, with the same columns as the export — one per question, titled with the question rather than its ref.

Cells that a spreadsheet would execute rather than display (=, +, @, and a leading - that is not a number) are prefixed with an apostrophe. Respondents type these rows, and a spreadsheet treats a leading = as a program.

The URL is the credential

A spreadsheet cannot send a cookie or an Authorization header — it fetches a URL on a schedule and nothing else. So the token in the path is the whole credential, the same trade the signed download links make:

  • 192 bits of CSPRNG output, looked up by hash, never guessable.
  • Anyone holding the link can read the responses. Treat it like a password.
  • Rotate issues a new URL and kills the old one; Revoke kills it with no replacement. Both are immediate, and both leave any sheet using the old URL showing an error in the cell rather than stale data.

The feed serves the 5,000 most recent responses. Past that, use the exports API, which is built for the whole history.

Unfinished responses in the feed need the same plan as unfinished responses in the CSV. What you finished collecting is yours on every plan.

On this page