Try Golang! GoogleスプレッドシートだってGoで操作したいぞ!

How to use Google Sheets API with Golang

Takuo
VELTRA Engineering
8 min readJul 30, 2018

--

以前、ExcelをGoで操作する記事を書きました。

この記事はGoでExcelを操作するという内容だったのですが、実はGoogle スプレッドシートについても、Goで操作できるライブラリが公式でサポートされているということを知ったので、本日はその紹介です。

まずは事前準備(認証)

スプレッドシートを扱う場合、通常はGoogle Sheets APIを利用して操作することになります。今回利用するのもこのAPIのGo言語向けライブラリであるgoogle.golang.org/api/sheets/v4ですので、Google Sheets APIを利用するための準備が必要となります。

認証として使用できるのは、API KeyOAuth2.0の2つ。ただ、ガイドをよくよく読んでみると、扱いたいデータがプライベートなものの場合は、OAuthしか使えないようなので、OAuthの鍵を作成しましょう。作成ルートはいくつかありますが、今回はGoogle Sheets APIのGo Quickstartから作成してみます。

Go QuickstartのページのENABLE THE GOOGLE SHEETS APIボタンをクリックすると、まずはプロジェクトの選択ボックスが表示されるので、適当なプロジェクトを選択します。プロジェクトが存在しない場合は新規作成してください。

続いて、product nameを入れろと言われます。これは、OAuth認証の同意画面(後述)に表示される名前なのですが、ひとまず個人で使用する分には適当で構いません。

すると、OAuth認証で使用する設定情報が表示されます。Goのプログラムからこの設定情報をファイルで読込むので、ダウンロードしておいてください。なお、このファイルはGCPのコンソールからいつでもダウンロードできます。

以上で認証に必要な事前準備は完了です。ちなみに、GCPのプロジェクトを作成すると少しお金まわりが気になりますが、Google Sheets APIは1ユーザ当たり100秒間で100リクエストまでは無料。ちょっとしたツールを作るだけなら、特に気にしなくて良さそうですね。

GoからSpreadsheetsを読む!

それでは早速、Goのプログラムからスプレッドシートを読んでみましょう。先程ダウンロードしたcredentials.jsonmain.goを同じディレクトリに格納し、Quickstartのサンプルmain.goにまるっとコピーして実行してみます。すると下記のようにリンクが表示されます。

このリンクをブラウザで開くと、Googleユーザにはおなじみのアカウント選択画面が表示されます。ここで使用したいアカウントを選択します。

次にOAuthの同意画面が表示されるので、こちらを許可します。なお、OAuthの鍵を作成する際に入力したproduct nameが、ここで表示されています。

すると下記の様にコードが表示されますので、このコードを、Goのプログラムを実行しているコンソールに貼り付けます。

期待通りスプレッドシートのデータを取得できました。

なお、ログに出力されている通り、token.jsonというファイルが作成されています。このトークンを使用することで、再実行時にはOAuth認証をしなくても済むようになります。

Google Sheets APIのあれこれ

さて、これまでほぼほぼGoが関係なかったので、少しだけGoのソースコードを覗いてみることにしましょう。

権限について

OAuthの同意画面で許可をしたのは、「Googleスプレッドシートの表示」の権限だけでした。これはつまり、書込権限は許可していないことになります。これは、サンプルコードの下記で指定しています。

書込権限も許可する場合は、spreadsheets.readonlyを単なるspreadsheetsに書き換えてあげます。なお、ここを変更した場合はトークンの再取得が必要になります。

スプレッドシートの指定方法

ソースコードで下記の記載がある通り、どのスプレッドシートを対象とするかはIDを指定して行います。特定のスプレッドシートのみ使用する場合は、事前にIDを確認しておく必要があります。

なお、Googleドライブの特定のフォルダ内のスプレッドシートを、、、といった場合は、別途Google Drive APIを使用するのだそうですが、こちらは未確認ですので割愛。

読み込みたいセルの指定方法

読み込みたいセルの範囲は、通常{sheetName}!{startCell}:{endCell}といった文字列で指定します。サンプルでは下記のように指定しています。

下記のように、いくつかの指定方法が存在します。

  • Sheet1!A1:B2 : シート名Sheet1のA1セルからB2セルまで
  • Sheet1!A:A : シート名Sheet1のA列全て
  • Sheet1!1:2 : シート名Sheet1の1~2行目全て
  • Sheet1!A2:E : シート名Sheet1のA~E列の2行目以降の全て
  • Sheet1 : シート名Sheet1の全て
  • A1:B2 : 最初に表示されるシートのA1セルからB2セルまで

範囲を指定してAPIを呼び出せば、レスポンスとしてシートのデータを2次元配列として受け取れるので、後は煮るなり焼くなり好きに加工しましょう。

結局APIの使い方の説明で終始してしまい、Go特有の話はほぼありませんでしたが、これでGoでもスプレッドシートを使ったツール作成ができるようになりました。CLIツールなので非エンジニアに使ってもらうツールとしてはやや不安がありますが、エンジニアが使用する分には特に問題ないかと。これでいっそう、Excelからスプレッドシートへの移行が進みそうですね。

--

--

Takuo
VELTRA Engineering

Engineer who likes travel, simple code, and something new