皆様こんにちは、いわーくです。
Goは実行環境を選ばず、バイナリ1個で動作するので簡単なツールを作るのが非常に手軽ですよね。
さらに、ゴルーチンによって並行処理が簡単に実装できるので、同時に色々な処理をさせるのが得意です。
そんなGoを使ってスプレッドシートを読み書きすることができれば、とても便利ですよね!
執筆時点ではGo言語からスプレッドシートを読み書きできるパッケージは見つからなかったので、自分で作りました。
githubで公開しています => spreadsheet
【6/25追記】
どうやら公式のパッケージが公開されたみたいです。こちらのQuickStartに簡単な使い方が書かれています。
インストール
他のGoのパッケージと同様にgo get github.com/Iwark/spreadsheet
でインストールできます。
ドキュメントはgodocで閲覧できます。
使い方
認証にoauth2のclientを使います。Googleのdeveloper consoleからサービスアカウントキーを生成しておきます。
ここでは、client_secret.json
として保存します。こんな感じのやつです。
{
"type": "service_account",
"project_id": "xxxxxxx",
"private_key_id": "xxxxxxxxxxx",
"private_key": "-----BEGIN PRIVATE KEY-----xxxxxxxxxEND PRIVATE KEY-----\n",
"client_email": "xxxxxx@xxxxxxx.iam.gserviceaccount.com",
"client_id": "xxxxxxxxxxx",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxx.iam.gserviceaccount.com"
}
spreadsheet
パッケージは次のように使うことができます。
package main
import (
"fmt"
"io/ioutil"
"github.com/Iwark/spreadsheet"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
)
func main() {
data, _ := ioutil.ReadFile("client_secret.json")
conf, _ := google.JWTConfigFromJSON(data, spreadsheet.Scope)
client := conf.Client(context.TODO())
service := &spreadsheet.Service{Client: client}
sheets, _ := service.Get("1mYiA2T4_QTFUkAXk0BE3u7snN2o5FgSRqxmRrn_Dzh4")
ws, _ := sheets.Get(0)
for _, row := range ws.Rows {
for _, cell := range row {
fmt.Println(cell.Content)
}
}
// Update cell content
ws.Rows[0][0].Update("hogehoge")
// Make sure call Synchronize to reflect the changes
ws.Synchronize()
}
その他できること
基本的な読み書きに加えて、現段階では以下のような機能があります。
- IDを元にシートを取得
- タイトルを元にシートを取得
- シートの追加・削除
詳しくはドキュメントをごらんください。
内部的にやっていること
読み込みに関しては、Googleが用意しているHTTPのAPIを使ってXMLを取得し、パースしています。
書き込みに関してもGoogleがHTTPのAPIを用意しているので、ユーザーが変更したセルを保存しておいてSynchronize
のタイミングでバッチ用のAPIを使って変更したセルを一気に送信しています。
その他も大体そんな感じです。
まだ作成途中です
現状、シートを読み込む際に空白のセルも含めて取得してしまっているので、10000セル以上あるようなシートだとXMLのParseに非常に時間がかかってしまいます。
最初のリクエストでは空白のセルは受け取らず、書き込みの際に空白のセルが更新されていたらIDを取得し、書き込みを行うようにしたいですね。色々と改善の余地がありそうです。
それにしてもGoは速くて楽しいです!
良ければ使ってみてください!