RubyでOAuth認証なしにGoogleSpreadSheetのデータを取得

# はじめに

[Google DriveのスプレッドシートにRubyでアクセスする方法](http://qiita.com/yumiyon/items/d7c370b3b8582431a3de)のようにRubyでスプレッドシートを取得する方法はあるのですが、
OAuthを利用したものであるため、手動でcurlやwebで認証しcodeを取得する必要があります。
そのため、cronなどで定期的に処理するといった自動化ができません。

そこでOAuthを使わずにスプレッドシートにアクセスする方法として、サービスアカウントを使ったアクセス方法を紹介します。

### 追記
なお、 google_drive の作者である @gimite さんのコメントからいただいたとおり、google_drive 2.1.0 以降では、`GoogleDrive::Session.from_service_account_key` を使うことで json ファイルを使っての認証が行いやすくなっております。

新しい導入手順も https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md にて公開されていますので、そちらを参考にしてください。 

## 動作環境
名前 | バージョン
:-: | :-: | :-:
Ruby | 2.1.0
google_drive | 1.0.6

# 前準備

## サービスアカウントの作成

まずは、[Google API Console](https://console.developers.google.com/?hl=JA)から認証情報を選択。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/48853/a03d2b35-2491-5052-c3e3-327a70bc5bfb.png)


そして、認証情報作成からサービスアカウントキーを選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/48853/225a6859-9a19-e29c-a411-624480ddcb6f.png)


サービスアカウント名などを入力し、アカウントを作成します。
このとき保存形式には、JSONを指定しましょう。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/48853/3031c0f2-0c7e-f225-2d11-8d6aab43e1ea.png)


作成完了すると、以下のダイアログと同時にJSONファイルがダウンロードされます。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/48853/7ef0082d-56bb-a12d-6b77-66cb216ee53a.png)


なお、作成したJSONは以下の様な内容になっています。

```json
{
  "type": "service_account",
  "project_id": "project_id",
  "private_key_id": "***",
  "private_key": "***",
  "client_email": "***@***.iam.gserviceaccount.com",
  "client_id": "***",
  "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/***.iam.gserviceaccount.com"
}

```

## スプレッドシートに編集/閲覧権限を付与
アカウントを作成したので、対象となるスプレッドシートに権限を付与します。
対象のスプレッドシートを右クリックし、共有を選択します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/48853/d7e77055-fb03-5060-7624-451438af30f0.png)


JSONに記載された`client_email`に編集あるいは閲覧権限を付与します。
通知の必要はないので、チェックボックスは外しておきましょう。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/48853/d2081f90-2342-8e8a-4b31-3a7a8227e07e.png)


# 実際の取得処理
ここまで準備できたら、あとはコードを書くのみです。  
取得の方法としては、以下のようになります。
`SHEET_ID`には、参照するSpreadSheetのidを、`AUTH_JSON`には、ダウンロードしたjsonのファイルパスを指定してください。


```rb
require 'bundler/setup'
require 'google_drive'

require 'json'

sheet_id = ENV['SHEET_ID']
json_file = ENV['AUTH_JSON']

options = JSON.parse(File.read(json_file))
key = OpenSSL::PKey::RSA.new(options['private_key'])

auth = Signet::OAuth2::Client.new(
  token_credential_uri: options['token_uri'],
  audience: options['token_uri'],
  scope: %w(
    https://www.googleapis.com/auth/drive
    https://docs.google.com/feeds/
    https://docs.googleusercontent.com/
    https://spreadsheets.google.com/feeds/
  ),
  issuer: options['client_email'],
  signing_key: key
)
auth.fetch_access_token!

# スプレッドシートの取得
session = GoogleDrive.login_with_oauth(auth.access_token)
ws = session.spreadsheet_by_key(sheet_id).worksheets[0]

# 整形処理 & 表示
table = (1..ws.num_rows).map do |row|
  (1..ws.num_cols).map do |col|
    ws[row, col]
  end
end

table.each do |row|
  puts row.join("\t")
end
```

実行すると以下のように、無事スプレッドシートの内容が表示されます。

```
id	name
1	apple
2	orange
3	banana
```


# 参考
* [Google DriveのスプレッドシートにRubyでアクセスする方法](http://qiita.com/yumiyon/items/d7c370b3b8582431a3de)
* [PHPでGoogle Spreadsheetにデータ投入してみる](http://qiita.com/kenji0302/items/efbdb159130302a90143)