Google表格OnEdit脚本报错求助:实现两标签页数据自动同步至第三页
解决Google表格onEdit函数报错及同步需求问题
问题根源
- 重复定义onEdit函数:Google Apps Script不允许存在多个同名的简单触发函数(如
onEdit),第二个onEdit会被第一个覆盖;且手动执行该函数时没有传入事件对象e,直接调用e2.source就会触发Cannot read property 'source' of undefined错误。 - 冗余的范围获取:原代码中通过
e.source.getRange获取固定范围完全没必要,onEdit事件对象e已经包含编辑操作的上下文信息,可直接判断编辑的是哪个工作表。
修正后的代码
// 同步Purpose Driven Mission标签页数据到All Links function PurposeDrivenMission() { const spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('\'Purpose Driven Mission\'!D171') .copyTo(spreadsheet.getRange('\'All Links\'!GE1364'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); }; // 同步Eight Productivity Systems标签页数据到All Links function EightProductivity() { const spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('\'Eight Productivity Systems\'!D72') .copyTo(spreadsheet.getRange('\'All Links\'!GD2'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); }; // 统一的onEdit触发函数 function onEdit(e) { // 避免手动运行函数时报错 if (!e) throw new Error('请通过编辑表格触发此函数,不要手动运行'); const editedSheet = e.range.getSheet(); const sheetName = editedSheet.getName(); // 根据编辑的标签页执行对应同步逻辑 if (sheetName === 'Purpose Driven Mission') { PurposeDrivenMission(); } else if (sheetName === 'Eight Productivity Systems') { EightProductivity(); } }
代码说明
- 保留两个独立的同步函数,职责清晰,方便后续修改或扩展同步规则。
- 合并为单个
onEdit函数,通过e.range.getSheet()获取被编辑的工作表,判断名称后执行对应同步操作。 - 添加事件对象校验,避免手动运行函数时出现无意义报错。
内容的提问来源于stack exchange,提问作者Sohel Ahamed
相关产品推荐
相关产品推荐

