Google Forms: one response per email

A Google Forms responses download (Responses → Download responses) from a form that collects email addresses.

Processed locally in your browser. File contents are not uploaded. No account needed.

Before and after

Made-up rows from the sample file, run through the same code Rote Workspace runs, when this page was built. Removed rows are struck through; changed cells are highlighted — point at one for its old value.

Data Workspacegoogle-forms-responses.csv4 rows · 4 columns · UTF-8 Processed locally

Original

Before: the sample file
RowTimestampEmail AddressYour nameWhich session?
22026/09/01 9:14:02 AM GMT+1ana@example.comAna SilvaMorning
3 (removed)2026/09/01 9:14:05 AM GMT+1Ana@Example.com (has spaces at its edges)Ana SilvaMorning
42026/09/01 10:02:40 AM GMT+1ben@example.comBen ColeAfternoon, Evening
52026/09/02 8:00:00 PM GMT+1cy@example.comCy DiazEvening

Result

After: Google Forms: one response per email
RowTimestampEmail AddressYour nameWhich session?
22026/09/01 9:14:02 AM GMT+1ana@example.comAna SilvaMorning
42026/09/01 10:02:40 AM GMT+1ben@example.comBen ColeAfternoon, Evening
52026/09/02 8:00:00 PM GMT+1cy@example.comCy DiazEvening

3 rows × 4 columns after the fixes · was 4 × 4 · 2 cells changed

· marks a space at the start or end of a value. The dots are not in the data; they show spaces you would otherwise not see.

Why

People submit a form twice — a double click, a correction — and the two rows differ only by Timestamp, so they are not exact duplicates and stay in every count.

What it does

  1. Trim spaces in every columnOn the sample: 1 cell changed
  2. lower-case "Email Address"On the sample: 1 cell changed
  3. Remove duplicates: rows with the same "Email Address" (ignoring case, ignoring extra spaces, blank keys never match), keeping the first of each groupOn the sample: 1 row removed

Your file needs this column, spelled exactly: Email Address. If one is missing or renamed, the workflow tells you which step it breaks and does not run.

It keeps each address's first row in the file. Google does not promise the rows are in time order, so sort by Timestamp first if you want a different one.

How to use it

  1. Download the workflow

    A small .json file with the steps above — no data. Want to try it first? Use the sample file (made-up rows).

  2. Open your export

    In the Data Workspace, choose your file. It is processed in your browser, not uploaded.

  3. Import, review, run

    Workflow → Import, choose the file — or skip the download: under Workflow → Templates, press Check & open. Each step is checked against your columns; press Run on this file, then Download.