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

Google Sheets脚本报错:TypeError: Cannot read property 'source' of undefined

修复Google表格复选框移动行脚本的报错问题

报错原因解析

TypeError: Cannot read property 'source' of undefined 这个错误出现在onEdit函数第9行,核心原因有两个:

  • 手动运行onEdit函数时未传入event参数,导致event为undefined,调用event.source自然报错;
  • onCheck不是Google Apps Script的内置简单触发函数,勾选复选框不会自动触发它,且它内部用SpreadsheetApp.getActiveRange()的方式不够可靠。

另外代码还存在几个细节问题:

  • 工作表名拼写错误:你提到的工作表是Submitted,但代码里写的是Submited Routes(多了一个m);
  • 重复获取表格对象:var ss和var s都是获取当前活动表格,属于冗余代码;
  • 布尔值大小写不规范:JavaScript里应使用小写的true/false,而非大写的TRUE/FALSE。

修复后的完整代码

function onEdit(event) {
  // 先判断event是否存在,避免手动运行脚本报错
  if (!event) return;
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeRange = event.range;
  var activeSheet = activeRange.getSheet();
  var cellValue = activeRange.getValue();

  // 处理Working on和Submitted Routes之间的行移动(第9列复选框)
  if (activeSheet.getName() === "Working on" && activeRange.getColumn() === 9 && cellValue === true) {
    var targetSheet = ss.getSheetByName("Submitted Routes");
    moveRow(activeSheet, activeRange.getRow(), targetSheet);
  } else if (activeSheet.getName() === "Submitted Routes" && activeRange.getColumn() === 9 && cellValue === false) {
    var targetSheet = ss.getSheetByName("Working on");
    moveRow(activeSheet, activeRange.getRow(), targetSheet);
  }

  // 处理Working on和Missed之间的行移动(第11列复选框)
  if (activeSheet.getName() === "Working on" && activeRange.getColumn() === 11 && cellValue === true) {
    var targetSheet = ss.getSheetByName("Missed");
    moveRow(activeSheet, activeRange.getRow(), targetSheet);
  } else if (activeSheet.getName() === "Missed" && activeRange.getColumn() === 11 && cellValue === false) {
    var targetSheet = ss.getSheetByName("Working on");
    moveRow(activeSheet, activeRange.getRow(), targetSheet);
  }
}

// 封装行移动逻辑,减少代码冗余
function moveRow(sourceSheet, rowNum, targetSheet) {
  var numColumns = sourceSheet.getLastColumn();
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sourceSheet.getRange(rowNum, 1, 1, numColumns).moveTo(targetRange);
  sourceSheet.deleteRow(rowNum);
}

关键优化点

  • 增加event存在性判断,避免手动运行脚本时触发错误;
  • 将原来的onCheck逻辑合并到onEdit中,无需额外创建触发器;
  • 封装moveRow函数,减少重复代码,提升维护性;
  • 修正工作表名拼写错误,统一布尔值为小写规范写法;
  • 直接从event.range获取编辑单元格,比getActiveRange()更可靠,避免其他操作干扰。

注意事项

  1. 确保你的工作表名和代码里的完全一致:Working on、Missed、Submitted Routes;
  2. 复选框所在列需对应代码里的第9列(I列)和第11列(K列),若列位置不同,修改对应的getColumn()判断值即可;
  3. 修改后的onEdit是内置简单触发函数,无需手动创建触发器,勾选复选框会自动触发执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:36:28