首页 > 解决方案 > 使用 Go 进行批量更新时如何使用 google sheet API 创建 NamgedRange

问题描述

我最近开始编写一个程序来将 CSV 和 SQL 导出到谷歌表格。在某些情况下,我需要在创建工作表和/或更新工作表时创建一个 NamedRange。谷歌官方文档有点混乱,对我帮助不大。谁能给我看一个示例代码或指出正确的方向?

现在我有一些类似的东西。这只是显示其中一种场景的示例代码。

    func writeSS(ssid string, content [][]interface{}) {

    ctx := context.Background()

    b, err := ioutil.ReadFile("./credentials/client_secret.json")
    if err != nil {
        log.Fatalf("Unable to read client secret file: %v", err)
    }

    config, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/spreadsheets.readonly")
    if err != nil {
        log.Fatalf("Unable to parse client secret file to config: %v", err)
    }
    client := getClient(config)

    srv, err := sheets.NewService(ctx, option.WithHTTPClient(client))
    if err != nil {
        log.Fatalf("Unable to retrieve Sheets client: %v", err)
    }

    spreadsheetId := ssid

    rangeData := "Sheet name!A1:A6"

    rb := &sheets.BatchUpdateValuesRequest{
        ValueInputOption: "USER_ENTERED",
    }

    rb.Data = append(rb.Data, &sheets.ValueRange{
        Range:  rangeData,
        Values: content,
    })
    _, err = srv.Spreadsheets.Values.BatchUpdate(spreadsheetId, rb).Context(ctx).Do() //Check this again
    // _, err = srv.Spreadsheets.Values.Update(spreadsheetId, writeRange, &vr).ValueInputOption("USER_ENTERED").Do()

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Done.")
}

标签: gogoogle-sheetsgoogle-sheets-apinamed-ranges

解决方案


我相信你的目标如下。

  • 您想使用带有 golang 的 googleapis 创建一个命名范围。
  • 您已经能够使用 Sheets API 获取和放置 Google 电子表格的值。

修改点:

  • 当我看到你的脚本时,使用了 Sheets API 的电子表格.values.batchUpdate 方法。当您想在现有的 Google 电子表格中创建命名范围时,请使用电子表格.batchUpdate 的方法。
  • 在您的脚本中,您尝试使用https://www.googleapis.com/auth/spreadsheets.readonly. 我认为发生了与范围相关的错误。在这种情况下,请使用https://www.googleapis.com/auth/spreadsheets.

当这些点反映在你的脚本中时,它变成如下。

修改后的脚本:

config, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/spreadsheets")
if err != nil {
    log.Fatalf("Unable to parse client secret file to config: %v", err)
}
client := getClient(config)

srv, err := sheets.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
    log.Fatalf("Unable to retrieve Sheets client: %v", err)
}

spreadsheetId := "###" // Please set your Spreadsheet ID.
sheetId := 1234567890 // Please set your sheet ID.
nameOfNamedRange := "sampleNamedRange1" // Please set the name of the named range.

req := sheets.Request{
    AddNamedRange: &sheets.AddNamedRangeRequest{
        NamedRange: &sheets.NamedRange{
            Range: &sheets.GridRange{
                SheetId:          int64(sheetId),
                StartRowIndex:    1,
                EndRowIndex:      3,
                StartColumnIndex: 1,
                EndColumnIndex:   3,
            },
            Name: nameOfNamedRange,
        },
    },
}
requestBody := &sheets.BatchUpdateSpreadsheetRequest{
    Requests: []*sheets.Request{&req},
}
resp, err := srv.Spreadsheets.BatchUpdate(spreadsheetId, requestBody).Do()
if err != nil {
    log.Fatal(err)
}
fmt.Print(resp)
  • 在此示例脚本中,gridrangeStartRowIndex: 1, EndRowIndex: 3, StartColumnIndex: 1, EndColumnIndex: 3,表示单元格“B2:C3”。
  • 运行此脚本时,将使用的 Google 电子表格中nameOfNamedRange的“B2:C3”范围创建命名范围。sheetIdspreadsheetId

笔记:

  • 不幸的是,从您的显示脚本中,我无法知道文件的文件名,包括访问令牌和刷新令牌。如果快速入门token.json中使用了文件名,请在运行修改后的脚本之前删除该文件。并且,请重新授权范围。请注意这一点。

参考:


推荐阅读