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

如何在SpreadsheetTriggerBuilder的REMOVED_ROW类型onChange事件中获取删除行数?

获取Google Sheets中REMOVED_ROW事件的删除行数

确实,当删除多行时,sheet.getActiveRange()没法准确返回被删除的行范围——这是因为删除操作完成后,活动范围可能已经跳转到其他位置了。不过我们可以通过对比删除前后的工作表行数来解决这个问题,核心思路是用PropertiesService存储每次操作后的行数,触发REMOVED_ROW事件时计算差值。

具体实现步骤

  1. 利用PropertiesService持久化存储每个工作表的最新行数,这样每次删除操作发生时,我们可以拿当前行数和之前存储的行数做对比,差值就是删除的行数。
  2. 编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:29