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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:25