如何通过Python调用Google Calendar API获取多日历事件详情
如何用Python调用Google Calendar API获取多个日历的事件详情
完全可以实现,你之前的问题应该是没有对每个日历ID单独发起API请求并合并结果。下面是基于Google官方quickstart.py的修改方案:
核心思路
把多个日历ID存入数组,循环遍历每个ID,分别调用events().list()接口获取对应日历的事件,最后将所有日历的事件合并到一个列表中,方便后续在界面展示。
修改后的代码示例
1. 定义要获取的日历ID数组
首先在代码里添加家庭成员的日历ID(通常是对应的邮箱地址,或者日历的唯一ID):
# 替换成你的家庭成员日历ID CALENDAR_IDS = [ 'your-email@example.com', 'wife-email@example.com', 'child-email@example.com' ]
2. 编写批量获取事件的函数
替换原quickstart.py中获取单个日历事件的代码,改成批量处理的函数:
from datetime import datetime import googleapiclient.discovery def get_all_family_events(service): all_events = [] for calendar_id in CALENDAR_IDS: # 获取当前日历的事件 events_result = service.events().list( calendarId=calendar_id, timeMin=datetime.utcnow().isoformat() + 'Z', # 仅获取当前及未来的事件 maxResults=50, # 可根据需求调整数量 singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items', []) # 给每个事件标记所属日历(方便展示时区分) for event in events: event['calendar_owner'] = calendar_id.split('@')[0] all_events.extend(events) # 可选:按事件开始时间排序合并后的列表 all_events.sort(key=lambda x: x['start'].get('dateTime', x['start'].get('date'))) return all_events
3. 在主流程中调用函数
修改原代码中获取事件的部分,调用上面的函数:
def main(): # 原quickstart.py中的认证代码保持不变 creds = None # ...(此处省略原认证逻辑) service = googleapiclient.discovery.build('calendar', 'v3', credentials=creds) # 调用批量获取函数 family_events = get_all_family_events(service) # 打印或处理事件(替换成你的界面展示逻辑) if not family_events: print('没有找到任何事件。') for event in family_events: start = event['start'].get('dateTime', event['start'].get('date')) print(f"{start} | {event['calendar_owner']}: {event['summary']}") if __name__ == '__main__': main()
关键注意事项
- 日历权限:确保你要访问的家庭成员日历已经共享给你的Google账号,权限至少设置为「查看所有事件」,否则API会返回权限错误。
- 分页处理:如果某个日历的事件超过250个(API默认单次返回上限),需要通过
pageToken参数循环获取所有事件(可以在函数里添加分页逻辑)。 - 事件筛选:可以根据需求调整
timeMin、timeMax等参数,实现按时间范围筛选事件;也可以添加q参数进行关键词搜索。
内容的提问来源于stack exchange,提问作者Simon Flückiger
相关产品推荐
相关产品推荐

