如何使用Golang集成Google Sheets?已有Client ID/Secret且无需JSON文件
在Golang中不使用JSON文件集成Google Sheets
1. 安装依赖
先安装Google Sheets API和OAuth2相关的Go包:
go get google.golang.org/api/sheets/v4 go get golang.org/x/oauth2/google
2. 手动构造OAuth2配置
直接用你已有的Client ID和Client Secret创建OAuth2配置,无需依赖JSON文件:
import ( "context" "fmt" "log" "os" "encoding/json" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "google.golang.org/api/sheets/v4" ) var ( // 建议通过环境变量加载,避免硬编码 clientID = os.Getenv("GOOGLE_CLIENT_ID") clientSecret = os.Getenv("GOOGLE_CLIENT_SECRET") // 权限范围按需调整,只读用sheets.SpreadsheetsReadonlyScope scopes = []string{sheets.SpreadsheetsScope} // 需在Google Cloud Console的OAuth客户端中配置此回调地址 redirectURL = "http://localhost:8080/callback" ) func getOAuthConfig() *oauth2.Config { return &oauth2.Config{ ClientID: clientID, ClientSecret: clientSecret, RedirectURL: redirectURL, Scopes: scopes, Endpoint: google.Endpoint, } }
3. 处理OAuth2授权流程
首次授权获取令牌
首次运行需要引导用户完成授权,获取访问令牌和刷新令牌:
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token { authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) log.Printf("请访问以下URL完成授权: %v", authURL) // 这里简化为手动输入授权码,也可以搭建临时HTTP服务自动接收回调 var authCode string log.Print("输入页面返回的授权码: ") fmt.Scanln(&authCode) token, err := config.Exchange(context.Background(), authCode) if err != nil { log.Fatalf("获取令牌失败: %v", err) } return token }
持久化刷新令牌(可选)
为避免每次重启都重新授权,建议将刷新令牌保存到本地,后续直接复用:
// 保存令牌到本地文件 func saveToken(path string, token *oauth2.Token) { file, err := os.Create(path) if err != nil { log.Fatalf("无法创建令牌文件: %v", err) } defer file.Close() json.NewEncoder(file).Encode(token) } // 从本地文件加载令牌 func loadToken(path string) (*oauth2.Token, error) { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() token := &oauth2.Token{} err = json.NewDecoder(file).Decode(token) return token, err }
4. 初始化Sheets服务并调用API
有了OAuth2配置和令牌后,即可创建Sheets服务实例,执行读写操作:
func main() { config := getOAuthConfig() // 尝试加载已保存的令牌,加载失败则触发首次授权 token, err := loadToken("token.json") if err != nil { token = getTokenFromWeb(config) saveToken("token.json", token) } // 创建带授权的HTTP客户端 client := config.Client(context.Background(), token) // 初始化Sheets服务 srv, err := sheets.New(client) if err != nil { log.Fatalf("创建Sheets服务失败: %v", err) } // 示例1:读取表格数据 spreadsheetID := "你的表格ID" rangeName := "Sheet1!A1:C3" resp, err := srv.Spreadsheets.Values.Get(spreadsheetID, rangeName).Do() if err != nil { log.Fatalf("读取数据失败: %v", err) } if len(resp.Values) == 0 { log.Println("未找到数据") } else { log.Println("表格数据:") for _, row := range resp.Values { log.Println(row) } } // 示例2:写入表格数据 values := []interface{}{"测试数据1", "测试数据2", "测试数据3"} writeRange := "Sheet1!A4" body := &sheets.ValueRange{ Values: [][]interface{}{values}, } _, err = srv.Spreadsheets.Values.Update(spreadsheetID, writeRange, body).ValueInputOption("RAW").Do() if err != nil { log.Fatalf("写入数据失败: %v", err) } log.Println("数据写入成功") }
关键注意事项
- 确保
redirectURL已在Google Cloud Console的OAuth2客户端设置中添加为授权重定向URI。 - 生产环境中绝对不要硬编码Client ID和Client Secret,必须通过环境变量或安全配置中心加载。
- 权限范围
scopes需根据实际需求最小化设置,减少权限风险。
内容的提问来源于stack exchange,提问作者Folium
相关产品推荐
相关产品推荐

