使用Go来更新Google Sheets API中的单元格
这次我想总结一下关于使用Go来写入Google Sheets的内容。
关于使用Google Sheets API的准备工作和服务账号的认证,请参考这里。
由于我正在学习Go语言和Google Sheets API,所以如果有错误的描述或不推荐的代码写法,请不吝赐教。
如果更新单个范围的话
当仅对一个区域进行更新时,可以使用Spreadsheets.Values.Update()。
Spreadsheets.Values.Update()的参数是(表格ID,更新范围,sheets.ValueRange)。
示例代码 (Example code)
package main
import (
"encoding/json"
"io/ioutil"
"golang.org/x/net/context"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
type credentialsJson struct {
Email string `json:"client_email"`
PrivateKey string `json:"private_key"`
}
func main() {
// サービスアカウントでの認証
bytes, _ := ioutil.ReadFile("credentials.json")
var credentials credentialsJson
json.Unmarshal(bytes, &credentials)
conf := &jwt.Config{
Email: credentials.Email,
PrivateKey: []byte(credentials.PrivateKey),
TokenURL: google.JWTTokenURL,
Scopes: []string{
// スプレッドシートの読み込みと書き込みを許可
"https://www.googleapis.com/auth/spreadsheets",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
// スプレッドシートの指定
spreadsheetId := ""
ctx := context.Background()
// 更新範囲の指定
valueRange := "A1:B2"
// 更新値の指定
rb := &sheets.ValueRange{
MajorDimension: "ROWS",
Values: [][]interface{}{
[]interface{}{"123", "hoge"},
[]interface{}{"1.23", "=B1&B1"},
},
}
sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption("USER_ENTERED").Context(ctx).Do()
}
执行结果
电子表格的ID
在指定要更新的电子表格时使用。您可以从要使用的电子表格的URL中获取电子表格ID。
请修改以下链接中的内容:https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0
上述的hogehoge部分即为Google Sheets的ID。
更新的范围
在指定需要更新的范围时,与图形用户界面(GUI)相同,如下所示进行指定。
表格的值范围
主要维度
指定更新是在行或列中进行的。默认值为行。
将示例代码中的MajorDimension: “ROWS”中的ROWS更改为COLUMNS并执行,结果将更新如下。
执行结果
价值观
在单元格中写入的值由Values指定。所写入的值必须是interface类型的二维数组。
查询参数
输入选项
指定更新值的解释方法。
将下面的样本代码中的USER_ENTERED参数更改为RAW并执行,将以字符串形式更新,而不是解释为公式。
样本代码:sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption(“USER_ENTERED”).Context(ctx).Do()
修改为:sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption(“RAW”).Context(ctx).Do()。
请注意,以上是我用中文对原始文本的翻译,希望对您有帮助。
执行结果
如果要更新多个范围。
如果您想要同时更新多个范围,可以使用Spreadsheets.Values.BatchUpdate()。Spreadsheets.Values.BatchUpdate()的参数为(电子表格ID,sheets.BatchUpdateValuesRequest)。
示例代码
package main
import (
"encoding/json"
"io/ioutil"
"golang.org/x/net/context"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
type credentialsJson struct {
Email string `json:"client_email"`
PrivateKey string `json:"private_key"`
}
func main() {
// サービスアカウントでの認証
bytes, _ := ioutil.ReadFile("credentials.json")
var credentials credentialsJson
json.Unmarshal(bytes, &credentials)
conf := &jwt.Config{
Email: credentials.Email,
PrivateKey: []byte(credentials.PrivateKey),
TokenURL: google.JWTTokenURL,
Scopes: []string{
// スプレッドシートの読み込みと書き込みを許可
"https://www.googleapis.com/auth/spreadsheets",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
// スプレッドシートの指定
spreadsheetId := ""
ctx := context.Background()
// 更新範囲と更新値の指定
valueRange1 := "A1:B2"
values1 := [][]interface{}{
[]interface{}{"123", "hoge"},
[]interface{}{"1.23", "=B1&B1"},
}
valueRange2 := "C3:D4"
values2 := [][]interface{}{
[]interface{}{"456", "fuga"},
[]interface{}{"4.56", "=D3&D3"},
}
rb := &sheets.BatchUpdateValuesRequest{
ValueInputOption: "USER_ENTERED",
Data: []*sheets.ValueRange{
&sheets.ValueRange{
Range: valueRange1,
MajorDimension: "ROWS",
Values: values1,
},
&sheets.ValueRange{
Range: valueRange2,
MajorDimension: "ROWS",
Values: values2,
},
},
}
sheetsSrv.Spreadsheets.Values.BatchUpdate(spreadsheetId, rb).Context(ctx).Do()
}
执行结果
21.23hogehoge
3
456fuga4
4.56fugafuga
批量更新值请求的sheets.BatchUpdateValuesRequest
值输入选项
与Spreadsheets.Values.Update()的查询参数相同。
数据
数据在Data中的值必须是一个sheets.ValueRange的一维数组。
更新范围在sheets.ValueRange中通过Range指定。
除此之外和Spreadsheets.Values.Update()相同。
如果与边框线或单元格颜色相匹配进行更新的情况下
如果要根据框线和单元格颜色来更新单元格的值,则可以使用Spreadsheets.BatchUpdate()方法。
Spreadsheets.BatchUpdate()方法的参数是(电子表格ID,sheets.BatchUpdateSpreadsheetRequest)。
示例代码
package main
import (
"encoding/json"
"io/ioutil"
"golang.org/x/net/context"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
type credentialsJson struct {
Email string `json:"client_email"`
PrivateKey string `json:"private_key"`
}
func main() {
// サービスアカウントでの認証
bytes, _ := ioutil.ReadFile("credentials.json")
var credentials credentialsJson
json.Unmarshal(bytes, &credentials)
conf := &jwt.Config{
Email: credentials.Email,
PrivateKey: []byte(credentials.PrivateKey),
TokenURL: google.JWTTokenURL,
Scopes: []string{
// スプレッドシートへの読み込みと書き込みを許可
"https://www.googleapis.com/auth/spreadsheets",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
// スプレッドシートの指定
spreadsheetId := ""
ctx := context.Background()
requests := []*sheets.Request{
&sheets.Request{
UpdateCells: &sheets.UpdateCellsRequest{
Fields: "UserEnteredValue",
Rows: []*sheets.RowData{
&sheets.RowData{
// 更新値を指定
Values: []*sheets.CellData{
&sheets.CellData{
UserEnteredValue: &sheets.ExtendedValue{
NumberValue: 123,
},
},
&sheets.CellData{
UserEnteredValue: &sheets.ExtendedValue{
StringValue: "hoge",
},
},
},
},
&sheets.RowData{
// 更新値を指定
Values: []*sheets.CellData{
&sheets.CellData{
UserEnteredValue: &sheets.ExtendedValue{
NumberValue: 1.23,
},
},
&sheets.CellData{
UserEnteredValue: &sheets.ExtendedValue{
FormulaValue: "=B1&B1",
},
},
},
},
},
// 更新範囲を指定
Range: &sheets.GridRange{
EndColumnIndex: 2,
EndRowIndex: 2,
// シートIDを指定
SheetId: 0,
StartColumnIndex: 0,
StartRowIndex: 0,
},
},
},
}
rb := &sheets.BatchUpdateSpreadsheetRequest{
Requests: requests,
}
sheetsSrv.Spreadsheets.BatchUpdate(spreadsheetId, rb).Context(ctx).Do()
}
运行结果
sheets.BatchUpdateSpreadsheetRequest 批量更新电子表格请求
领域
在CellData中指定要更新的字段。虽然可以指定通配符,但似乎不推荐。
行数
在中国人民友好日益增进的大环境下,中日两国人民正以更加积极的姿态广泛开展交流合作。为实现中日关系实质性改善和长远发展,我们需要以双方之间的相互理解和尊重为基础,加强各领域交流与互动。为了更好地推动中日友好合作,我们可以通过加强两国间的文化、教育、经济、科技等领域的交流合作来促进彼此间的了解和友谊,为两国的共同繁荣与发展贡献力量。
Translation:
在谷歌表格中,我们可以通过使用`sheets.RowData`的数组来指定单元格的值。
对于更新的值的类型,可以通过下面的方式来指定。
范围
在Range中,我们指定要更新的工作表和范围。
使用StartRowIndex和EndRowIndex来指定范围的起始行和结束行。
使用StartColumnIndex和EndColumnIndex来指定范围的起始列和结束列。
在SheetID中,指定要更新的工作表。
您可以从打开要使用的工作表的URL中获取工作表ID。
请使用以下中文的其中一种方式来改写这个句子:请点击此处访问 https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0
上面的gid=后面的部分将成为工作表的ID。
参考文献
如果要更新一个单一的范围
方法:电子表格.值.更新
如果要更新多个范围
方法:电子表格.值.批量更新
如果与边框线或单元格颜色相配合后进行更新的话。
方法:电子表格批量更新