Google DriveのスプレッドシートにRubyでアクセスする方法

## いつ使えるの？

Google Drive の spreadsheet に、rubyでアクセスしたい時に使えます。

## 公式リポジトリ

[google_drive](http://rubygems.org/gems/google_drive)

## google_drive をインストール

```ruby:Gemfile
gem 'google_drive'
```

```
$ bundle install --path vendor/bundle
```
で gem をインストールします。


## OAuth2.0を利用してアクセス

今回は、リフレッシュトークンを使ってアクセスします。

ここを参考にしながら取得しました。▷ [Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ](http://qiita.com/kossacks/items/8d279bcc1acc2c2153ab) 

#### Google Developers Consoleにアクセス

[Google Developers Console](https://console.developers.google.com/project)

####  「Drive API、Drive SDK」の値

APIと認証から、「Drive API」と「Drive SDK」をONにします。

![on.png](https://qiita-image-store.s3.amazonaws.com/0/36485/6ae27d5c-a8a5-f6c2-844d-54f37fdfe1c6.png)

#### 新しいクライアント　IDを作成

![clientnew.png](https://qiita-image-store.s3.amazonaws.com/0/36485/4a483cd9-7174-232d-6a4a-34ac0db83ed6.png)

#### リフレッシュトークンを取得

クライアント ID、クライアント シークレットをメモ。続いて、新しいクライアントを利用して、リフレッシュトークンを取得します。

![app.png](https://qiita-image-store.s3.amazonaws.com/0/36485/57f9430c-7a8f-144e-c1d5-6b03a8bc9cc6.png)

```
https://accounts.google.com/o/oauth2/auth?client_id=[先ほど取得したクライアントID]&redirect_uri=[先ほど設定したリダイレクトURI]&scope=https://www.googleapis.com/auth/drive&response_type=code&approval_prompt=force&access_type=offline
```

認証ボタンをクリック。

![ninsyou.png](https://qiita-image-store.s3.amazonaws.com/0/36485/ebffe718-9868-8c61-f96e-2d151a329aef.png)

認証ボタンをクリックした後、URL欄で認証コードが「〜code=」以下に示されているので、その部分をメモ。

ターミナル上でIDとURIやキー等を用いて以下のようなコマンドを実行する 

```
curl -d client_id=[クライアントID] -d client_secret=[クライアントシークレット] -d redirect_uri=[リダイレクトURI] -d grant_type=authorization_code -d code=[認証コード] https://accounts.google.com/o/oauth2/token
```

JSONに「リフレッシュトークン」が含まれて返ってきます。

```
{
  "access_token" : "dfor39.5Asgerib2qoPSSv-A6sfvL53I6PHCZ1cS-LHZFX4qiqjP7hwerwFwrOY6OCe_BgPnZGZZ4-w",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/-LZ_AVkmvtBzdmKVKul5vaHBwerwerwreM3s6D8soMEudVrK5jSpoR30zcRFq6"
}

```

## spreadsheetにアクセス

アクセスしたいシートを作成（ https://docs.google.com/spreadsheets/d/1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0/edit ）

![sp.png](https://qiita-image-store.s3.amazonaws.com/0/36485/9dff92c6-8968-1aa6-5586-aa19e8d2f65e.png)

これでアクセスに必要な クライアント ID、クライアント シークレット、リフレッシュトークンがそろいました。

```ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController
require "rubygems"
require "google_drive"

  def show
    client_id     = "987654321797-lijuhygtfr34567.apps.googleusercontent.com"
    client_secret = "poiuytrew-KVyaUT"
    refresh_token = "1/-LZ_AVkmvtBzdmKVKul5vaHBgfdswerD8soMEudVrKr987654321"
    client = OAuth2::Client.new(
        client_id,
        client_secret,
        site: "https://accounts.google.com",
        token_url: "/o/oauth2/token",
        authorize_url: "/o/oauth2/auth")
    auth_token = OAuth2::AccessToken.from_hash(client,{:refresh_token => refresh_token, :expires_at => 3600})
    auth_token = auth_token.refresh!
    session = GoogleDrive.login_with_oauth(auth_token.token)
    ws = session.spreadsheet_by_key("1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0").worksheets[0]

    # レコード数を取得
    p ws.num_rows
    # カラム数を取得
    p ws.num_cols
  end
end

```

> "1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0"

の部分はアクセスしたいスプレッドシートのURL https://docs.google.com/spreadsheets/d/1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0/edit の　"1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0" の部分を使用します。

アクセスすると見事「7」「3」と表示されました。