Google Sheets自定义菜单clearCalendar报Script function not found
脚本报错根因排查与修正方案
核心报错原因
onOpen函数括号闭合位置错误:在调用addToUi()方法后没有给onOpen补上结束大括号,直接把后续的scheduleShifts(空注释版)、clearCalendar两个函数全部嵌套进了onOpen的函数作用域内部。这两个函数属于onOpen的内部局部函数,全局环境无法识别,因此点击菜单时会报「Script function not found」错误。- 函数重复定义:全局作用域已经存在一个可正常运行的
scheduleShifts函数,又在onOpen内部重写了同名称的空函数,代码结构混乱会导致Apps Script的函数识别出现异常。 - 附带逻辑错误:原
scheduleShifts中调用CalendarApp.getCalendarById时传入的是硬编码字符串"calendarID",没有传入之前从C1单元格读取到的变量calendarID,后续运行时会触发日历权限类报错。
修正后的标准代码结构
// 全局作用域下的日历同步函数 function scheduleShifts() { var spreadsheet = SpreadsheetApp.getActiveSheet(); var calendarID = spreadsheet.getRange("C1").getValue(); var eventCal = CalendarApp.getCalendarById(calendarID); var signups = spreadsheet.getRange("A2:C3").getValues(); for (x=0; x<signups.length; x++) { var shift = signups[x]; var startTime = shift[0]; var endTime = shift[1]; var volunteer= shift[2]; eventCal.createEvent(volunteer, startTime, endTime); } } // 全局作用域下的日历清理函数 function clearCalendar() { var spreadsheet = SpreadsheetApp.getActiveSheet(); var calendarID = spreadsheet.getRange("C1").getValue(); var eventCal = CalendarApp.getCalendarById(calendarID); var signups = spreadsheet.getRange("A2:C3").getValues(); // 按排班表的时间范围匹配对应日历事件并删除 for (x=0; x<signups.length; x++) { var shift = signups[x]; var targetEvents = eventCal.getEvents(shift[0], shift[1]); targetEvents.forEach(event => event.deleteEvent()); } } // 自定义菜单加载入口 function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Sync to Calendar') .addItem('Schedule shifts', 'scheduleShifts') .addSeparator() .addItem('Delete shifts from Calendar','clearCalendar') .addToUi(); }
调试注意事项
- 所有需要被自定义菜单触发的函数,必须定义在脚本的全局作用域,不能嵌套在其他函数内部,否则Apps Script无法识别可调用入口。
- 单个脚本文件内禁止重复定义同名函数,后定义的函数会覆盖前者,导致原有逻辑失效。
- 保存修正后的代码后,重新打开关联的Google表格,触发
onOpen重新加载自定义菜单,再测试功能。
内容的提问来源于stack exchange,提问作者Zieyra
相关产品推荐
相关产品推荐

