164
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

いつ使えるの?

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

公式リポジトリ

google_drive

google_drive をインストール

Gemfile
gem 'google_drive'
$ bundle install --path vendor/bundle

で gem をインストールします。

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

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

ここを参考にしながら取得しました。▷ Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ

Google Developers Consoleにアクセス

Google Developers Console

「Drive API、Drive SDK」の値

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

on.png

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

clientnew.png

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

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

app.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

認証ボタンをクリックした後、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

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

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」と表示されました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
164
Help us understand the problem. What are the problem?