go - 使用 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.")
}
解决方案
我相信你的目标如下。
- 您想使用带有 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)
- 在此示例脚本中,gridrange
StartRowIndex: 1, EndRowIndex: 3, StartColumnIndex: 1, EndColumnIndex: 3,
表示单元格“B2:C3”。 - 运行此脚本时,将使用的 Google 电子表格中
nameOfNamedRange
的“B2:C3”范围创建命名范围。sheetId
spreadsheetId
笔记:
- 不幸的是,从您的显示脚本中,我无法知道文件的文件名,包括访问令牌和刷新令牌。如果快速入门
token.json
中使用了文件名,请在运行修改后的脚本之前删除该文件。并且,请重新授权范围。请注意这一点。
参考:
推荐阅读
- circleci - 我可以使用 CircleCI 运行不同的工作流程以将开发合并到 master 中吗?
- matlab - 如何为 6 个子图(Matlab)实现相同的颜色条缩放?
- django - 没有反向匹配错误但函数存在?
- c# - WCF 事件响应
- google-apps-script - GetUserLabelByName Google 应用脚本问题
- algorithm - 最小多割算法如何避免平凡的解决方案?
- spring-boot - Spring Boot 'bootJar' 任务不构建胖 jar,而是排除 .original
- python - 带有 Redis BackendResult 的 Celery AsyncResult 奇怪的行为
- amazon-web-services - 如何将发布(带有替换变量的包)上传到 S3 以便使用 codedeploy 进行部署
- angular - 导入 mat-checkbox 时出现角度材料错误