如何在SpreadsheetTriggerBuilder的REMOVED_ROW类型onChange事件中获取删除行数?
获取Google Sheets中REMOVED_ROW事件的删除行数
确实,当删除多行时,sheet.getActiveRange()没法准确返回被删除的行范围——这是因为删除操作完成后,活动范围可能已经跳转到其他位置了。不过我们可以通过对比删除前后的工作表行数来解决这个问题,核心思路是用PropertiesService存储每次操作后的行数,触发REMOVED_ROW事件时计算差值。
具体实现步骤
- 利用
PropertiesService持久化存储每个工作表的最新行数,这样每次删除操作发生时,我们可以拿当前行数和之前存储的行数做对比,差值就是删除的行数。 - 编写
onChange事件处理函数,专门监听REMOVED_ROW类型的操作,计算并输出删除行数。
完整代码示例
function handleOnChange(e) { // 只处理删除行的事件 if (e.changeType !== 'REMOVED_ROW') return; const targetSheetName = '你的工作表名称'; // 替换成你要监控的工作表名 const ss = e.source; const sheet = ss.getActiveSheet(); // 只监控指定工作表(可选,如果你需要监控所有工作表可以删掉这行) if (sheet.getName() !== targetSheetName) return; const sheetId = sheet.getSheetId(); const props = PropertiesService.getScriptProperties(); const prevRowCountStr = props.getProperty(`rowCount_${sheetId}`); // 第一次运行时,先存储当前行数,后续操作再计算删除量 if (!prevRowCountStr) { props.setProperty(`rowCount_${sheetId}`, sheet.getLastRow().toString()); console.log('已初始化行数存储,下次删除操作将统计行数'); return; } // 计算删除的行数 const prevRowCount = parseInt(prevRowCountStr); const currentRowCount = sheet.getLastRow(); const deletedRows = prevRowCount - currentRowCount; // 这里可以替换成你需要的业务逻辑,比如发送通知、记录日志等 console.log(`成功删除了 ${deletedRows} 行`); // 更新存储的行数为当前最新值 props.setProperty(`rowCount_${sheetId}`, currentRowCount.toString()); }
关键注意事项
- 安装触发器:这是安装式触发器,不是简单触发器。你需要手动添加:
- 打开脚本编辑器,点击顶部菜单的「编辑」→「当前项目的触发器」
- 点击「添加触发器」,选择函数
handleOnChange,事件类型选「从电子表格」→「更改」
- 多工作表支持:代码里通过
sheetId区分不同工作表,所以可以同时监控多个工作表的删除操作 - 边界情况处理:如果删除所有行,
currentRowCount会变成0,此时deletedRows就是之前的总行数,逻辑依然成立
内容的提问来源于stack exchange,提问作者Riyafa Abdul Hameed
相关产品推荐
相关产品推荐

