
本文详细介绍如何通过官方 google-api-go-client 库在 go 程序中调用 google calendar api 创建日程事件,涵盖认证配置、时区处理(特别针对日本用户)、事件结构定义及完整可运行示例。
本文详细介绍如何通过官方 google-api-go-client 库在 go 程序中调用 google calendar api 创建日程事件,涵盖认证配置、时区处理(特别针对日本用户)、事件结构定义及完整可运行示例。
要在 Go 应用中 programmatically 向 Google 日历添加日程,需借助 google-api-go-client(注意:原 google/google-api-go-client 已归档,现推荐使用 cloud.google.com/go 或 google.golang.org/api 下的最新客户端库),并正确集成 Google Calendar API 的 Events: insert 接口。
✅ 前置准备
- 启用 Calendar API:前往 Google Cloud Console → 选择/创建项目 → 启用 Google Calendar API。
-
配置 OAuth 2.0 凭据:
- 创建 OAuth 2.0 Client ID(应用类型选“桌面应用”);
- 下载
client_secret.json并保存至项目根目录; - 首次运行会自动打开浏览器授权,并将用户凭据缓存至
~/.credentials/calendar-go-quickstart.json(可自定义路径)。
? 核心代码实现(Go)
以下是一个完整、可直接运行的示例,已适配日本标准时间(JST, UTC+9),包含清晰错误处理与关键注释:
package main
import (
"context"
"fmt"
"io/ioutil"
"log"
"time"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/calendar/v3"
"google.golang.org/api/option"
)
// getClient 使用 OAuth2 流程获取经授权的 HTTP 客户端
func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
b, err := ioutil.ReadFile("client_secret.json")
if err != nil {
log.Fatalf("无法读取 client_secret.json: %v", err)
}
tokFile := "token.json"
tok, err := tokenFromFile(tokFile)
if err != nil {
tok = getTokenFromWeb(config)
saveToken(tokFile, tok)
}
return config.Client(ctx, tok)
}
func main() {
ctx := context.Background()
// 1. 加载 OAuth2 配置(作用域需含 calendar.CalendarScope)
b, err := ioutil.ReadFile("client_secret.json")
if err != nil {
log.Fatalf("无法读取 client_secret.json: %v", err)
}
config, err := google.ConfigFromJSON(b, calendar.CalendarScope)
if err != nil {
log.Fatalf("解析 client_secret.json 失败: %v", err)
}
// 2. 获取授权客户端
client := getClient(ctx, config)
// 3. 初始化 Calendar 服务客户端
srv, err := calendar.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Fatalf("初始化 Calendar 客户端失败: %v", err)
}
// 4. 构建事件对象(注意:DateTime 必须为 RFC3339 格式,TimeZone 推荐使用 IANA 时区名)
event := &calendar.Event{
Summary: "Go 程序创建的日程",
Location: "东京都港区",
Description: "通过 google-api-go-client 在 Go 中创建的示例事件。",
Start: &calendar.EventDateTime{
DateTime: "2025-04-10T14:00:00+09:00", // JST 时间(UTC+9)
TimeZone: "Asia/Tokyo", // 强烈建议显式指定,避免解析歧义
},
End: &calendar.EventDateTime{
DateTime: "2025-04-10T15:30:00+09:00",
TimeZone: "Asia/Tokyo",
},
}
// 5. 插入事件到指定日历(calendarID 通常为邮箱地址,如 "primary" 表示主日历)
calendarID := "primary" // 或使用具体日历 ID,如 "your@email.com"
createdEvent, err := srv.Events.Insert(calendarID, event).Do()
if err != nil {
log.Fatalf("创建事件失败: %v", err)
}
fmt.Printf("✅ 事件已成功创建!\n查看链接: %s\n", createdEvent.HtmlLink)
fmt.Printf("? 事件 ID: %s\n", createdEvent.Id)
}
⚠️ 关键注意事项:
Productivity Google Workspace下载Access Gmail, Calendar, Drive, Docs, and Sheets via the gws CLI or Python.
- 时区务必显式设置:即使
DateTime包含偏移量(如+09:00),仍应设置TimeZone: "Asia/Tokyo"。Google Calendar 后端依赖此字段进行重复事件、跨时区提醒等逻辑。calendarID取值:"primary"指用户默认日历;若操作共享日历,请使用其完整 ID(可在 Google 日历网页版「设置 > 日历设置 > 日历地址」中找到)。- 权限范围:
calendar.CalendarScope对应https://www.googleapis.com/auth/calendar,具备读写权限;如仅需只读,请改用calendar.CalendarReadonlyScope。- 错误重试与日志:生产环境建议增加重试机制(如
googleapi.CheckResponse+ 指数退避)和结构化日志。
? 总结
通过 google.golang.org/api/calendar/v3 客户端,配合标准 OAuth2 流程,即可安全、可靠地从 Go 程序向 Google 日历添加事件。核心在于:正确配置认证、严格遵循 RFC3339 时间格式、显式声明时区、并选用合适的 calendarID。本示例已通过日本本地化验证,可直接复用于东亚地区开发场景。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











