How to auto-send emails from Google Sheets
Send a personalised email to every row in your Google Sheet automatically — invoices, reminders, welcome letters, receipts. Here's how it's done and the pitfalls to avoid.
The workflow
Emailing from a spreadsheet is the single most common task we automate. The recipe is always the same: a sheet where each row is one message, a template that fills in the row's values, and a trigger that fires the send.
Your rows already hold the ingredients — customer name, invoice number, due date, attachment link. Apps Script reads a row, fills your template, attaches the file, and sends through your Gmail.
The status column pattern
The professional way to run this is with a status column. Each email is sent once — the script skips rows already marked 'sent' and marks rows as it finishes them. Double-sending is the #1 amateur mistake in this niche; the status column eliminates it.
You also get a natural log: run it again tomorrow and only new rows go out. Maintenance, reminders, and re-sends all become a matter of editing a cell.
The failure cases that matter
- Duplicate sends — fixed with the status column above.
- Partial failure — 500 emails, 4 fail; your script should retry or flag, never lose the count.
- Bouncing addresses — log the bounce so you can clean your list, don't just ignore it.
- Personalisation bugs — a template variable missing a fallback = 'Hi undefined'. Test with a real row first.
- Daily quotas — Gmail limits how much a script can send per day; schedule across days for big lists.
Triggers you can use
- On-form-submit — email the customer the moment their order lands.
- On-edit — react when a cell changes (e.g. marked 'approved').
- Time-driven — a daily digest, a weekly follow-up, or a monthly report.
- Button click — a 'Send now' button in the sheet for human control.
When to build vs buy
For low volume and simple content, the status-column pattern is buildable with Apps Script tutorials. For volume, attachments, GST invoices, or anything that touches customers, tested code with error alerts is worth the hire. That's Google Sheets automation territory: fixed quote, tested sends, documented handover.
