为什么GAS中CalendarApp.getEventById()方法返回null?
问题根源
- 调用
getEventById时错误给变量id加了引号,实际传的是固定字符串"id",而非从表格读取的真实事件ID值,自然找不到对应事件返回null,这是最核心的问题 - 代码存在多个未定义变量:
ide.setAllDayDate(fecha)中的fecha未定义,应该使用前面拿到的date变量ide.setTitle(nombre)中的nombre未定义,应该使用前面拿到的title变量- 创建事件时
cal.createAllDayEvent(name, date)中的name未定义,应该使用title变量
- 缺少空值校验逻辑,即使后续ID正确,也可能因为事件被手动删除等场景返回null,没有判断就调用方法会直接报错
可行解决方案
修正后的完整代码
function syncSheetToCalendar() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test"); // 替换为你自己的日历ID const cal = CalendarApp.getCalendarById("替换为你的实际日历ID"); const lastRow = sheet.getLastRow(); // 批量读取所有需要的数据,避免循环中反复调用接口提升运行效率 const rangeData = sheet.getRange(3, 3, lastRow - 2, 7).getValues(); // 读取第3行开始的第3到第9列数据 for (let i = 0; i < rangeData.length; i++) { const row = rangeData[i]; const title = row[0]; // 对应原表格第3列 const date = row[5]; // 对应原表格第8列 let eventId = row[6]; // 对应原表格第9列 // 跳过无日期的行 if (!date) continue; if (eventId && eventId !== 0) { // 直接传eventId变量,不要加引号 const event = cal.getEventById(eventId); // 增加空值校验,避免事件被删除导致的报错 if (event) { const existingDate = event.getAllDayStartDate(); const existingTitle = event.getTitle(); // 转时间戳对比日期,避免时区、格式差异导致的判断错误 const isDateSame = existingDate.getTime() === new Date(date).getTime(); if (!isDateSame) { event.setAllDayDate(date); } if (existingTitle !== title) { event.setTitle(title); } } else { // 原ID对应事件不存在时重新创建 const newEvent = cal.createAllDayEvent(title, date); sheet.getRange(i + 3, 9).setValue(newEvent.getId()); } } else { // 无事件ID时直接新建 const newEvent = cal.createAllDayEvent(title, date); sheet.getRange(i + 3, 9).setValue(newEvent.getId()); } } }
额外注意事项
- 如果修改后依然有找不到事件的情况,可以先打印读取到的
eventId,和日历后台实际事件的ID对比,确认没有空格、换行等多余字符 - 不需要额外配置多余的oauthScopes,只要保留
https://www.googleapis.com/auth/calendar和https://www.googleapis.com/auth/spreadsheets.currentonly即可正常运行
内容的提问来源于stack exchange,提问作者JupiterJones
相关产品推荐
相关产品推荐

