The Round

合同会社ナイツオの開発ブログ

静岡でGo言語やりたい人!!→こちら

Node.jsからGoogle Spreadsheetデータを取得する - その2

マツウラです。

前回の続きになります。 今回はGoogleDriveに保存してあるスプレッドシートのデータを取得します。

実行環境は次の通りです。

  • Node.js 0.10.25
  • Google APIs Client Library for Node.js(alpha) 0.4.7

GoogleSpreadsheetsAPIはスプレッドシートのデータを読み込み、変更することができるAPIです。
このAPIGoogle Data APIに数あるAPIの中の1つになります。
Google Data APIのクライアントライブラリがあるのですが、残念なことにNode.js用はありません。(2014-02-10現在)

そこで多少なりとも手軽にするためOAuth用に、

Google APIs Client Libraries - Google APIs Discovery Service — Google Developers

というGoogleAPIを取り扱うライブラリを使います。
SpreadsheetsAPIには対応していませんが、この中にあるOAuth2Clientを利用することでOAuth周りのクライアント実装をサポートしてくれます。 こちらはNode.jsを始めとする多言語に対応しています。

Google APIs Client Library for Node.js (alpha)をインストールします。

$ npm install googleapis

こちらが今回のコード全体です。

Google Spreadsheets APIGoogleアカウントユーザーのスプレッドシートから ...

まずアプリがアクセスする許可をGoogleアカウントユーザーに貰う必要があります。
許可そのものはユーザーに認証用URLへアクセスしてもらい、承認してもらうことで行われます。

次に認証用URLを生成します。

AccessTokenを取得する

コード中の、CLIENT_ID, CLIENT_SECERT, REDIRECT_URLは前記事であった値です。
そして重要なscopeオプションです。
これがGoogle Spreadsheets APIのOAuth 2.0のスコープとなります。

次に生成されたurlへブラウザでアクセスします。
Googleアカウントにログイン済みならば、アプリの認証が求められます。
許可しないと話が続かないので許可します。

ブラウザに文字列が表示され、コードをコピーする旨が書かれています。
これはリクエストトークンで、有効期限が1時間となっています。 リクエストトークンはAPIの使用に必要なアクセストークンと交換することができます。

OAuth2Clientにはアクセストークンを取得するためのgetToken(code, callback)メソッドがあります。
これにリクエストトークンを渡して取得します。

tokensにはアクセストークン、リフレッシュトークン、アクセストークンの有効期限、トークンの種類、以上4つが含まれたjsonです。
重要なのがリフレッシュトークンです。これはユーザーにアプリを承認してもらったリクエストと結び付けられています。以後、アクセストークンの再発行には必ず必要になるので、忘れずに保存しておきます。

OAuth2.0を使ってアクセスする方法に関する詳細は

Using OAuth 2.0 to Access Google APIs - Google Accounts Authentication and Authorization — Google Developers

を見てください。

ここまでがユーザー認証のプロセスです。
次にGoogleアカウントユーザーのデータを取得します。

スプレッドシートからデータを取得する

新規にスプレッドシートを作成すると、その際にデフォルトのワークシートが作成されます。

今回はデフォルトのワークシートからデータを取得します。スプレッドシートを作成してデータを入力して下さい。
もちろん、既存のスプレッドシートを使って貰ってもかまいません。

Google Data APIのクライアントライブラリがあるJava, .NET, Javascript, PHP, Python, Objective-Cはそちらを使うのが良いですよ)

次に取得したいスプレッドシートのKeyを確認します。
KeyはスプレッドシートをGoogleDriveから開いた時にブラウザのアドレスバーに表示されているkeyパラメータの値です。

ワークシートからフィードを取得する

今回は次のようなワークシートからデータを取得します。 f:id:knightso:20140221113214p:plain

client.requestはOAuth2.0を使用したリクエストの実装をサポートしてくれるありがたいヤツです。

ここで取得したフィードはデフォルトのワークシートのものです。また、alt=jsonクエリパラメータを付けることで、デフォルトでXMLレスポンスであるデータをjsonオブジェクトで返すようにします。

Google Data APIのクライアントライブラリではjsonレスポンスをサポートしていないので注意)

APIによってワークシートからフィードを取得する方法は2つあります。

  • List
  • Cells

Listベースでフィードを取得すると、見出しが付いた文字列として各行を取得できます。

"title": {
  "type": "text",
  "$t": "1"
},
"content": {
  "type": "text",
  "$t": "pythonms: 445, javams: 3238, goms: 166, phpms: 341"
},

(なんで書式が解除され、括弧が無くなるんだろう・・・?わからん。)

Cellsベースでフィードを取得すると、各セルごと個別に取得することができます。

"title": {
  "type": "text",
  "$t": "B1"
},
"content": {
  "type": "text",
  "$t": "Python(ms)"
},

(セルベースだと書式が保たれている。なんで??)

今回はリストベースでフィードを取得しています。

リクエストが成功すると上記のようなデータがターミナルにズラズラっと表示されます。

Google Spreadsheets APIに関する詳細は

Google Apps Platform — Google Developers

を見てください。

以上、こんな感じでスプレッドシートからデータを取得します。といっても私自身が使い始めたばかりの新米です。何かあれば気軽にコメントしてくださいな。