Go

Goでスプレッドシートを操作しよう

仕事でスプレッドシートのデータをSQLに変換する必要があったため、楽してGoでできるかなと思ったので、やってみました。

ざざっと検索してみた結果、スプレッドシートを操作するには、Googleが公開している"google.golang.org/api/sheets/v4"というパッケージを利用すればいけるそうとのことなので実際に試してみます。

まずはドキュメント

最初に日本語記事をいくつか見つけたのでそこを参考にしていたらドキュメント発見しました。(最初からドキュメントだけで理解できる人間になりたいですね。)

とりあえずはquickstartを読んでみましょう!
Google Sheets API v4 Go Quickstart(英語)

こういうときに英語記事を読んでおけって言って少しカッコつけたくなりますよね。

適当にGoogle翻訳しながら流れを抑えます。あと、サンプルコード見ればだいたい動きます。(適当)

中身を見てみると、APIを使えるようにして、認証して実行するという形で行けそうです。
ドキュメントの中身はOAuthのやり方になっていますが、少しコードの記述量が多くなる形でややこしくなるので、サービスアカウントキーを使うやり方でご紹介します。

以下はGoogle Cloud Platformに登録済みであることが前提となります。もし、ご登録されていない場合は、こちらの記事を参考に登録をしてみてください。12ヶ月300ドル分無料で始められます。

準備

Google Sheets APIを有効にする

ここからはプロジェクトが既にある前提で進めていきます。
まずはダッシュボードのメニューより、APIとサービス > ライブラリを選択します。

検索窓にspreadと入力すれば、Google Sheets APIが表示されますので、クリックします。

有効にします。

サービスアカウントの作成とサービスアカウントキーの取得

有効にしたあとに、再度Google Sheets APIの画面にいくと以下の画面が表示されます。ここで認証情報をクリックして、サービスアカウントキーを発行してcredentialファイルを入手します。

認証情報をクリックすると右側に+認証情報を作成と出てくるので、サービスアカウントを選択します。

サービスアカウントの情報を入れてサービスアカウントを作成します。
サービスアカウント名を入れると自動でサービスアカウントIDが入力されるので、今回はそのまま完了ボタンでOKです。

サービスアカウントが作成されると、サービスアカウントという欄に先程作ったものが出てくるのでクリックします。

すると下の画面が出てくるので、鍵を追加を押します。

するとJSONの鍵が取得できるので、作成ボタンを押すとダウンロードが始まります。このjsonファイルは後で使いますので、一旦secret.jsonという名称に変更しておいてください。

ダウンロードした鍵は秘密鍵となりますので、他人に渡さないようにしてください。くれぐれもgitでコミットしないようにご注意ください。

スプレッドシートの準備

スプレッドシートはなんでもいいのでとりあえず適当に作成しておいてください。右上の共有ボタンを押して、先程のサービスアカウントから読み取れるように共有しておきます。

先程作成したサービスアカウント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でスプレッドシートを操作する手順の紹介でした。

ABOUT ME
りょう
都内在住 | 30代 駆け出しエンジニアやエンジニアになりたい人向けに役立つ情報発信中 とある中小ベンチャーのバックエンドエンジニアです。 別の職種の仕事をしていたがある日突然webサイト作成に興味を持ち、そこから猛勉強をしてエンジニアになりました。 エンジニアになって2年の実務を経て独立してフリーランスに 現在もフルタイムで働きつつやってます。 Go | GCP