RubyでGoogleスプレッドシートを読み込み・書き込みする
はじめに
Googleスプレッドシートを自分で作成したRubyコードから読み込んだり、書き込んだりするためのコードについてまとめます。
前提と環境
- Ruby 2.5.1
- gem環境構築済
- Googleアカウント取得済とする
- Google Drive API有効化済
- Google APIs のクライアントIDとクライアントシークレット取得済
やること
RubyからGoogleスプレッドシートにアクセスして指定したシートの指定した範囲のセルを読み込んだり、セルに値を書き込んだりします。google_drive
というgemを使用します。基本的な手順は以下の参考サイトと同じになります。
google-drive-ruby | GitHub
クライアントIDとクライアントシークレットを含む設定ファイル作成
取得済のクライアントID
とクライアントシークレット
を含む設定ファイルを以下のように作成しておきます。ファイル名はconfig.json
とし、これらから作成するRubyのコードと同じディレクトリに保存しておきます。
{
"client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx"
}
gemのgoogle-drive-rubyをインストール
google-drive-ruby
というgemをインストールします。手順はこちらの公式サイトgoogle-drive-ruby | GitHubと同様で以下のコマンドをターミナル上で実行するだけです。
$ gem install google_drive
基本的なコード
以下が実際のコードになります。ここでは適当に以下をdrivetest.rb
というファイル名で保存します。
require "google_drive"
# config.jsonを読み込んでセッションを確立
session = GoogleDrive::Session.from_config("config.json")
# スプレッドシートをURLで取得
sp = session.spreadsheet_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0")
# "シート1"という名前のワークシートを取得
ws = sp.worksheet_by_title("シート1")
# セルを指定して値を更新 インデックスの基準は1
ws[2, 1] = "foo" # セルA2
ws[2, 2] = "bar" # セルB2
# saveで変更を保存、実際にスプレッドシートに反映させる
ws.save
上記が基本的なコードとなります。ここで、以下のような構成のスプレッドシートに対して、上記のコードを実行してみます。
- スプレッドシート名:rubysheet
- ワークシート名:シート1
drivetest.rb
を実行
$ ruby drivetest.rb
上に示したコードを実行すると、以下のようにスプレッドシートが更新されます。セルA2
の値がfoo
、セルB2
の値がbar
に上書きされていることがわかります。
なお、上記をはじめて実行すると、config.json
にscope
とrefresh_token
が自動で追記されます。上記コードを実行後はconfig.json
が以下のように変更されていると思います。
{
"client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx",
"scope": [
"https://www.googleapis.com/auth/drive",
"https://spreadsheets.google.com/feeds/"
],
"refresh_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
目的別メソッドの使い方
以降ではよく使うメソッドの使い方を目的毎にまとめます。なお、以降に出てくるsp
は上に掲載した基礎的なコードの中のスプレッドシート sp = session.spreadsheet_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0")
、ws
はワークシートws = sp.worksheet_by_title("シート1")
です。このようにスプレッドシート、ワークシートにメソッドを繋げて処理していきます。
データ操作
セルの値を更新したり削除したりする時に使用します。なお、ここのメソッドは基本的に最後にsave
しなければスプレッドシートには反映されません。
ただし、以降に記載しているワークシートの削除を行うdelete
等はsave
せずとも即座に反映されるので注意が必要です。
# セルを指定して値を更新 インデックスは1が基準
ws[2, 1] = "foo" # セルA2
ws[2, 2] = "bar" # セルB2
# セル範囲を指定して値を更新 インデックスは1が基準
#
ws.update_cells(2, 3, [["1", "2"], ["3", "4"]])
# スプレッドシートから指定行を削除 3,4行目を削除 save必要
ws.delete_rows(3, 2)
# 空でないセルの最終行
p ws.num_rows
# 空でないセルの最終列
p ws.num_cols
# スプレッドシートを2次元配列に格納
# 最終行と最終列は、それぞれ空でないセルが基準となります
my_array = ws.rows
# 変更を反映させる
ws.save
スプレッドシート操作
# スプレッドシートをURLで指定して取得
sp = session.spreadsheet_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0")
# スプレッドシートをkey(スプレッドシートのURLに含まれるID)で指定して取得
sp = session.spreadsheet_by_key("xxxxxxxxxxxxxxxxxxxxxxxxxx")
# 新しいスプレッドシートを作成
# 以下の場合はマイドライブ直下に「My sheet」という名前のスプレッドシートが作成される。
session.create_spreadsheet("My sheet")
ワークシート操作
# worksheetsで取得したスプレッドシートに含まれる全てのシートを配列で取得
# workshets[0]は一番左側のシート
ws = sp.worksheets[0]
# "シート1"というワークシートを取得
ws = sp.worksheet_by_title("シート1")
# シート名、行列数、を指定して新しいワークシートを作成
sp.add_worksheet("sheet2", max_rows = 100, max_cols = 20)
# worksheetを削除 saveしなくとも即座に削除される
ws.delete
ファイル、フォルダ操作
# ファイルを取得
my_file = session.file_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxx/edit#gid=0")
# ファイルを削除
# permanent = falseの場合はゴミ箱へ移動、trueの場合はゴミ箱にもいかず永久的に削除
my_file.delete(permanent = false)
# URLを指定してフォルダを取得
my_folder = session.collection_by_url("https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxxxx")
# my_folder直下にフォルダ名を指定してフォルダ作成
# 以下の場合「subfolder」というフォルダを作成
new_folder = my_folder.create_subfolder("subfolder")
# new_folderにスプレッドシートを移動
new_folder.add(sp)
# 同じフォルダにタイトル指定してコピー
sp.copy("My new sheet")
ファイルアップロード、ダウンロード
# Googleドライブのファイルをローカルにダウンロード
ws.export_as_file("/path/to/file.csv")
# ローカルのファイルをアップロード
# ただしアップロード先のフォルダを指定する機能はまだなく、root(マイドライブ直下)にアップロードされる。
session.upload_from_file("/vagrant/rubys/download.csv", "uploadfile.csv")
まとめ
RubyでGoogleスプレッドシートを読み込み・書き込みするためのコード、各メソッドの使い方をまとめました。今回記載した内容はGoogle Apps Scriptでもできるようなことが多いですが、上記を使ってRubyからGoogleスプレッドシートにアクセスし、その後でRubyならではの処理を施せば色々と応用できると思います。
関連記事
- 公開日:2018/05/30 更新日:2018/05/30
ブラウザの操作を自動化できるSeleniumをWSLからRubyで使う
フォーム送信や繰り返し行う必要があるブラウザ操作を自動化できるSeleniumをWindows Subsystem for Linux のUbuntuからRubyを用いて使用するための手順をメモします。
- 公開日:2018/05/27 更新日:2018/05/27
rbenvとruby環境の構築手順
WindowsのWindows Subsystem for LinuxでUbuntuを使いはじめ、その中にrbenvとRuby環境を構築したのでその手順をメモします。なお、UbuntuであればWindows Subsystem for Linux、仮想マシン、純粋なUbuntuのいずれでも同じ手順になります。思っていた以上に簡単に構築できました。
- 公開日:2018/05/06 更新日:2018/05/06
Google Drive APIの有効化とクライアントID、クライアントシークレットの取得方法
Googleスプレッドシートを自分で作成した外部のプログラムから値を読み込んだり書き込んだりするためには、まずGoogle Drive APIを有効化し、外部からアクセスするためのクライアントIDとクライアントシークレットを取得する必要があります。この記事ではその手順をまとめます。
- 公開日:2016/01/10 更新日:2016/01/10
Railsでwickedpdfを使ってPDF出力する
Ruby on RailsでPDF出力させるのに便利なgemはたくさんありますが、htmlをそのままPDF化してくれる「wickedpdf」が一番お手軽で楽でした。wickedpdfの導入手順と使用方法をメモします。