如何在Google表格OnEdit函数日志中添加单元格修改前的旧值?
如何在Google表格OnEdit日志中记录单元格修改前的旧值
原生的onEdit简单触发事件对象仅能通过e.oldValue获取修改前的单元格显示值(针对手动输入的文本/数值),无法直接拿到修改前的公式内容。如果需要完整记录旧值(包括公式本身),可以结合PropertiesService存储单元格历史状态,以下是两种实现方案:
基础版:记录修改前的显示值
如果只需要记录单元格修改前的显示值(无需记录旧公式),直接利用e.oldValue即可,修改代码如下:
function onEdit(e) { var sName = e.source.getActiveSheet().getSheetName(); if(sName !== "Logging") { var value; var oldValue = e.oldValue; // 获取修改前的显示值 var mA1 = e.range.getA1Notation().split(":")[0]; var time = new Date().toTimeString(); var form = ""; // 处理新值与公式 if(typeof(e.value) == 'string') { var aCell = e.source.getRange(mA1); value = aCell.getValue(); form = "'" + aCell.getFormula(); } else { value = e.value; var aCell = e.source.getRange(mA1); form = "'" + aCell.getFormula(); // 补充公式获取,避免空值 } // 新增旧值列到日志数组 var data = [sName, mA1, time, oldValue, value, form]; e.source.getSheetByName("Logging").appendRow(data); } }
进阶版:记录修改前的公式与显示值
如果需要记录修改前的公式本身(而非仅计算结果),可以通过PropertiesService存储每个单元格的最新状态,每次编辑时先读取旧状态作为日志的旧值,再更新存储内容:
function onEdit(e) { var sName = e.source.getActiveSheet().getSheetName(); if(sName !== "Logging") { var value; var oldValue; var oldFormula = ""; var mA1 = e.range.getA1Notation().split(":")[0]; var time = new Date().toTimeString(); var form = ""; // 生成唯一标识单元格的键(工作表名+单元格位置) var cellKey = `${sName}_${mA1}`; var userProps = PropertiesService.getUserProperties(); // 读取存储的旧单元格数据 var storedData = userProps.getProperty(cellKey); if (storedData) { [oldValue, oldFormula] = JSON.parse(storedData); } else { // 首次记录该单元格,直接获取当前初始值与公式 var targetCell = e.source.getRange(mA1); oldValue = targetCell.getValue(); oldFormula = targetCell.getFormula(); } // 处理新值与公式 if(typeof(e.value) == 'string') { var targetCell = e.source.getRange(mA1); value = targetCell.getValue(); form = "'" + targetCell.getFormula(); } else { value = e.value; var targetCell = e.source.getRange(mA1); form = "'" + targetCell.getFormula(); } // 更新存储的单元格最新状态(去掉公式前的单引号,存储原始公式) userProps.setProperty(cellKey, JSON.stringify([value, form.replace(/^'/, '')])); // 日志数组新增旧值、旧公式列 var data = [sName, mA1, time, oldValue, oldFormula, value, form]; e.source.getSheetByName("Logging").appendRow(data); } }
关键说明
PropertiesService会将数据绑定到你的Google账号,仅当前脚本可访问,存储容量上限为500KB,适合普通规模的表格使用。- 如果是首次编辑某单元格,会直接读取其当前值作为初始状态记录。
- 进阶版日志会包含:工作表名、单元格位置、修改时间、旧显示值、旧公式、新显示值、新公式。
内容的提问来源于stack exchange,提问作者TimM
相关产品推荐
相关产品推荐

