使用Go语言利用Google Sheets API进行【认证/单元格引用】
経緯 – 在中文中,此词可以被解释为”过程”或”经过”。
由于在业务中有机会使用Google Sheets API,因此我整理了关于Go语言中的身份验证和值的参考信息。
由于我正在学习Go语言和Google Sheets API,所以如果有错误的描述或不推荐的代码写法,请指正。
事前准备
我們將在事前準備中執行以下作業:
在執行環境中運行下列指令,以安裝套件。
go get -u golang.org/x/net/context
go get -u golang.org/x/oauth2
go get -u google.golang.org/api/sheets/v4
以下的工作我会省略详细内容,仅描述工作流程。
-
- 登录GCP
-
- 创建任意项目
-
- 在创建的项目中启用Google Sheets API
-
- 创建服务帐号(无需选择角色)
-
- 以JSON格式下载密钥
- 将要使用的电子表格与服务帐号共享
使用服务账户进行身份认证。
示例代码
用以下代码进行身份验证。
在示例代码中,我们省略了错误处理。
pakage main
import (
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
func main() {
conf := &jwt.Config{
// サービスアカウントのEメールアドレス
Email: "",
// サービスアカウントのプライベート鍵
PrivateKey: []byte(""),
TokenURL: google.JWTTokenURL,
Scopes: []string{
"https://www.googleapis.com/auth/spreadsheets.readonly",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
}
jtw.配置
在执行上述代码时,您需要将预先下载的JSON文件中的client_email和private_key添加到jwt.Config的Email和PrivateKey值中。jwt.Config的Scopes用于指定对于电子表格的权限。
填补
我认为在实际使用中,应该采用以下方式来实现,而不是在代码中嵌入密钥和邮件地址,通过将下载的JSON文件放置在相同路径下并进行加载等方式来实现,而不是通过动作确认。
package main
import (
"encoding/json"
"io/ioutil"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
type credJson struct {
Email string `json:"client_email"`
PrivateKey string `json:"private_key"`
}
func main() {
// ダウンロードしたJSONファイルの名前はcredentials.jsonとしています。
// 必要に応じて任意のファイル名に変更してください。
bytes, _ := ioutil.ReadFile("credentials.json")
var cred credJson
json.Unmarshal(bytes, &cred)
conf := &jwt.Config{
Email: cred.Email,
PrivateKey: []byte(cred.PrivateKey),
TokenURL: google.JWTTokenURL,
Scopes: []string{
"https://www.googleapis.com/auth/spreadsheets.readonly",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
}
参考单元格的值
请提供示例代码。
以下是我们参考的电子表格的写法。
在参考时,请使用Spreadsheets.Values.Get()。
在实施时,按照下面的代码进行实施。
在示例代码中,我们省略了错误处理部分。
package main
import (
"fmt"
"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"
)
func main() {
conf := &jwt.Config{
// サービスアカウントのEメールアドレス
Email: "",
// サービスアカウントのプライベート鍵
PrivateKey: []byte(""),
TokenURL: google.JWTTokenURL,
Scopes: []string{
"https://www.googleapis.com/auth/spreadsheets.readonly",
},
}
client := conf.Client(oauth2.NoContext)
sheetsSrv, _ := sheets.New(client)
// スプレッドシートの指定
spreadsheetId := ""
// 参照範囲を指定
valueRange := "Sheet1!A1:B3"
ctx := context.Background()
// セルの値を参照
resp, _ := sheetsSrv.Spreadsheets.Values.Get(spreadsheetId, valueRange).Context(ctx).Do()
for _, row := range resp.Values {
fmt.Printf("%s, %s\n", row[0], row[1])
}
}
执行结果
hoge1, hogehoge1
hoge2, hogehoge2
hoge3, hogehoge3
以下是一种可能的中文表述:「电子表格ID」
你可以通过使用Spreadsheets.Values.Get(“スプレッドシートID”, “範囲”)来获取指定的”スプレッドシートID”,这个ID可以从你要使用的电子表格的URL中获取到。
请将以下内容以中文进行适当表达,只需提供一个选项:
https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0
上述的hogehoge部分将成为Google表格的ID。
另外,#gid=之后的部分将成为每个工作表的ID。
参考范围
您可以使用Spreadsheets.Values.Get(“表格ID”, “範圍”)中的範圍引用以下描述。
-
- “シート名”:シート全体を範囲とします。
- “シート名!A1:B3″:シートのA1からB3までを参照する範囲とします。
查询参数
在Spreadsheets.Values.Get()的查询参数中,有以下三个选项。
-
- majorDimension
-
- valueRenderOption
- dateTimeRenderOption
主要维度
这个查询参数可以指定是按行引用还是按列引用。
默认为按行引用。
如果在示例代码中使用majorDimension,请按照下列方式进行修改。
// 35行目
resp, _ := sheetsSrv.Spreadsheets.Values.Get(spreadsheetId, valueRange).MajorDimension("COLUMNS").Context(ctx).Do()
执行结果
hoge1, hoge2
hogehoge1, hogehoge2
对于值的渲染选项
你可以使用这个查询参数来指定数学公式所描述的单元格的值。
默认值为FORMATTED_VALUE。
取得した値はstring型となります。UNFORMATTED_VALUEセルの値は数式の計算結果になります。セルの表示形式は反映されません。
取得した値は数値の場合はfloat64型、文字列はstring型となります。FORMULAセルの値は数式のままとなります。セルの表示形式は反映されません。
取得した値は数値の場合はfloat64型、数式と文字列はstring型となります。
如果在示例代码中使用valueRenderOption参数,需要进行以下修改(在这里将其设置为”UNFORMATTED_VALUE”)。
// 35行目
resp, _ := sheetsSrv.Spreadsheets.Values.Get(spreadsheetId, valueRange).ValueRenderOption("UNFORMATTED_VALUE").Context(ctx).Do()
// 38行目
fmt.Printf("%f, %f\n", row[0], row[1])
将电子表格更改为如下所示。(将A1设置为货币格式。)
执行结果
12.300000, 12.300000
日期时间渲染选项
你可以使用这个查询参数来指定用于日期和时间格式的单元格值的显示方式。
需要注意的是,如果valueRenderOption设置为FORMATTED_VALUE,则该查询参数将被忽略。
默认值为SERIAL_NUMBER。
この設定値を指定して取得した日付や時刻の値はfloat64型となります。FORMATTED_STRING日付や時刻の値を表示形式の値で取得します。
この設定値を指定して取得した日付や時刻の値はstring型となります。
如果您在示例代码中使用dateTimeRenderOption,可以进行如下修正(在此处将SERIAL_NUMBER指定为设置值)。
// 35行目
resp, _ := sheetsSrv.Spreadsheets.Values.Get(spreadsheetId, valueRange).ValueRenderOption("UNFORMATTED_VALUE").DateTimeRenderOption("SERIAL_NUMBER").Context(ctx).Do()
// 38行目(SERIAL_NUMBERのみ)
fmt.Printf("%f, %f\n", row[0], row[1])
我将电子表格更改为以下格式:A1为日期,B1为时间。
执行结果
1.000000, 0.624676
请参考以下资料。
请参看以下参考资料。
请参考下列参考资料。
请查阅下列资料。
使用服务账号进行认证
包google
引用单元格的值
快点开始
方法:电子表格.值.获取
维度
值渲染选项
日期时间渲染选项