Google Form提交后发日历邀请脚本报push undefined错误求助
问题根因
报错TypeError: Cannot read property 'push' of undefined的核心原因是:当目标日历事件预先没有添加任何参会者时,Calendar API返回的事件对象不存在attendees属性,该字段值为undefined,无法直接调用数组的push方法。部分用户运行正常是因为其测试的日历事件本身已存在至少1名参会者,attendees数组已完成初始化,所以可以正常操作。
修复后的完整代码
仅需修改addGuestAndSendEmail函数中attendees变量的初始化逻辑,给不存在的attendees字段默认赋值为空数组即可:
// Add a trigger - add guest on form submit function Initialize() { var triggers = ScriptApp.getProjectTriggers(); for(var i in triggers) { ScriptApp.deleteTrigger(triggers[i]); } ScriptApp.newTrigger("addGuest") .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) .onFormSubmit() .create(); } function addGuest(e) { // 日历ID可在日历的“设置和共享”>“整合日历”中获取,通常为你的谷歌邮箱地址 var calendarId = "EMAIL ADDRESS GOES HERE"; // 确认此处字段名和你Google Form里的邮箱字段名称完全一致,大小写敏感 var email = e.namedValues['Email'].toString(); // 仅支持单场活动,或重复活动的首个实例 var eventId = "EID GOES HERE"; addGuestAndSendEmail(calendarId, eventId, email); } // 需提前开启Google Calendar高级API服务 // 若为重复活动,仅对首个实例生效 function addGuestAndSendEmail(calendarId, eventId, newGuest) { var event = Calendar.Events.get(calendarId, eventId); // 关键修改:attendees不存在时默认赋值为空数组 var attendees = event.attendees || []; attendees.push({email: newGuest}); var resource = { attendees: attendees }; var args = { sendUpdates: "all" }; Calendar.Events.patch(resource, calendarId, eventId, args); }
额外注意事项
- 首次运行
Initialize函数创建触发器时,必须完成所有权限授权,确保脚本持有表格读取、日历编辑的对应权限 - 若需要为重复活动的所有场次添加参会者,需额外查询活动的所有实例后逐场调用添加逻辑
- 可按需添加
try-catch代码块捕获运行异常,方便后续定位其他偶发问题
内容的提问来源于stack exchange,提问作者marcwalsh
相关产品推荐
相关产品推荐

