如何用Python调用Google Calendar API实现按事件名汇总的日历视图
Google Calendar按事件名汇总视图Python实现
这个需求完全可实现,不需要逐次手动搜索事件。通过官方Calendar API拉取指定时间范围内的全量日程(自动展开所有重复事件的单次实例),再按事件标题分组聚合日期即可,输出格式完全匹配你给出的示例。
前置准备
- 开启Google Calendar API权限,下载本地授权用的
credentials.json文件放到脚本同级目录 - 安装依赖包:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib python-dateutil - 首次运行脚本会弹出浏览器授权窗口,登录对应Google账号完成授权即可,后续会自动保存凭据无需重复操作。
完整代码
import os from datetime import datetime import dateutil.parser from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build # 日历只读权限 SCOPES = ["https://www.googleapis.com/auth/calendar.readonly"] # 自定义统计时间范围,可按需修改 START_TIME = datetime(2022, 1, 1).isoformat() + "Z" END_TIME = datetime(2022, 12, 31).isoformat() + "Z" def main(): creds = None if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES) creds = flow.run_local_server(port=0) with open("token.json", "w") as token: token.write(creds.to_json()) service = build("calendar", "v3", credentials=creds) # 拉取事件时开启singleEvents参数,自动展开重复事件为单次实例 events_result = service.events().list( calendarId="primary", timeMin=START_TIME, timeMax=END_TIME, singleEvents=True, orderBy="startTime" ).execute() events = events_result.get("items", []) if not events: print("选定时间范围内无日程事件") return # 按标题分组存储日期,自动去重 event_map = {} for event in events: title = event.get("summary", "无标题事件") # 兼容全天事件和定时事件的时间格式 start_raw = event["start"].get("dateTime", event["start"].get("date")) start_dt = dateutil.parser.parse(start_raw) # 格式化为 月/日/两位年份 的格式 date_fmt = f"{start_dt.month}/{start_dt.day}/{str(start_dt.year)[-2:]}" if title not in event_map: event_map[title] = set() event_map[title].add(date_fmt) # 按要求格式输出 for title, date_set in event_map.items(): print(title) # 日期按时间先后排序 for d in sorted(date_set, key=lambda x: datetime.strptime(x, "%m/%d/%y")): print(f"-{d}") if __name__ == "__main__": main()
可调配置说明
- 修改
START_TIME和END_TIME的值可以调整统计的时间范围,不局限于2022年 - 若需要统计主日历之外的共享日历/自建日历,替换
calendarId参数为对应日历的ID即可 - 如果需要调整日期展示格式,修改
date_fmt的字符串拼接规则即可 - 脚本自动对同个事件的重复日期去重,不会输出重复条目
内容的提问来源于stack exchange,提问作者MP84
相关产品推荐
相关产品推荐

