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

Google Calendar API时间冲突检测代码问题排查请求

排查Google Calendar时段空闲检查函数的常见问题

1. 先确认API请求参数没毛病

  • 时间格式必须是RFC3339标准(比如2024-05-20T10:00:00+08:00),如果用户表单提交的是YYYY-MM-DD HH:MM这种格式,得先转成标准格式,不然API直接返回错误。
  • timeMin和timeMax别搞反:前者是时段开始时间,后者是结束时间,而且得统一时区(要么用用户时区,要么用UTC,别混着来)。
  • 日历ID要填对主日历:要么用用户邮箱,要么直接写primary,填错成其他日历的话,查的根本不是用户的主日历。

2. 检查权限和认证是否有效

  • 得申请https://www.googleapis.com/auth/calendar.readonly或者更高权限(比如calendar),权限不够的话API会返回403错误,直接查不了。
  • 验证令牌:打印请求头里的Authorization: Bearer {token},然后用Google的令牌验证工具(本地即可操作)确认令牌包含日历访问权限。

3. 响应处理逻辑容易踩坑的点

  • 调用events.list后,看items数组长度:大于0就是有事件,为空就是空闲,但别忘了处理分页——如果事件多,API会返回nextPageToken,得循环把所有页的事件都拉出来,不然会漏查。
  • 一定要设singleEvents: true:不然重复事件只会返回主事件,不会返回具体的时段实例,等于白查。

4. 常见代码错误示例及修复

假设你的isFreeDuringEvent函数是类似下面的结构,标注了容易错的地方:

async function isFreeDuringEvent(startTime, endTime) {
  const calendar = google.calendar({ version: 'v3', auth });
  // 错误:时间没转成RFC3339格式
  // const timeMin = startTime; 
  const timeMin = new Date(startTime).toISOString(); // 正确转换方式
  const timeMax = new Date(endTime).toISOString();

  try {
    let response = await calendar.events.list({
      calendarId: 'primary', // 确认是主日历ID
      timeMin: timeMin,
      timeMax: timeMax,
      singleEvents: true, // 必须开这个,不然重复事件查不到实例
      orderBy: 'startTime',
    });

    let allEvents = [...response.data.items];
    // 错误:没处理分页,事件多的时候会漏查
    // return allEvents.length === 0;
    // 正确处理分页:
    while (response.data.nextPageToken) {
      response = await calendar.events.list({
        ...response.config, // 复用之前的参数
        pageToken: response.data.nextPageToken,
      });
      allEvents.push(...response.data.items);
    }
    console.log(`该时段${allEvents.length > 0 ? '存在' : '无'}事件,事件列表:`, allEvents);
    return allEvents.length === 0;
  } catch (err) {
    // 错误:只打个Error,根本不知道哪错了
    // console.log('Error');
    console.error('API请求出错:', err.response?.data || err.message); // 打印详细错误信息
    throw err;
  }
}

5. 调试小技巧

  • 请求发出去之前,先打印所有参数(calendarId、timeMin、timeMax),确认参数符合API要求。
  • 拿到响应后,直接打印完整的response.data,看看有没有items或者error字段,搞清楚API实际返回的是什么。
  • 去Google Cloud控制台的API Explorer里手动测一遍,用相同的参数调用events.list,看看返回结果和代码里的是不是一致,排除代码逻辑问题。

内容的提问来源于stack exchange,提问作者displayName is undefined

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:07:54