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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:39:15