Apex调用Google Calendar API时日期过滤条件不生效问题
Google Calendar API 日期范围过滤不生效Apex原生解决方案
问题根因
你当前调用的API地址存在格式错误,导致查询参数未被Google服务正确识别:
- 接口路径
/events和第一个查询参数之间应该使用?分隔,你当前使用了&(HTML转义后为&)作为分隔符,所有过滤参数都未生效。 - 若未对参数做URL编码,时间格式里的特殊字符也可能导致参数解析失败。
原生Apex实现方案(无第三方依赖)
1. 正确拼接请求URL
按照Google Calendar API规范构造请求地址,所有查询参数使用Apex原生EncodingUtil做URL编码,示例代码如下:
// 1. 定义查询范围与时区 String targetTimeZone = 'America/Los_Angeles'; DateTime startTime = DateTime.newInstance(2021, 10, 25, 10, 0, 0); DateTime endTime = DateTime.newInstance(2021, 10, 28, 10, 0, 0); // 2. 格式化时间为RFC3339标准格式并编码 String encodedTimeMin = EncodingUtil.urlEncode( startTime.format('yyyy-MM-dd\'T\'HH:mm:ssXXX', targetTimeZone), 'UTF-8' ); String encodedTimeMax = EncodingUtil.urlEncode( endTime.format('yyyy-MM-dd\'T\'HH:mm:ssXXX', targetTimeZone), 'UTF-8' ); String encodedTimeZone = EncodingUtil.urlEncode(targetTimeZone, 'UTF-8'); // 3. 构造完整请求端点,注意路径后用?接第一个参数 String endpoint = 'https://www.googleapis.com/calendar/v3/calendars/primary/events' + '?timeMin=' + encodedTimeMin + '&timeMax=' + encodedTimeMax + '&timeZone=' + encodedTimeZone; // 4. 发送请求,替换为你实际获取的OAuth2访问令牌 HttpRequest req = new HttpRequest(); req.setEndpoint(endpoint); req.setMethod('GET'); req.setHeader('Authorization', 'Bearer ' + yourValidAccessToken); req.setHeader('Accept', 'application/json'); Http http = new Http(); HttpResponse resp = http.send(req); // 5. 解析返回结果 if (resp.getStatusCode() == 200) { Map<String, Object> respData = (Map<String, Object>) JSON.deserializeUntyped(resp.getBody()); List<Object> filteredEvents = (List<Object>) respData.get('items'); // 此处添加你的业务处理逻辑 }
注意事项
- 确保你的OAuth访问令牌已申请
https://www.googleapis.com/auth/calendar.readonly或更高的日历访问权限,否则可能返回全量数据或权限报错。 - 不要直接使用从HTML中复制的转义后链接,需要将所有
&替换为原生&作为参数分隔符。 - 若需要过滤重复日程,可以额外添加
singleEvents=true参数,将循环日程展开为单个日程后再按时间过滤。
内容的提问来源于stack exchange,提问作者user3747497
相关产品推荐
相关产品推荐

