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

使用Microsoft Graph getSchedule API查询多邮箱共同可用时段的问题

Microsoft Graph /getSchedule API: availabilityView 疑问与多邮箱共同可用时段优化

1. 为什么相同availabilityViewInterval返回的availabilityView长度不同?

availabilityView的字符串长度完全由你请求的时间总跨度决定:

  • 每个字符对应一个availabilityViewInterval时长的时间块,比如设为5分钟,每个字符就代表5分钟
  • 总长度 = (结束时间 - 开始时间)的分钟数 ÷ 5
  • 字符含义:0=空闲,2=忙碌,1=暂定,3=外出,4=非工作时间

看你的示例:

  • 示例1:请求的是10分钟窗口(10÷5=2),所以返回2个字符"22",说明这两个5分钟块都在忙
  • 示例2:同样10分钟窗口但无会议,返回"00"
  • 示例3:请求的是60分钟窗口(60÷5=12),所以返回12个字符,前两个"22"对应那10分钟的会议,剩下10个"0"表示其余时间空闲

2. 找多邮箱共同可用时段的更优方案

方案一:基于availabilityView的批量对比(适合短时间范围)

  1. 给每个目标邮箱调用getSchedule,获取同一时间范围的availabilityView
  2. 确保所有字符串长度一致(如果请求的时间范围不同,先统一起止时间)
  3. 逐字符对比:只有当所有邮箱对应位置的字符都是0,这个5分钟块就是共同可用的

方案二:用scheduleItems直接计算(高效处理大时间范围)

  1. 收集所有邮箱返回的scheduleItems(即已有的忙碌时段)
  2. 把所有忙碌区间合并去重,生成全局的忙碌列表
  3. 从你要找的目标时间范围里,减去这些忙碌区间,剩下的就是共同可用时段

方案三:直接用findMeetingTimes API(官方推荐,省得自己算)

微软提供了专门的findMeetingTimes API,直接传入参会人、会议时长、时间范围,API会自动返回所有符合条件的可用时段,不用自己处理数据。Java示例代码:

FindMeetingTimesParameterSet params = FindMeetingTimesParameterSet
    .newBuilder()
    .withAttendees(Arrays.asList(
        new AttendeeInfo().setEmailAddress(new EmailAddress().setAddress("user1@contoso.com")).setType(AttendeeType.REQUIRED),
        new AttendeeInfo().setEmailAddress(new EmailAddress().setAddress("user2@contoso.com")).setType(AttendeeType.REQUIRED)
    ))
    .withStartTime(startTime)
    .withEndTime(endTime)
    .withMeetingDuration(Duration.ofMinutes(30))
    .build();

FindMeetingTimesResult result = graphClient.me()
    .findMeetingTimes(params)
    .buildRequest()
    .post();

注意点

  • 时区统一:所有请求的起止时间用同一个时区(推荐UTC),避免时区转换出错
  • 权限:调用这两个API需要Calendars.Read权限
  • 限流:批量获取多个邮箱时,用Graph的批量请求减少调用次数,避免触发频率限制

内容的提问来源于stack exchange,提问作者Rahul Burangi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:10:16