Try Golang! GoogleスプレッドシートだってGoで操作したいぞ!
How to use Google Sheets API with Golang
以前、ExcelをGoで操作する記事を書きました。
この記事はGoでExcelを操作するという内容だったのですが、実はGoogle スプレッドシートについても、Goで操作できるライブラリが公式でサポートされているということを知ったので、本日はその紹介です。
まずは事前準備(認証)
スプレッドシートを扱う場合、通常はGoogle Sheets APIを利用して操作することになります。今回利用するのもこのAPIのGo言語向けライブラリであるgoogle.golang.org/api/sheets/v4
ですので、Google Sheets APIを利用するための準備が必要となります。
認証として使用できるのは、API KeyとOAuth2.0の2つ。ただ、ガイドをよくよく読んでみると、扱いたいデータがプライベートなものの場合は、OAuthしか使えないようなので、OAuthの鍵を作成しましょう。作成ルートはいくつかありますが、今回はGoogle Sheets APIのGo Quickstartから作成してみます。
Go QuickstartのページのENABLE THE GOOGLE SHEETS API
ボタンをクリックすると、まずはプロジェクトの選択ボックスが表示されるので、適当なプロジェクトを選択します。プロジェクトが存在しない場合は新規作成してください。
続いて、product nameを入れろと言われます。これは、OAuth認証の同意画面(後述)に表示される名前なのですが、ひとまず個人で使用する分には適当で構いません。
すると、OAuth認証で使用する設定情報が表示されます。Goのプログラムからこの設定情報をファイルで読込むので、ダウンロードしておいてください。なお、このファイルはGCPのコンソールからいつでもダウンロードできます。
以上で認証に必要な事前準備は完了です。ちなみに、GCPのプロジェクトを作成すると少しお金まわりが気になりますが、Google Sheets APIは1ユーザ当たり100秒間で100リクエストまでは無料。ちょっとしたツールを作るだけなら、特に気にしなくて良さそうですね。
GoからSpreadsheetsを読む!
それでは早速、Goのプログラムからスプレッドシートを読んでみましょう。先程ダウンロードしたcredentials.json
とmain.go
を同じディレクトリに格納し、Quickstartのサンプルをmain.go
にまるっとコピーして実行してみます。すると下記のようにリンクが表示されます。
$ go run main.go
Go to the following link in your browser then type the authorization code:
https://accounts.google.com/o/oauth2/auth?access_type=...
このリンクをブラウザで開くと、Googleユーザにはおなじみのアカウント選択画面が表示されます。ここで使用したいアカウントを選択します。
次にOAuthの同意画面が表示されるので、こちらを許可します。なお、OAuthの鍵を作成する際に入力したproduct nameが、ここで表示されています。
すると下記の様にコードが表示されますので、このコードを、Goのプログラムを実行しているコンソールに貼り付けます。
期待通りスプレッドシートのデータを取得できました。
Saving credential file to: token.json
Name, Major:
Alexandra, English
Andrew, Math
Anna, English
...
なお、ログに出力されている通り、token.json
というファイルが作成されています。このトークンを使用することで、再実行時にはOAuth認証をしなくても済むようになります。
Google Sheets APIのあれこれ
さて、これまでほぼほぼGoが関係なかったので、少しだけGoのソースコードを覗いてみることにしましょう。
権限について
OAuthの同意画面で許可をしたのは、「Googleスプレッドシートの表示」の権限だけでした。これはつまり、書込権限は許可していないことになります。これは、サンプルコードの下記で指定しています。
// If modifying these scopes, delete your previously saved token.json.
config, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/spreadsheets.readonly")
書込権限も許可する場合は、spreadsheets.readonly
を単なるspreadsheets
に書き換えてあげます。なお、ここを変更した場合はトークンの再取得が必要になります。
スプレッドシートの指定方法
ソースコードで下記の記載がある通り、どのスプレッドシートを対象とするかはIDを指定して行います。特定のスプレッドシートのみ使用する場合は、事前にIDを確認しておく必要があります。
spreadsheetId := "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
なお、Googleドライブの特定のフォルダ内のスプレッドシートを、、、といった場合は、別途Google Drive APIを使用するのだそうですが、こちらは未確認ですので割愛。
読み込みたいセルの指定方法
読み込みたいセルの範囲は、通常{sheetName}!{startCell}:{endCell}
といった文字列で指定します。サンプルでは下記のように指定しています。
readRange := "Class Data!A2:E"
下記のように、いくつかの指定方法が存在します。
Sheet1!A1:B2
: シート名Sheet1
のA1セルからB2セルまでSheet1!A:A
: シート名Sheet1
のA列全てSheet1!1:2
: シート名Sheet1
の1~2行目全てSheet1!A2:E
: シート名Sheet1
のA~E列の2行目以降の全てSheet1
: シート名Sheet1
の全てA1:B2
: 最初に表示されるシートのA1セルからB2セルまで
範囲を指定してAPIを呼び出せば、レスポンスとしてシートのデータを2次元配列として受け取れるので、後は煮るなり焼くなり好きに加工しましょう。
結局APIの使い方の説明で終始してしまい、Go特有の話はほぼありませんでしたが、これでGoでもスプレッドシートを使ったツール作成ができるようになりました。CLIツールなので非エンジニアに使ってもらうツールとしてはやや不安がありますが、エンジニアが使用する分には特に問題ないかと。これでいっそう、Excelからスプレッドシートへの移行が進みそうですね。