You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
  }
}

关键说明

  1. PropertiesService会将数据绑定到你的Google账号,仅当前脚本可访问,存储容量上限为500KB,适合普通规模的表格使用。
  2. 如果是首次编辑某单元格,会直接读取其当前值作为初始状态记录。
  3. 进阶版日志会包含:工作表名、单元格位置、修改时间、旧显示值、旧公式、新显示值、新公式。

内容的提问来源于stack exchange,提问作者TimM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:53:15