28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoでSpreadsheetを操作するパッケージを作った

Last updated at Posted at 2016-02-24

皆様こんにちは、いわーくです。

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として保存します。こんな感じのやつです。

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パッケージは次のように使うことができます。

main.go
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は速くて楽しいです!

良ければ使ってみてください!

28
27
2

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
28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?