← Back to blog
google-sheetsautomationapps-scripttutorials

Google Sheets: Send Email When Cell Changes (Step-by-Step)

February 7, 2026·Sam Ralston
Close-up of a spreadsheet cell being edited with a cursor on screen

One of the most common Google Sheets automation requests is simple: "email me when a cell changes." Maybe you want to know when a status updates, when a number crosses a threshold, or when someone fills in a blank cell.

Google Sheets does not have a built-in "email on cell change" feature. But Apps Script makes it possible. Here is the exact code, step by step.

The Basic Approach

Apps Script has two types of triggers that can detect changes:

onEdit trigger: Fires when a user manually edits a cell. Does not fire for formula changes or programmatic edits.

onChange trigger: Fires on broader changes including structure changes (adding rows/columns) and some programmatic edits. Also fires on manual edits.

For most "email me when a cell changes" use cases, you want onEdit. Here is the code.

Step 1: Open Apps Script

In your Google Sheet, go to Extensions > Apps Script. Delete any existing code.

Step 2: Paste This Script

function onEditAlert(e) { var range = e.range; var sheet = range.getSheet(); var sheetName = sheet.getName(); var row = range.getRow(); var col = range.getColumn(); var oldValue = e.oldValue || "(blank)"; var newValue = e.value || "(blank)"; // Only trigger for specific sheet and column if (sheetName !== "Sheet1") return; if (col !== 5) return; // Column E var subject = "Cell Changed in " + sheetName; var body = "A cell was edited in your Google Sheet. " + "Sheet: " + sheetName + " " + "Cell: " + range.getA1Notation() + " " + "Row: " + row + " " + "Old value: " + oldValue + " " + "New value: " + newValue + " " + "Item: " + sheet.getRange(row, 1).getValue(); MailApp.sendEmail("[email protected]", subject, body); }

Replace "[email protected]" with your email. Change "Sheet1" to your tab name. Change column number 5 to whichever column you want to monitor (A=1, B=2, C=3, etc.).

Step 3: Set Up the Trigger

This is important. A simple onEdit function runs automatically, but it can not send emails due to permission restrictions. You need an "installable trigger."

Click the clock icon in the left sidebar. Click "Add Trigger." Configure it:

Function: onEditAlert. Event source: "From spreadsheet." Event type: "On edit."

Save it. Now every time someone edits a cell in column E of Sheet1, you get an email with the old value, new value, and row details.

Filtering for Specific Changes

The basic script fires on every edit in the target column. Here are common filters:

Only Alert When Value Changes to Something Specific

if (newValue !== "OVERDUE") return;

Add this line after the column check. Now it only emails you when someone types "OVERDUE" into column E.

Only Alert When a Blank Cell Gets Filled

if (oldValue !== "(blank)") return;

This only fires when a previously empty cell gets a value. Great for tracking when payments come in or forms get submitted.

Only Alert When Value Exceeds a Threshold

if (isNaN(newValue) || Number(newValue) <= 1000) return;

This only fires when someone enters a number greater than 1000. Useful for expense tracking or budget monitoring.

Watching Multiple Columns

To monitor several columns, change the single column check to a list:

var watchColumns = [3, 5, 7]; // Columns C, E, G if (watchColumns.indexOf(col) === -1) return;

Now the script triggers on edits to any of those three columns.

Including Row Context in the Email

A bare "cell E5 changed" email is not very useful. Add context by pulling data from other columns in the same row:

var itemName = sheet.getRange(row, 1).getValue(); var category = sheet.getRange(row, 2).getValue(); var body = "Change detected: " + "Item: " + itemName + " " + "Category: " + category + " " + "Column E changed from " + oldValue + " to " + newValue;

Now your email tells you exactly which item changed, not just which cell.

Common Gotchas

Pasting data does not trigger onEdit reliably. If someone pastes multiple cells at once, the trigger fires once but e.value may be undefined. Use range.getValues() instead for paste-safe handling.

Formula results do not trigger onEdit. If cell E5 has a formula like =IF(D5>100, "ALERT", "OK"), changing D5 recalculates E5. But onEdit only fires for direct edits, not formula recalculations. To monitor formula-driven changes, you need a time-based trigger that compares current values to stored previous values.

Daily email limits apply. Free Google accounts can send 100 emails per day via Apps Script. If your sheet gets edited 200 times, the last 100 emails will fail silently.

The trigger can break without warning. Google occasionally revokes trigger permissions during account security reviews. Your script stops running and you get no notification. Check your triggers periodically.

When Apps Script Is Not Enough

Apps Script works well for detecting manual edits. But it has real limitations.

It can not detect formula-driven changes. It breaks silently. It has email quotas. And most importantly, it can not detect the absence of a change. If you are waiting for someone to fill in a cell and they never do, onEdit never fires because nothing happened.

For use cases like "email me if this cell is STILL blank after a deadline," you need a different approach. A time-based trigger that checks conditions on a schedule. I covered that in detail in how to set up email alerts in Google Sheets.

For rent tracking specifically, the "cell is still blank after the due date" scenario is exactly the problem. Apps Script can handle it with a daily time-based trigger, but maintaining that code gets old fast. That is why I built RentGuard - it checks your sheet daily and texts you when something is overdue, no code required.

Need alerts for missing data, not just changes? RentGuard monitors your Google Sheet daily and alerts you when cells that should be filled are still blank past a deadline. Start free.
📋 Free templates: We built 6 free spreadsheet templates for landlords — rent tracking, maintenance logs, lease management, expense tracking, and more. Pre-formatted for Google Sheets and Excel.

For more Google Sheets automation techniques, see how to automate your spreadsheet and conditional notifications in Google Sheets.

Stop missing late rent payments

RentGuard monitors your Google Sheet and alerts you when rent is overdue or maintenance is aging. No migration. 5 minute setup. 30 days free.

Start Free Monitoring →