You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Automatically logs every edit to a shared Google Sheet into a separate audit sheet with timestamp, editor email, sheet name, cell reference, old value, and new value. Provides a complete, queryable change history that Google Sheets' built-in version history cannot deliver at the cell level. Designed for shared spreadsheets where accountability and traceability matter.
Market Signal
Cell-level audit logging is the most-requested governance feature on Google Sheets community forums, asked consistently since 2019. Paid add-ons like Sheetgo Change Tracking and Track Changes for Sheets charge $5-15/user/month. Google Sheets' built-in version history shows file-level snapshots but does not attribute individual cell changes to specific users in a queryable format. Zero open-source alternatives exist in the Google Apps Script ecosystem.
User Signal
Shared spreadsheets are the backbone of small-team coordination — budgets, inventories, project trackers, and CRM data all live in Sheets. Without cell-level audit trails, teams resort to manual "who changed this?" investigations that waste time and erode trust. The project's zero-code deployment model makes this accessible to non-technical sheet owners (e.g., operations managers, team leads) who need accountability without learning to code.
Technical Opportunity
The onEdit simple trigger provides the event object with user email, edited range, and new value data. Combined with PropertiesService or a dedicated snapshot sheet for storing cell state (to capture oldValue reliably for multi-cell edits), this fits cleanly into the project's dual-layer architecture:
code.gs — thin wrapper installing the onEdit trigger
config.gs — target spreadsheet ID, audit sheet name, columns to monitor, retention period
The audit sheet itself becomes a powerful data source — users can filter, pivot, or chart change patterns directly in Sheets.
Assessment
Dimension
Score
Rationale
Feasibility
high
Uses standard GAS APIs (onEdit trigger, SpreadsheetApp, PropertiesService). Well-understood pattern with many tutorials.
Impact
high
Addresses top governance request for Sheets. Serves any team sharing spreadsheets. Free alternative to $5-15/user/mo paid tools.
Urgency
med
Stable, long-standing demand. No time-sensitive API window, but consistent unmet need.
Adversarial Review
Strongest objection: The onEdit event object does not reliably provide oldValue for multi-cell paste operations or range edits, creating audit gaps where changes are logged but the previous state is unknown.
Rebuttal: Store periodic cell snapshots via PropertiesService or a dedicated snapshot sheet (updated by a scheduled time-based trigger, e.g., every 5 minutes). On each edit event, compare the snapshot to the new value to reconstruct the old value for the audit log. This snapshot-diff approach is how enterprise audit tools work and is well within GAS capabilities and quota limits for typical shared sheets (PropertiesService supports 500KB per property store; snapshot sheets scale with the data). Document the snapshot frequency as a configurable trade-off between accuracy and performance.
Suggested Next Step
Prototype the onEdit handler with snapshot-diff logic for oldValue recovery. Define the audit sheet schema: timestamp | user | sheet_name | cell_ref | old_value | new_value | edit_type. Validate PropertiesService storage limits against typical sheet sizes (100-10,000 cells) and determine the optimal snapshot frequency.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Summary
Automatically logs every edit to a shared Google Sheet into a separate audit sheet with timestamp, editor email, sheet name, cell reference, old value, and new value. Provides a complete, queryable change history that Google Sheets' built-in version history cannot deliver at the cell level. Designed for shared spreadsheets where accountability and traceability matter.
Market Signal
Cell-level audit logging is the most-requested governance feature on Google Sheets community forums, asked consistently since 2019. Paid add-ons like Sheetgo Change Tracking and Track Changes for Sheets charge $5-15/user/month. Google Sheets' built-in version history shows file-level snapshots but does not attribute individual cell changes to specific users in a queryable format. Zero open-source alternatives exist in the Google Apps Script ecosystem.
User Signal
Shared spreadsheets are the backbone of small-team coordination — budgets, inventories, project trackers, and CRM data all live in Sheets. Without cell-level audit trails, teams resort to manual "who changed this?" investigations that waste time and erode trust. The project's zero-code deployment model makes this accessible to non-technical sheet owners (e.g., operations managers, team leads) who need accountability without learning to code.
Technical Opportunity
The onEdit simple trigger provides the event object with user email, edited range, and new value data. Combined with PropertiesService or a dedicated snapshot sheet for storing cell state (to capture oldValue reliably for multi-cell edits), this fits cleanly into the project's dual-layer architecture:
code.gs— thin wrapper installing the onEdit triggersrc/index.js— testable audit logging logic (event parsing, snapshot comparison, audit row generation)config.gs— target spreadsheet ID, audit sheet name, columns to monitor, retention periodThe audit sheet itself becomes a powerful data source — users can filter, pivot, or chart change patterns directly in Sheets.
Assessment
Adversarial Review
Strongest objection: The onEdit event object does not reliably provide
oldValuefor multi-cell paste operations or range edits, creating audit gaps where changes are logged but the previous state is unknown.Rebuttal: Store periodic cell snapshots via PropertiesService or a dedicated snapshot sheet (updated by a scheduled time-based trigger, e.g., every 5 minutes). On each edit event, compare the snapshot to the new value to reconstruct the old value for the audit log. This snapshot-diff approach is how enterprise audit tools work and is well within GAS capabilities and quota limits for typical shared sheets (PropertiesService supports 500KB per property store; snapshot sheets scale with the data). Document the snapshot frequency as a configurable trade-off between accuracy and performance.
Suggested Next Step
Prototype the onEdit handler with snapshot-diff logic for oldValue recovery. Define the audit sheet schema:
timestamp | user | sheet_name | cell_ref | old_value | new_value | edit_type. Validate PropertiesService storage limits against typical sheet sizes (100-10,000 cells) and determine the optimal snapshot frequency.All reactions