Googleが公開しているgoogle.golang.org/api/sheets
パッケージを使うと、Go言語からSpreadsheetの内容の読み込みや書き込みを行うことができます。ただし、自分で素直に認証からデータの読み書きまでを一通り書こうとすると、何かと長い実装になってしまうので、ラッパーライブラリherschelを使って、もっと手軽にSpreadsheetの読み書きを可能にする方法を紹介します。まずは、データの読み取りから。
前準備
サービスアカウントの準備
API経由でスプレッドシートにアクセスするには、ユーザアカウントかサービスアカウントを使った認証が必要です。どちらを使って認証するべきかは、ケースによりますが、ここではサービスアカウントを使って認証する場合について記述します。
参考
Using OAuth 2.0 for Server to Server Applications
サービスアカウントの作成
サービスアカウントのページを開きます。プロジェクトを選択するように求められるので、プロジェクトを選択します。プロジェクトが存在しない場合は、新しいプロジェクトを作成します。
「サービスアカウントの作成」画面を開き、サービスアカウントを作成します。
このサービスアカウントIDは、後ほどスプレッドシートの共有設定で使用します。
オプションの権限の設定は不要なので次に進みます。
キーの作成のところで新しいキー(JSON)を作成します。キーを作成するとJSONファイルがダウンロードされます。このJSONファイルは後ほど使用するので、credentials.json
のようなわかりやすい名前で保存しておいてください。
テスト用のスプレッドシートの準備
共有設定
上で作成したサービスアカウントが、このスプレッドシートにアクセスできるようにします。
共有設定から、上で作成したサービスアカウントのサービスアカウントIDを追加します。
なお、細かい部分ですが、その際「通知」のチェックを入れた状態で登録をすると、メールを送信できなかった旨のエラーが届くので、外しておきましょう。
スプレッドシートIDの確認
スプレッドシートのIDは、URLから確認できます。spreadsheets/d/
から次のスラッシュ(/
)までの間がスプレッドシートのIDです。
後ほど、ここで確認したIDをコード上に記述します。
herschelのインストール
go get github.com/yokoe/herschel
herschelをインストールすると、動作に必要な他のパッケージ(google.golang.org/api/sheets
など)も自動的にインストールされます。
データの読み込み
package main
import (
"fmt"
"log"
"github.com/yokoe/herschel"
"github.com/yokoe/herschel/option"
)
func main() {
// サービスアカウントの認証情報を使って、スプレッドシートにアクセスするためのClientを用意します
client, err := herschel.NewClient(option.WithServiceAccountCredentials("credentials.json"))
if err != nil {
log.Fatalf("invalid config or token %s", err)
}
// ID「12345678...」のスプレッドシートから「シート1」の内容を読み込みます
table, err := client.ReadTable("12345678...", "シート1")
if err != nil {
log.Fatalf("read error %s", err)
}
// 読み込んだ「シート1」のセル(0, 1) (0, 2) (0, 3)の中身を表示します。
fmt.Println(table.GetStringValue(0, 0))
fmt.Println(table.GetStringValue(0, 1))
fmt.Println(table.GetIntValue(0, 2))
}
先ほど作成したサービスアカウントの認証情報が含まれるJSONファイルをcredentials.json
としてプログラムから参照できる場所に置いておきます。
client, err := herschel.NewClient(option.WithServiceAccountCredentials("credentials.json"))
そのクライアントを使って、スプレッドシート(ID: 12345678...)の「シート1」の中身を読み込みます。
table, err := client.ReadTable("12345678...", "シート1")
シートの中身はTable
という構造体に格納され、GetStringValue
メソッドを使って値を取り出すことができます。
table.GetStringValue(0, 0) // 0行目、0列目のセルの中身をStringとして取得する => "Hello"
文字列以外のフォーマットで取得したい場合はGetValue
、GetIntValue
、GetInt64Value
などが使えます。
トラブルシューティング
Error 403: The caller does not have permission, forbidden が出る
スプレッドシートにサービスアカウントからアクセスできない可能性があります。共有設定で、サービスアカウントが追加されているか確認しましょう。
まとめ
以上、Herschelを使ってGoからSpreadsheetの中身を読み込む方法を紹介しました。次は書き込みについても紹介しようと思います。