You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Calendar API v3:AppScript触发器无法获取修改事件ID及查询异常

问题原因分析
  1. 排序方向错误:你设置了orderBy: 'updated'但未指定排序方向,Google Calendar API默认采用升序(从旧到新)排序。结合maxResults:2的限制,查询返回的是updateMin时间范围内最早被更新的事件,而非你刚修改的最新事件。
  2. 未验证事件实际更新时间:你仅打印了事件的起始时间,这些"旧事件"可能因同步、重复事件刷新等原因,在最近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:30:33