ちょっと話題の記事

node.jsのいろいろなモジュール50 – Google Spreadsheetにアクセスする

2015.10.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

node.jsでGoogle Spread Sheetにアクセス

Google Spreadsheetとは

Google スプレッドシートとは、Goolgeの提供するサービスで、
Webベースの表計算ソフトです。ブラウザを使用し、複数のユーザーとリアルタイムに編集することができます。
また、MSのエクセルに近い機能も持ち、xls(xlsx)ファイルを読み込むことも可能になっています。

手軽にシートを共有でき、APIでアクセスする手段も提供されています。
今回はnode.jsからサービスアカウント形式の認証で、Googleスプレッドシートにアクセスしてみます。

##環境構築方法
今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.10.5
  • Node : v4.1.2

データとAPIを使用する準備

1.Googleスプレッドシートの作成

まずは、適当なスプレッドシートを作成します。
ワークシート名はtest、シート名はmysheet1とし、下記のようにセルデータを入力しました。

id name price
1 りんご 100
2 バナナ 150
3 みかん 80

2.Google Developer コンソールでAPI許可とKeyファイルのダウンロード

Google Developerコンソールにアクセスし、プロジェクトを作成します。
作成したプロジェクトを選択し、サイドバーのメニューからAPI->Drive APIを選択して、Drive APIを有効化しましょう。

google-spreadsheet1

次にプロジェクトを選択した状態で、メニューから認証情報->認証情報を追加 ボタンを押します。
「サービスアカウント」を選択し、JSON形式を選択して作成ボタンを押すと、JSONファイルがダウンロードされます。

google-spreadsheet2

3.jsonに記述してあるメールアドレスをアクセス許可する

最後に、Googleスプレッドシート画面で共有ボタンを押し、
2でダウンロードしたJSONに書いてある「client_email」のアドレスを追加します。

なお、ここで許可するアカウントは、APIアクセス用に発行されたdeveloper.gserviceaccount.comドメインのアカウントです。
弊社のように、セキュリティの関係上、外部ドメインとの共有ができない場合、今回紹介する方法は使用できないので注意してください。
(OAuth2を使用すればスプレッドシートの共有をしなくてもAPIアクセス可能です。次回紹介予定)

nodeアプリの作成

準備ができたので、node.jsプログラムを作成してみましょう。

モジュールのインストール

まずはGoogleスプレッドシートにアクセスするためのモジュールをnpmでインストールしましょう。

% npm install npm i google-spreadsheet

サンプル作成

var GoogleSpreadsheet = require('google-spreadsheet');

var my_sheet = new GoogleSpreadsheet(<ワークシートのID>);
var credentials = require(<3でダウンロードしたJSONのパス>);

ワークシートIDは、スプレッドシートを開いたURLのdとeditの間にある文字列です。
先ほどDeveloperコンソールからダウンロードしたJSONファイルも使用するので、パスを控えておきましょう。

useServiceAccountAuth関数を使用することで、JSONを元にした情報で認証を行います。
そして、getInfo関数を使うとシート情報を取得することが可能になります。

    var sheet;
    my_sheet.useServiceAccountAuth(credentials, function(err){
        my_sheet.getInfo(function(err, data){
          console.log(data);
          sheet = data; //あとから使えるように外部スコープに保存
        });

    });

getInfoで取得したオブジェクトには全部のシート情報がはいっているので、タイトルで対象のシートを判定しています。
対象のシートでgetRows関数を使用することで、行毎にデータを取得できます。

    for(var i in sheet.worksheets) {
        if(sheet.worksheets[i].title === 'mysheet1') {
            sheet.worksheets[i].getRows( function( err, rows ) {
                for(var i in rows) {
                    console.log(rows[i]);
                }
            });
        }
    }

また、getCells関数を使用すれば、すべてのセルごとにデータを取得できます。

なお、データを追加する場合にはaddRow関数を使用します。

sheet.addRow( <行数>, { <カラム名>: '値'} );

まとめ

今回はシート共有を使用してGoogle SpreadSheetにアクセスする方法について紹介しました。
シート共有を使うことで、簡単にアクセスできることがわかります。
次回はOAuth2を使用してGoogle SpreadSheetにアクセスする方法について紹介します。

参考サイトなど