无法获取Google日历活动嘉宾列表,脚本执行异常求助
问题分析与解决方案
你的脚本核心问题在于事件数据获取流程的冗余与同步延迟:通过Calendar.Events.list查询最新更新事件的方式,可能会拿到未同步嘉宾信息的旧版本事件;同时CalendarApp的嘉宾列表获取存在缓存延迟,导致无法读取到刚添加的嘉宾。
修复方案
1. 简化事件获取流程,直接使用触发器事件ID
触发器的e参数本身已包含触发事件的eventId,无需额外调用API查询最新事件,这能避免拿到未同步嘉宾的旧数据。
2. 同时结合Calendar API与CalendarApp获取嘉宾列表
Calendar API的数据更新更实时,可作为CalendarApp缓存的补充,确保能读取到嘉宾信息。
修改后的完整代码:
function onEventCreated(e) { try { var calendarId = e.calendarId; var eventId = e.eventId; // 直接从触发器获取事件ID if (!calendarId || !eventId) { Logger.log("Missing calendar ID or event ID."); return; } // 获取CalendarApp事件对象 var calendarEvent = CalendarApp.getCalendarById(calendarId).getEventById(eventId); if (!calendarEvent) { Logger.log("Event not found by ID: " + eventId); return; } // 通过Calendar API获取实时事件数据 var eventData = Calendar.Events.get(calendarId, eventId); var organizerEmail = eventData.organizer.email; // 从API提取嘉宾(排除组织者) var apiGuests = eventData.attendees ? eventData.attendees.filter(attendee => attendee.email !== organizerEmail) : []; // 从CalendarApp提取嘉宾 var appGuests = calendarEvent.getGuestList(false); // 优先使用API的嘉宾数据,避免缓存问题 var targetGuests = apiGuests.length > 0 ? apiGuests : appGuests; Logger.log("Retrieved guest list: " + JSON.stringify(targetGuests)); if (targetGuests.length !== 1) { Logger.log(`Event must have exactly 1 guest. Found: ${targetGuests.length}`); return; } // 兼容两种嘉宾对象的属性 var guest = targetGuests[0]; var guestEmail = guest.email || guest.getEmail(); var guestName = guest.name || guest.getName() || guestEmail; var organizerName = organizerEmail; var folderName = `${organizerName} + ${guestName} Handoff`; // 创建Drive文件夹并设置权限 var newFolder = DriveApp.createFolder(folderName); Logger.log("Folder created: " + newFolder.getUrl()); newFolder.addEditor(organizerEmail); newFolder.addEditor(guestEmail); // 存储事件关联数据 var properties = PropertiesService.getScriptProperties(); properties.setProperty(calendarEvent.getId(), JSON.stringify({ "organizerEmail": organizerEmail, "guestEmail": guestEmail, "folderId": newFolder.getId() })); } catch (error) { Logger.log("Error in onEventCreated: " + error.toString()); } }
额外检查项
- 权限重新授权:删除脚本现有授权(在脚本编辑器的「项目设置」→「OAuth 同意屏幕」→「测试用户」中移除,或在Google账户的「安全」→「第三方应用权限」中删除),重新运行脚本触发授权流程,确保获得Calendar API与Drive API的完整权限。
- 触发器配置验证:确认触发器类型为**「日历事件创建」**,关联日历为你创建活动的目标日历,触发账户与脚本编写账户一致。
- 嘉宾状态确认:若添加的是自身备用邮箱,确保嘉宾状态为「已邀请」或「已接受」,而非未处理状态(部分情况下未确认的嘉宾可能无法被读取)。
内容的提问来源于stack exchange,提问作者alok
相关产品推荐
相关产品推荐

