どうも、cloudpack の かっぱ(@inokara)です。
はじめに
先日 sensu の 通知ハンドラとして Google SpreadSheet へ飛ばすハンドラを作った(※作ってみた)際に、そもそも Ruby から Google SpreadSheet をどんな風に使うのかをメモってなかったのメモっておきます。
あくまでも試行錯誤の結果ですのでコードは汚い、キツイ、危険の 3K かもしれませんので、万が一、参考にされる際には十分にご注意下さい…。また、編集リクエストもお待ちしております!m(__)m
参考
- This is a Ruby 1.8/1.9 library to read/write files/spreadsheets in Google Drive/Docs.
- gimite/google-drive-ruby
- holysugar / gist:3775235
事前作業
必要なもの
事前に必要な作業
- アプリケーション用のパスワードを生成しておく
- スプレッドシートの ID を控えておく
やりたいこと別チートシート
レコード数やカラム数を取得
#!/usr/bin/env ruby require "rubygems" require "google_drive" # 初期化 # OAuth を利用して認証 session = GoogleDrive.login("#{Gmail アカウント}", "#{アプリのパスワード}") # ws インスタンス生成 ws = session.spreadsheet_by_key("#{スプレッドシートの ID}").worksheets[0] # レコード数を取得 puts ws.num_rows # カラム数を取得 puts ws.num_cols
シートのレコードを取得する
#!/usr/bin/env ruby require "rubygems" require "google_drive" # 初期化 # OAuth を利用して認証 session = GoogleDrive.login("#{Gmail アカウント}", "#{アプリのパスワード}") # ws インスタンス生成 ws = session.spreadsheet_by_key("#{スプレッドシートの ID}").worksheets[0] # こんだけ for row in 1..ws.num_rows for col in 1..ws.num_cols puts ws[row, col] end end
もちろん、以下のようにセルを指定しても良いようです。
puts ws[100,100]
セルに値をぶっこむ
#!/usr/bin/env ruby require "rubygems" require "google_drive" # 初期化 # OAuth を利用して認証 session = GoogleDrive.login("#{Gmail アカウント}", "#{アプリのパスワード}") # ws インスタンス生成 ws = session.spreadsheet_by_key("#{スプレッドシートの ID}").worksheets[0] # こんだけ ws[100,100] = "hoge" ws.save
セルの 100,100 に “hoge” を書き込んで ws.save で保存します。
も少し複雑なレコードをぶっこむ
GoogleDrive::List クラスの push メソッドを使ってレコードをぶっ込むことが出来ます。
#!/usr/bin/env ruby require "rubygems" require "google_drive" # 初期化 # OAuth を利用して認証 session = GoogleDrive.login("#{Gmail アカウント}", "#{アプリのパスワード}") # ws インスタンス生成 ws = session.spreadsheet_by_key("#{スプレッドシートの ID}").worksheets[0] # レコードをハッシュで生成 hash = {"timestamp" => "100" , "record" => { "a" => "10", "d" => "11", "e" => "12", "x" => "13" }} # ヘッダを生成 ws.update_cells(1, 1, [hash["record"].keys]) # 一旦 save ws.save begin timeout(5) do # これでぶっ込む ws.list.push( hash["record"].each do |k, v| ["#{k}" => "#{v}"] end ) ws.save end rescue Timeout::Error puts "Google SpreadSheet-- Timed out while attempting to send"
二回程叩くと以下のようにレコードが入ってきました。嬉しい。
上記の通り push メソッドはハッシュをそのままぶっこんでくれるので便利だと思いました。あと、SpreadSheet 関係無いですが、hash.keys
とか hash.values
だけでハッシュのキーだけ、ハッシュの値だけが取れるのって嬉しいですな。
最後に
自分のような Ruby 初心者でも簡単にシートに値を突っ込むことが出来ました。(※良し悪しは置いておいて)も少し頑張って色々と応用出来ればなあと妄想しています。
元記事はこちらです。
「Ruby から Google SpreadSheet をいじるメモ」