如何让Google Sheet变更日志追踪行删除操作?
如何在Google表格变更日志中追踪行删除操作
你的onEdit脚本属于简单触发器,仅能响应单元格的编辑(输入、修改)操作,无法捕获行删除这类变更。要实现行删除的追踪,需要使用可安装的 onChange 触发器——它能监听电子表格的更多事件类型,包括行/列删除、格式更改等。
完整解决方案脚本
替换原脚本为以下代码,既保留原有的单元格编辑追踪逻辑,又新增行删除记录功能:
// 保留原有的单元格编辑追踪 function onEdit(e){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetNameTracker = ss.getActiveSheet().getName(); if (sheetNameTracker !== "Changelog") { let sheet = ss.getSheetByName('Changelog'); var range = e.range.getA1Notation(); var user = e.user?.getUsername() || '未知用户'; var function_source = "onEdit"; var time = new Date(); var changeType = 'EDIT'; var oldValue = e.oldValue; var newValue = e.value; var lastRow = sheet.getLastRow(); sheet.getRange(lastRow+1,1,1,8).setValues([[time.toLocaleString(),function_source,changeType,sheetNameTracker,range,user,oldValue,newValue]]); } } // 新增行删除追踪的 onChange 函数 function onChange(e) { const ss = e.source; const changelogSheet = ss.getSheetByName('Changelog'); if (!changelogSheet || e.changeType !== 'REMOVE_ROW') return; const time = new Date(); const functionSource = "onChange"; const changeType = 'DELETE_ROW'; const sheetName = e.range.getSheet().getName(); const deletedRange = e.range.getA1Notation(); const user = Session.getActiveUser().getUsername() || '未知用户'; // 记录行删除信息,如需追踪被删行具体内容,可参考下方进阶优化 const lastRow = changelogSheet.getLastRow(); changelogSheet.getRange(lastRow + 1, 1, 1, 8).setValues([ [time.toLocaleString(), functionSource, changeType, sheetName, deletedRange, user, '整行删除', '无'] ]); }
配置可安装触发器
onChange是可安装触发器,无法自动生效,需手动配置:
- 打开Google表格的脚本编辑器(工具 > 脚本编辑器)
- 点击左侧菜单栏的「触发器」图标(时钟形状)
- 点击「添加触发器」按钮
- 配置参数:
- 要运行的函数:
onChange - 部署来源:
从电子表格 - 事件类型:
更改
- 要运行的函数:
- 点击「保存」,按提示完成权限授权
进阶优化(可选)
如果需要记录被删除行的具体内容,需要提前缓存工作表的行数据(比如用PropertiesService或隐藏表存储数据快照),在onChange触发时对比快照获取被删内容。该操作会增加复杂度,基础版本已能满足「记录删除操作发生」的核心需求。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

