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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:30:47