RubyでGoogle Spreadsheetを操作し、簡易DBとして使う

この記事を書いたひと: @t4traw 2019年7月31日

お仕事で1つアプリケーションを作る時に、

  • フォームタイプのWEBアプリケーション
  • 簡単なDBが欲しい
  • 普通のユーザーが中のデータを参照・編集する

といった要件があった時、「普通の人が中を簡単に見たりするなら、Google Spreadsheet使えば簡単で楽じゃない?」と思い、使ってみたら「いいじゃん!」と感動したのでメモ。

準備

  • ruby(2.6.3)

あとGoogleアカウントを持っていて、GoogleDriveにアクセス・利用できるアカウントが必要です。

まずはGoogleDriveにrubyからアクセスする準備

さっそくGoogleDriveにAPI経由でアクセスしてみたいと思います。ちょっぴりややこしいのですが頑張りましょう😁

まず、GoogleのAPI library pageにいきましょう。

そしたら、まずは同意画面が表示されるので同意して先に進みます。

次に、左上の「プロジェクトの選択」ボタンをクリックし、「新しいプロジェクト」をクリックします。

適当なプロジェクト名が入力し、作成ボタンをクリックします。

そしたらダッシュボードに遷移します。まずはプロジェクトを作成リンクをクリックします。

適当なプロジェクト名を入力して作成ボタンをクリックします。

サイドバーの認証情報をクリックし、「認証情報を作成」ボタンをクリックし、OAuthクライアントIDという場所をクリックします。

すると、まずは同意画面なるものを作ってくださいと表示されます。ので、「同意画面を設定」ボタンをクリックします。

適当なアプリケーション名を設定し、保存します。

もう一度、認証情報から「認証情報を作成」ボタンをクリックし、「OAuthクライアントID」を選択します。

アプリケーションの種類でその他を選択し、名前を適当に入力し、「作成」ボタンをクリックします。

すると、クライアントIDとクライアントシークレットが表示されるので、それを控えておきます。

次に、左上のメニューから、「APIとサービス>ライブラリ」をクリックします。

利用するサービスを有効化する必要があるので、検索ボックスにDocsと入力し、検索してクリックします。

そして「有効にする」ボタンをクリックします。

今回はGoogle Spreadsheetも使うので、おなじ手順で有効化しておきます。

これでとりあえずダッシュボードでの作業は完了です。

テスト動作用のデータを作っておく

とりあえず動かしてみたいので、簡単なデータを作っておきます。

5行くらいの適当なデータを入力して、シート名をlangにしました。

とりあえずrubyでアクセスしてみる

とりあえず、rubyでGoogleDocsにアクセスしてみます。

さきほど控えておいたクライアントIDとクライアントシークレットをconfig.jsonに保存します。

$ touch config.json
config.json
{
  "client_id": "YOUR_CLIENT_ID",
  "client_secret": "YOUR_CLIENT_SECRET"
}

で、適当にrubyを書いていきます。

gemはgimite/google-drive-rubyを使います。

$ gem i google_drive
$ touch sample.rb

で、コードの中にファイルをidで指定しないといけないのですが、idはurlの/d/以降がidになっています。

今回だと1dEZfACTlELSH-jAi3ggMqUKE6eq7w0Z1SyCtoO0H5woの部分です。

sample.rb
require "google_drive"

session = GoogleDrive::Session.from_config("config.json")
key = '1dEZfACTlELSH-jAi3ggMqUKE6eq7w0Z1SyCtoO0H5wo'
sheet = session.spreadsheet_by_key(key).worksheet_by_title("lang")

(1..sheet.num_rows).each do |row|
  (1..sheet.num_cols).each do |col|
    p sheet[row, col]
  end
end

さっそく実行してみます。

すると、こんな感じのurlにアクセスして認証してくれという表示がされるので、表示されたurlにアクセスしましょう。

$ ruby sample.rb

1. Open this page:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/drive%20https://spreadsheets.google.com/feeds/

2. Enter the authorization code shown in the page: 

アカウント選択すると、このアプリは確認されていませんと表示されますが、「詳細」を押して、「アプリ名(安全でないページ)に移動」をクリックします。

いくつか許可を求めるポップアップが表示されるので、許可をクリックします。

最後によくみる画面で許可をクリックします。

すると、リフレッシュトークンが表示されるので、それをターミナルにコピペします。

2. Enter the authorization code shown in the page: XXXXXXX
"えいちてぃーえむえる"
"しーえすえす"
"じゃばすくりぷと"
"るびー"
"ごー"

無事さっきのSpreadsheetの内容が表示されました😁

リフレッシュトークンはconfig.jsonに保存されているので、今後は利用するライブラリが変わらない限りは認証なしで利用できます。

適当にデータの追加などしてみる

sample.rb
sheet[sheet.num_rows + 1, 1] = "ぱいそん"
sheet.save

sample.rb
sheet[sheet.num_rows + 1, 1] = "のーど"
sheet[sheet.num_rows + 1, 1] = "すいふと"
sheet.save

すいすい書き込みできます。

これでSinatraなりCLIツールなりで、シンプルな簡易DBとして利用できますね🎉

gimite/google-drive-rubyのREADMEなど見ると、ファイルアップロードなどにも対応しているので、他にも便利な使い方ができそうです。

今回のコードも一応GitHub(t4traw/google_spreadsheet_db_sinatra)にプッシュしておきます。

それでは。