LoginSignup
3
5

More than 5 years have passed since last update.

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

Posted at

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の中身を読み込む方法を紹介しました。次は書き込みについても紹介しようと思います。

リンク

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5