Google Calendar API v3:AppScript触发器无法获取修改事件ID及查询异常
问题原因分析
- 排序方向错误:你设置了
orderBy: 'updated'但未指定排序方向,Google Calendar API默认采用升序(从旧到新)排序。结合maxResults:2的限制,查询返回的是updateMin时间范围内最早被更新的事件,而非你刚修改的最新事件。 - 未验证事件实际更新时间:你仅打印了事件的起始时间,这些"旧事件"可能因同步、重复事件刷新等原因,在最近1天内确实被更新过,因此符合
updateMin的筛选条件。
另外你提到的"AppScript无法提供被修改事件的ID"是误解——日历事件更新触发器可以直接传递事件对象,无需通过查询最近事件的方式间接获取。
解决方案
方案一:修复查询参数,获取最近更新的事件
修改getOptions函数,添加降序排序参数,确保返回最新更新的事件,同时打印事件更新时间用于验证:
function getOptions() { var now = new Date(); var yesterday = new Date(); yesterday.setDate(now.getDate() - 1); console.log(yesterday.toISOString()) return { updateMin: yesterday.toISOString(), maxResults: 2, orderBy: 'updated', sortOrder: 'descending', // 新增:按更新时间从新到旧排序 singleEvents: true, showDeleted: false } } function onEventUpdate() { var options = getOptions(); var calendarId = Session.getActiveUser().getEmail(); var events = Calendar.Events.list(calendarId, options); if(!events.items) return for (var i = 0; i < events.items.length; i++) { var event = events.items[i]; // 打印更新时间,确认是否符合预期 console.log(event.summary + " | 起始时间: " + event.start['dateTime'] + " | 更新时间: " + event.updated); } }
方案二:直接通过触发器参数获取被修改事件(更可靠)
如果你的触发器是通过Google Apps Script的触发器功能创建的「日历事件更新」类型,函数可以直接接收事件参数e,获取被修改的事件详情:
function onEventUpdate(e) { // 直接获取触发事件的日历对象 var calendarEvent = e.calendarEvent; var eventId = calendarEvent.getId(); var eventTitle = calendarEvent.getTitle(); var eventStartTime = calendarEvent.getStartTime(); console.log("被修改的事件: " + eventTitle + " | ID: " + eventId + " | 起始时间: " + eventStartTime); // 在此处执行你的脚本逻辑 }
注意:创建触发器时需选择「日历」类型,事件源设为「日历事件更新」并指定目标日历,触发时会自动传递e参数。
内容的提问来源于stack exchange,提问作者andrea
相关产品推荐
相关产品推荐

