如何用PowerShell调用Graph API获取含即将结束的进行中事件的日历列表
问题分析
你的脚本当前把startdatetime设为脚本执行的即时时间,导致Graph API的calendarview只返回开始时间在该时间点之后,或者虽开始时间早但结束时间距当前超过1小时的事件。而那些正在进行但开始时间早于当前时间、且结束时间在1小时内的事件,因开始时间不在startdatetime之后,且事件区间与你设置的[当前时间, 当前+7天]重叠较短,被遗漏了。
要解决这个问题,核心是调整startdatetime的取值,让它覆盖所有执行时刻正在进行的事件——把startdatetime设为一个足够早的过去时间,确保所有未结束的事件都能和你的时间区间产生重叠。
修改方案
将startdatetime设置为当前时间往前推24小时(可根据实际需求调整时长,比如推1周,只要能覆盖所有可能的“正在进行中”事件即可),这样:
- 所有执行时刻正在进行的事件(开始时间≤当前时间≤结束时间),其结束时间必然在
startdatetime(24小时前)和enddatetime(7天后)之间,会被calendarview返回; - 未来一周内开始的事件也会被正常包含。
修改后的完整脚本片段
# 获取当前时区 $TimeZone = (Get-TimeZone).Id # 调整时间范围:startdatetime设为当前时间前24小时,确保覆盖所有正在进行的事件 $currentTime = Get-Date $startDate = $currentTime.AddHours(-24) | Get-Date -UFormat '+%Y-%m-%dT%H:%M:%S.000Z' # enddatetime保持为当前时间+7天的23:59:59 $endDate = $currentTime.AddDays(7) | Get-Date -UFormat '+%Y-%m-%dT23:59:59.000Z' ## 获取访问令牌 # 使用Microsoft Authentication Library获取委托权限的访问令牌 $AccessToken = (Get-MsalToken @MsalParams).AccessToken ## 构造请求头 $headers = @{ 'Content-Type' = 'application/json' 'Authorization' = "Bearer $AccessToken" } # 设置返回时间为指定时区 $headers.Add('Prefer', "outlook.timezone=`"$TimeZone`"") ## 生成API请求URL $apiUrl = "https://graph.microsoft.com/v1.0/users/USERID/calendarview?startdatetime=$startDate&enddatetime=$endDate" ## 调用接口 $Response = Invoke-RestMethod -Method Get -Uri $apiUrl -Headers $headers -ErrorAction SilentlyContinue
补充说明
Graph API的calendarview端点逻辑是返回所有与指定的[startdatetime, enddatetime]区间存在重叠的事件,只要事件的开始时间≤enddatetime,且结束时间≥startdatetime,就会被返回。把startdatetime设为过去的时间,就能确保所有正在进行的事件(结束时间≥当前时间)满足结束时间≥startdatetime,从而被包含在结果里。
内容的提问来源于stack exchange,提问作者Keeran
相关产品推荐
相关产品推荐

