RubyでGoogleスプレッドシートを読み込み・書き込みする

公開日:2018/05/06 更新日:2018/05/06
RubyでGoogleスプレッドシートを読み込み・書き込みするのサムネイル

はじめに

Googleスプレッドシートを自分で作成したRubyコードから読み込んだり、書き込んだりするためのコードについてまとめます。

前提と環境

  • Ruby 2.5.1
  • gem環境構築済
  • Googleアカウント取得済とする
  • Google Drive API有効化済
  • Google APIs のクライアントIDとクライアントシークレット取得済
上記のGoogle Drive APIの有効化、クライアントIDとクライアントシークレット取得がまだの場合は Google Drive APIの有効化とクライアント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

sheet-default.png

drivetest.rbを実行

$ ruby drivetest.rb

上に示したコードを実行すると、以下のようにスプレッドシートが更新されます。セルA2の値がfooセルB2の値がbarに上書きされていることがわかります。

sheet-after.png

なお、上記をはじめて実行すると、config.jsonscoperefresh_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ならではの処理を施せば色々と応用できると思います。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。