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

无法获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:02:06