使用 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,在您运行修改脚本之前,请删除该文件。并且,请重新授权范围。请注意这一点。
参考文献:
我最近开始编写一个程序来将 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,在您运行修改脚本之前,请删除该文件。并且,请重新授权范围。请注意这一点。