Apps Script自动审批脚本调用Calendar.Events.get读取第三方日历事件失败求助
问题描述
我开发了一款自动审批用的Apps Script,整体运行正常,但遇到一个边缘场景问题:
正常流程里,我用这段代码获取指定时间范围的日历事件:
calendar = CalendarApp.getDefaultCalendar(); calendar.getEvents(startDate, endDate);
遍历事件后通过自定义逻辑判断是否自动审批、修改事件颜色,完成审批还需要调用高级日历服务的Calendar.Events.get(calendarId, eventId)获取事件对象。
但对于第三方服务(仅获授权代表我方域名发信,非Google MX服务器直接发送)创建的事件,逻辑完全失效。手动操作这类事件时,Google日历会提示:
The event wasn't created in Google Calendar, so you can't add a room. Instead, you can create a duplicate event without guests to reserve a room and invite people to use it.
代码调用Calendar.Events.get(calendarId, eventId)时抛出异常:
GoogleJsonResponseException: API call to calendar.events.get failed with error: Not Found
我试过用event.getId()返回的完整ID、去掉@后的部分等多种格式,都找不到对应事件。补充:这类事件由外部服务(本次是招聘平台Comeet)创建,组织者是scheduler@comeet-notifications.com,我只是受邀嘉宾。
问题原因
这类事件属于Google日历的拟议事件(Proposed Events),是通过邮件邀请同步到日历的非原生事件——它们没有生成Google Calendar API可识别的完整事件ID,因此无法通过Calendar.Events.get直接获取。
解决办法
1. 提前过滤非原生事件
遍历事件时,用event.isOwnedByMe()判断是否为自己创建的事件,第三方创建的受邀事件直接跳过API调用,走替代流程:
const events = calendar.getEvents(startDate, endDate); events.forEach(event => { if (!event.isOwnedByMe()) { console.log('跳过第三方创建事件:', event.getTitle()); // 可添加提示用户手动处理的逻辑 return; } // 原有审批、修改颜色等逻辑 });
2. 转换为原生事件再操作
如果必须对这类事件执行自动化操作,可通过代码创建一个完全相同的原生事件,再对新事件处理,可选删除原拟议事件:
if (!event.isOwnedByMe()) { // 从原事件生成原生事件 const newEvent = calendar.createEventFromDescription( event.getDescription(), event.getStartTime(), event.getEndTime() ); // 对newEvent执行颜色修改、发送审批通知等操作 event.deleteEvent(); // 可选:删除原拟议事件,需提前告知用户 }
3. 通过iCalUID查询事件
部分拟议事件携带iCalUID,可尝试用它调用Calendar.Events.list模糊查询:
const iCalUID = event.getICalUID(); const response = Calendar.Events.list(calendarId, { iCalUID: iCalUID, singleEvents: true }); if (response.items.length > 0) { const targetEvent = response.items[0]; // 执行后续审批、修改操作 }
内容的提问来源于stack exchange,提问作者Oded Maimon

