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.
-
File → Settings → Calculation, set
Iterative calculation to On, max iterations
1. -
In
C2, enter:=IF($B2="", "", IF(C2="", NOW(), C2))and fill it down column C. - 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.
- 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
B2resets 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:
- A simple
onEditonly 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
eisundefinedoutside a real edit. - Pasting or filling down a block,
e.rangecovers 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:
- add one or more watched ranges — each its own sheet, column, row range and rule, configured side by side instead of branching a single script;
- choose the stamp value — a timestamp, your own fixed text, or the editing user’s email;
- set a condition so it only stamps when the edit is a number, non-empty text, a date, or a ticked checkbox;
- toggle options: don’t overwrite an existing stamp, delete the stamp when the watched cell is cleared, require a specific value, or backfill rows that already have data.
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.
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 →