Real-time data cleaning workflow for messy Google Sheets data (phone/email/date normalization)

Sharing a workflow I built to solve a pretty common problem: messy, inconsistently formatted data in Google Sheets.

The use case:

The source sheet had:

  • Phone numbers in 5+ formats (1711019283, +8801711019283, +880-1678-231920)
  • Email typos in the domain (gmail.co, gmial.com)
  • Inconsistent status casing (active, ACTIVE, pending)
  • Join dates in multiple formats mixed in one column

Manually fixing this every time new data came in wasn’t sustainable, so I automated it.

The workflow (3 nodes):

  1. Google Sheets Trigger (anyUpdate) — fires instantly whenever a row is added or edited, no polling needed
  2. Code node (JavaScript) — runs the actual transformation logic: normalizes phone formats, corrects common email domain typos, standardizes status casing, unifies date formats
  3. Google Sheets — Append or Update Row — writes the cleaned row back to the sheet, matched by ID, with a Cleaned_Status column to track what’s already processed
Google Sheets Trigger (anyUpdate) → Code (JS transform) → Append/Update Row in Sheet

Why this approach:

  • Trigger-based instead of scheduled → data is clean within seconds, not batched once a day
  • Field-level normalization functions (one function per field type) kept the Code node easy to maintain and extend
  • The Cleaned_Status flag made it easy to debug and avoid reprocessing rows

Result: zero manual cleanup, fully consistent formatting across the sheet, and a good chunk of hours saved weekly.

Happy to share the workflow JSON if anyone wants to adapt it for their own use case — just let me know what fields you’re normalizing and I can walk through tweaking the Code node logic.