将Google表单数据导出至Google Calendar时遇TypeError错误求助
错误原因及修复方案
核心错误原因
TypeError: cal.createEvent is not a function 是因为 CalendarApp.getCalendarsByName('Paws Appointment Sample') 返回的是日历对象数组(即使只有一个匹配日历,也会返回长度为1的数组),而数组没有 createEvent 方法,必须获取数组中的单个日历实例才能调用该方法。
具体修复步骤
1. 正确获取日历对象
将日历获取代码修改为取数组的第一个元素,并添加容错判断(避免找不到日历时报错):
var calendars = CalendarApp.getCalendarsByName('Paws Appointment Sample'); if (calendars.length === 0) { Logger.log('未找到指定日历'); return; } var cal = calendars[0];
2. 修复结束时间计算错误
原代码中 endHours = 0+30+start.getHours() 逻辑错误(把30分钟当成小时累加),直接通过时间戳计算结束时间更简单可靠:
// 结束时间为开始时间加30分钟 var end = new Date(start.getTime() + 30 * 60 * 1000);
3. 修复未定义的函数调用
原代码中的 addGuest(email) 和 setDescription(fosterName) 是未定义的函数,应该使用创建的事件对象调用对应方法:
var event = cal.createEvent(animalName+' '+animalNumber+' Foster Walk-In Visit', start, end); event.addGuest(email); event.setDescription("寄养人姓名:" + fosterName);
4. 补全开始时间的时间部分
原代码中 start 只包含日期,没有时间(表单的time1-time7未被使用),需要将表单中的时间组件拼接后合并到日期中:
// 拼接表单中的时间部分(根据实际表单组件调整,示例假设time1-time5是小时、冒号、分钟、AM/PM) var timeStr = time1 + time2 + time3 + time5; // 合并日期和时间 var fullDateTimeStr = replace + " " + timeStr; var start = new Date(fullDateTimeStr);
修改后的完整代码
function createEvent() { var form = FormApp.openById('1Y2FnxrX_Z40qkva57Bt_NjYCfhZWciig-wWxbgmGwOM'); // 修复:正确获取日历对象 var calendars = CalendarApp.getCalendarsByName('Paws Appointment Sample'); if (calendars.length === 0) { Logger.log('未找到指定日历'); return; } var cal = calendars[0]; var responses = form.getResponses(); var len = responses.length; var last = len - 1; var items = responses[last].getItemResponses(); var email = responses[last].getRespondentEmail(); var type = items[0].getResponse(); var date = items[1].getResponse(); var time1 = items[2].getResponse(); var time2 = items[3].getResponse(); var time3 = items[4].getResponse(); var time4 = items[5].getResponse(); var time5 = items[6].getResponse(); var time6 = items[7].getResponse(); var time7 = items[8].getResponse(); // 修复:拼接时间并合并到日期 var timeStr = time1 + time2 + time3 + time5; // 根据表单实际结构调整 var replace = date.replace(/-/g, "/"); var fullDateTimeStr = replace + " " + timeStr; var start = new Date(fullDateTimeStr); Logger.log('完整开始时间: ' + start); // 修复:正确计算结束时间(加30分钟) var end = new Date(start.getTime() + 30 * 60 * 1000); Logger.log('结束时间: ' + end); var animalName = items[9].getResponse(); var animalNumber = items[10].getResponse(); var fosterName = items[12].getResponse(); var subject = "Foster Walk-In Visit: " + animalName; var url = 'https://calendar.google.com/calendar/embed?src=f16mtjblk9ttjhka4pfou8673c%40group.calendar.google.com&ctz=America%2FNew_York'; var body = "You can view your scheduled visit here " + url; // 创建日历事件 var event = cal.createEvent(animalName + ' ' + animalNumber + ' Foster Walk-In Visit', start, end); // 修复:使用事件对象添加嘉宾和描述 event.addGuest(email); event.setDescription("寄养人姓名:" + fosterName); GmailApp.sendEmail(email, subject, body); }
内容的提问来源于stack exchange,提问作者Randee Frankel
相关产品推荐
相关产品推荐

