Guides

Add a timestamp when a cell changes in Google Sheets

A plain =NOW() never stays put — it re-evaluates every time the sheet recalculates. Here are the three ways to freeze the moment of an edit, and where each one falls short.

You want column C to record the date and time each row in column B was last edited — a “last touched” stamp that then stops moving. A bare =NOW() is volatile: it re-reads the clock on every recalculation, so it can never hold a past moment — no fixed stamp. TODAY() is the same. You have three options.

Method 1 — A self-referencing formula with iterative calculation

No script, but you have to change a file-wide setting.

  1. File → Settings → Calculation, set Iterative calculation to On, max iterations 1.
  2. In C2, enter: =IF($B2="", "", IF(C2="", NOW(), C2)) and fill it down column C.
  3. Format column C as date-time (Format → Number → Date time).

The formula references its own cell: while C2 is empty it writes NOW() once, then keeps returning its own stored value.

Watch out for:
  • Iterative calculation is a whole-file setting. It changes how every circular reference in the spreadsheet behaves and can mask genuine mistakes.
  • It stamps the first time a row gets a value and never again — it can’t record a later edit, and clearing then retyping B2 resets the stamp.
  • A stray recalculation or a copy-paste over column C can wipe the frozen values with no undo.
  • It can’t capture who made the edit, and it only reacts to values, not to formatting or checkbox changes.

Method 2 — An onEdit Apps Script trigger

Free and it stays with the file — but you also own the upkeep, and one script only covers one spreadsheet. Open Extensions → Apps Script, paste this, and save:

/** * Stamp column C with the current date-time whenever column B * on "Sheet1" is edited. Clears the stamp if B is emptied. */ function onEdit(e) { var sheet = e.range.getSheet(); if (sheet.getName() !== "Sheet1") return; var watchCol = 2; // B var stampCol = 3; // C if (e.range.getColumn() !== watchCol || e.range.getRow() < 2) return; var stampCell = sheet.getRange(e.range.getRow(), stampCol); if (e.value === undefined) { stampCell.clearContent(); // B was cleared } else if (!stampCell.getValue()) { stampCell.setValue(new Date()); // stamp once } }
Watch out for:
  • A simple onEdit only fires on a manual edit by someone with edit access — not on Google Form submissions, not for viewers, not for changes made by other scripts.
  • Running the function yourself from the editor throws, because e is undefined outside a real edit.
  • Pasting or filling down a block, e.range covers many rows; this version only stamps the row you land on — handling the whole range is more code.
  • You get one onEdit(e) per project. A second watched column, another sheet, or a different rule all pile into that same function as more branches — it only gets harder to follow.
  • The script lives in this spreadsheet only — every other file you want stamped, you paste and re-authorise it again, and so does each collaborator.
  • e.user.getEmail() is usually blank unless the editor is in your Workspace domain.

Method 3 — The SmartStamp add-on

Install once and it works in every spreadsheet on your account — now and later — set up from a panel, no code, with the edge cases already handled. In SmartStamp you:

Paste and fill-down are stamped across the whole affected range, and the configuration is saved per sheet, so it keeps running with no code to maintain.

Shared limit: methods 2 and 3 both build on Google’s edit events, which do not fire for Google Form submissions that write straight into the sheet. Stamping those needs a separate onFormSubmit trigger.

Which method should you use?

  Iterative formula onEdit script SmartStamp
Setup File-wide setting + formula Paste & maintain code Panel, no code
Stamps a later edit, not just the first No Yes (with logic) Yes
Handles paste / fill-down Fragile Extra code Built in
Can stamp the editor’s email No Domain only Yes
Conditions (number / text / date / checkbox) No Extra code Built in
Several watched ranges or rules A formula per column All in one onEdit Each configured on its own
Available in your other spreadsheets No — per file No — paste per file Yes — every sheet on your account
Upkeep Watch for wiped values You own every fix Updates itself
Cost Free Free Free plan, paid plans from €1.99/mo

The iterative formula is fine for a create-once “added on” date. Reach for an onEdit script if you’re comfortable maintaining a bit of code and only need one sheet handled. SmartStamp is the choice when the stamp has to survive pasting, react to a real condition, or record who made the change.

SmartStamp is launching soon

Automatic timestamps, custom values and editor email in Google Sheets — set up once per sheet, no script to maintain.

See how it works →