Google Sheets下拉菜单触发数据复制脚本报错求助
修复后的Google Sheets脚本
报错原因分析
TypeError: Cannot read properties of undefined (reading 'source'):手动运行onEdit函数时,系统不会自动传入event参数,导致event.source无法读取;同时原脚本存在语法错误,加剧了问题。- 语法错误:
If应为小写的if,且每个if语句末尾多了分号,导致后续代码块不受条件约束。 - 原脚本使用
moveTo并删除Main表行,不符合“不删除Main表记录”的需求。
修复后的代码
function onEdit(event) { // 防御性判断:避免手动运行时无event参数报错 if (!event) { SpreadsheetApp.getUi().alert("请通过编辑单元格触发此脚本,不要手动运行!"); return; } const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = event.source.getActiveSheet(); const activeRange = event.source.getActiveRange(); // 仅处理Main表第6列(Status列)的编辑 if (activeSheet.getName() !== "Main" || activeRange.getColumn() !== 6) { return; } const statusValue = activeRange.getValue(); let targetSheetName; // 根据Status值匹配目标工作表 switch(statusValue) { case "Completed": targetSheetName = "Completed"; break; case "Pending": targetSheetName = "Pending"; break; case "Hold": targetSheetName = "Hold"; break; default: // 非指定状态,不执行操作 return; } const targetSheet = ss.getSheetByName(targetSheetName); if (!targetSheet) { SpreadsheetApp.getUi().alert(`未找到名为${targetSheetName}的工作表,请检查名称!`); return; } const row = activeRange.getRow(); const numColumns = activeSheet.getLastColumn(); // 获取目标表下一行的起始位置 const targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // 复制行数据到目标表(保留原表数据) activeSheet.getRange(row, 1, 1, numColumns).copyTo(targetRange); }
关键修改说明
- 防御性判断:增加
if (!event)判断,避免手动运行脚本时触发报错,同时给出明确提示。 - 语法修正:将
If改为小写if,移除if语句末尾的多余分号,确保条件逻辑生效。 - 逻辑调整:用
copyTo替代moveTo,删除deleteRow代码,保留Main表原记录。 - 代码优化:使用
switch语句替代重复的if判断,减少冗余代码,提升可读性。 - 错误处理:增加目标表不存在的判断,给出提示信息,避免静默失败。
内容的提问来源于stack exchange,提问作者Mohammad Haneef Ahmad
相关产品推荐
相关产品推荐

