使用 Go 进行批量更新时如何使用 google 工作表 API 创建 NamgedRange

How to create a NamgedRange using google sheets API when doing a batch update with Go

我最近开始编写一个程序来将 CSV 和 SQL 导出到 google sheet。在某些情况下,我需要在创建 sheet and/or 更新它的同时创建一个 NamedRange。 google 官方文档有点混乱,对我帮助不大。任何人都可以给我一个示例代码或指出正确的方向吗?

现在我有一些类似的东西。这只是展示其中一种情况的示例代码。

    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.")
}

我相信你的目标如下。

  • 您想使用 googleapis 和 golang 创建命名范围。
  • 您已经能够使用表格 API.
  • 为 Google 电子表格获取和放置值

修改点:

  • 当我看到你的脚本时,使用了SheetsAPI的spreadsheets.values.batchUpdate方法。当您想在现有的 Google 电子表格中创建命名范围时,请使用 spreadsheets.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)
  • 在此示例脚本中,StartRowIndex: 1, EndRowIndex: 3, StartColumnIndex: 1, EndColumnIndex: 3, 的网格范围表示单元格“B2:C3”。
  • 当此脚本为 运行 时,nameOfNamedRange 的命名范围是在 Google 的电子表格中使用 sheetId 的“B2:C3”范围创建的spreadsheetId.

注:

  • 很遗憾,根据您的显示脚本,我无法知道文件的文件名,包括访问令牌和刷新令牌。如果文件名是token.json用于the Quickstart,在您运行修改脚本之前,请删除该文件。并且,请重新授权范围。请注意这一点。

参考文献: