仕事でスプレッドシートのデータをSQLに変換する必要があったため、楽してGoでできるかなと思ったので、やってみました。
ざざっと検索してみた結果、スプレッドシートを操作するには、Googleが公開している"google.golang.org/api/sheets/v4"
というパッケージを利用すればいけるそうとのことなので実際に試してみます。
まずはドキュメント
最初に日本語記事をいくつか見つけたのでそこを参考にしていたらドキュメント発見しました。(最初からドキュメントだけで理解できる人間になりたいですね。)
とりあえずはquickstartを読んでみましょう!
Google Sheets API v4 Go Quickstart(英語)
こういうときに英語記事を読んでおけって言って少しカッコつけたくなりますよね。
適当にGoogle翻訳しながら流れを抑えます。あと、サンプルコード見ればだいたい動きます。(適当)
中身を見てみると、APIを使えるようにして、認証して実行するという形で行けそうです。
ドキュメントの中身はOAuthのやり方になっていますが、少しコードの記述量が多くなる形でややこしくなるので、サービスアカウントキーを使うやり方でご紹介します。
準備
Google Sheets APIを有効にする
ここからはプロジェクトが既にある前提で進めていきます。
まずはダッシュボードのメニューより、APIとサービス > ライブラリ
を選択します。
検索窓にspreadと入力すれば、
Google Sheets API
が表示されますので、クリックします。
有効にします。
サービスアカウントの作成とサービスアカウントキーの取得
有効にしたあとに、再度Google Sheets APIの画面にいくと以下の画面が表示されます。ここで認証情報をクリックして、サービスアカウントキーを発行してcredentialファイルを入手します。
認証情報をクリックすると右側に+認証情報を作成
と出てくるので、サービスアカウント
を選択します。
サービスアカウントの情報を入れてサービスアカウントを作成します。
サービスアカウント名を入れると自動でサービスアカウントIDが入力されるので、今回はそのまま完了ボタンでOKです。
サービスアカウントが作成されると、サービスアカウントという欄に先程作ったものが出てくるのでクリックします。
すると下の画面が出てくるので、鍵を追加
を押します。
するとJSONの鍵が取得できるので、作成
ボタンを押すとダウンロードが始まります。このjsonファイルは後で使いますので、一旦secret.json
という名称に変更しておいてください。
スプレッドシートの準備
スプレッドシートはなんでもいいのでとりあえず適当に作成しておいてください。右上の共有ボタンを押して、先程のサービスアカウントから読み取れるように共有しておきます。
先程作成したサービスアカウントIDを共有すると、ダウンロードしたサービスアカウントキーを使ってプログラムコードを認証をすることでスプレッドシートを操作できるようになります。
準備はここまでです。ついでに適当にシートの中身も埋めてみましょう。
Goで操作
スプレッドシートのIDはURLhttps://docs.google.com/spreadsheets/d/〜/edit
までの文字列をコピーして以下のspreadSheetIDに入れてください。
ダウンロードしたサービスアカウントキーはgoのworkspace内にcredentails/secret.json
という形で保持しておきます。
読み取り
まずは読み取り。
package main import ( "context" "errors" "fmt" "log" "google.golang.org/api/option" "google.golang.org/api/sheets/v4" ) var spreadsheetID = "your_spreadsheet_id" func main() { credential := option.WithCredentialsFile("credentials/secret.json") srv, err := sheets.NewService(context.TODO(), credential) if err != nil { log.Fatal(err) } readRange := "シート1!A1:B3" resp, err := srv.Spreadsheets.Values.Get(spreadsheetID, readRange).Do() if err != nil { log.Fatalln(err) } if len(resp.Values) == 0 { log.Fatalln("data not found") } for _, row := range resp.Values { fmt.Printf("%s, %s\n", row[0], row[1]) } }
これを実行すると以下のように出てきます。
$ go run main.go hoge, foo fuga, bar piyo, baz
少し解説しますと、Google Sheets API v4 Go Quickstart(英語)に載っているOAuthの設定だとコードが少し長くなってしまうので、サービスアカウントキーを使うことで、option.WithCredentialsFile("credentials/secret.json")
のみにコードが絞れました。
あとはほぼ同じなんですが、sheets.New()
の部分が古くなっていて非推奨となっていたので、sheets.NewService()
を使いました。
以下godocより引用しています。
また、範囲の指定の仕方ですが、シート名!開始セル:終了セル<code>という形で指定します。もちろん、</code>
シート名!A:Bとすれば、A列とB列すべてを選択している状態で操作することができます。</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3>書き込み</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>書き込みは
メソッドを使います。</p>
<!-- /wp:paragraph -->
<!-- wp:enlighter/codeblock -->
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">
package main
import (
"context"
"errors"
"fmt"
"log"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
)
var spreadsheetID = "your_spreadsheet_id"
func main() {
credential := option.WithCredentialsFile("credentials/secret.json")
srv, err := sheets.NewService(context.TODO(), credential)
if err != nil {
log.Fatal(err)
}
writeRange := "シート1!A4:B5"
vr := &sheets.ValueRange{
Values: [][]interface{}{
{"xxx", "ttt"},
{"222", 111},
},
}
_, err = srv.Spreadsheets.Values.Update(spreadsheetID, writeRange, vr).ValueInputOption("RAW").Do()
if err != nil {
log.Fatalln(err)
}
}</pre>
<!-- /wp:enlighter/codeblock -->
<!-- wp:paragraph -->
<p>上のコードを実行すると、下記の画像のようにスプレッドシート内に文字列を書き込むことに成功しました。</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":273,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="https://ryomura.com/wp-content/uploads/2021/01/image-13.png" alt="" class="wp-image-273"/></figure>
<!-- /wp:image -->
<!-- wp:paragraph -->
<p>
`についてはこちらのドキュメントにあるとおり、何も解析させないというオプションでした。
以上、シンプルな操作でしたが、Goでスプレッドシートを操作する手順の紹介でした。