Posted at

Go言語で、Google Spreadsheet上のデータを取得する

Googleが公開しているgoogle.golang.org/api/sheetsパッケージを使うと、Go言語からSpreadsheetの内容の読み込みや書き込みを行うことができます。ただし、自分で素直に認証からデータの読み書きまでを一通り書こうとすると、何かと長い実装になってしまうので、ラッパーライブラリherschelを使って、もっと手軽にSpreadsheetの読み書きを可能にする方法を紹介します。まずは、データの読み取りから。


前準備


サービスアカウントの準備

API経由でスプレッドシートにアクセスするには、ユーザアカウントかサービスアカウントを使った認証が必要です。どちらを使って認証するべきかは、ケースによりますが、ここではサービスアカウントを使って認証する場合について記述します。

参考

Using OAuth 2.0 for Server to Server Applications


サービスアカウントの作成

サービスアカウントのページを開きます。プロジェクトを選択するように求められるので、プロジェクトを選択します。プロジェクトが存在しない場合は、新しいプロジェクトを作成します。

「サービスアカウントの作成」画面を開き、サービスアカウントを作成します。

Screen Shot 2018-12-02 at 0.47.14.png

このサービスアカウントIDは、後ほどスプレッドシートの共有設定で使用します。

オプションの権限の設定は不要なので次に進みます。

Screen Shot 2018-12-02 at 0.49.40.png

キーの作成のところで新しいキー(JSON)を作成します。キーを作成するとJSONファイルがダウンロードされます。このJSONファイルは後ほど使用するので、credentials.jsonのようなわかりやすい名前で保存しておいてください。


テスト用のスプレッドシートの準備

Screen Shot 2018-12-01 at 23.46.21.png


共有設定

上で作成したサービスアカウントが、このスプレッドシートにアクセスできるようにします。

共有設定から、上で作成したサービスアカウントのサービスアカウントIDを追加します。

Screen Shot 2018-12-02 at 0.54.56.png

なお、細かい部分ですが、その際「通知」のチェックを入れた状態で登録をすると、メールを送信できなかった旨のエラーが届くので、外しておきましょう。


スプレッドシートIDの確認

Screen Shot 2018-12-01 at 23.48.45.png

スプレッドシートのIDは、URLから確認できます。spreadsheets/d/から次のスラッシュ(/)までの間がスプレッドシートのIDです。

後ほど、ここで確認したIDをコード上に記述します。


herschelのインストール

go get github.com/yokoe/herschel

herschelをインストールすると、動作に必要な他のパッケージ(google.golang.org/api/sheetsなど)も自動的にインストールされます。


データの読み込み


main.go

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"

文字列以外のフォーマットで取得したい場合はGetValueGetIntValueGetInt64Valueなどが使えます。


トラブルシューティング


Error 403: The caller does not have permission, forbidden が出る

スプレッドシートにサービスアカウントからアクセスできない可能性があります。共有設定で、サービスアカウントが追加されているか確認しましょう。


まとめ

以上、Herschelを使ってGoからSpreadsheetの中身を読み込む方法を紹介しました。次は書き込みについても紹介しようと思います。


リンク