TL; DR
- Google Spreadsheets の表を Ruby プログラムを使って無人操作する方法を書きました。
- ほぼ 先日書いた Python の記事 の Ruby 版です。
- 公式 Quick Start は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。
- サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。
スプレッドシートの準備
これは何も特別なことはありません。Google Drive に適当なシートを作成して、ファイルの ID だけ控えておいてください。
プロジェクトとサービスアカウント
各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に言って2とおりの権限獲得の手法があります。
- 一時的に人間の許可を得て、その人間のアカウントで操作
- 権限を与えられた 機械ようのアカウント で操作
ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を サービスアカウントと言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。
- GCPのコンソール に行って、プロジェクトを作ります。
- GCPの左上のハンバーガーメニュー > IAMと管理 > サービスアカウント > サービスアカウントを作成
- 入力は必須項目だけで良いと思います。
name@project.iam.gserviceaccount.com
というアカウントができます。 - アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
- このアカウントに対して、操作したいファイル(スプレッドシート)の操作権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
- ハンバーガーメニュー > APIとサービス > ダッシュボード > +APIとサービスを有効化 と進み、
Google Sheets API
を有効化してください。
パッケージのインストール
たぶんこれだけでいいはず。
$ gem install google-api-client
コード
シートの 1 行目を読み出し、最終行に don't
, panic
, 42
と追記するコードです。
require "google/apis/sheets_v4"
Sheet_id = "*******" # スプレッドシートの(ファイルの)ID
service = Google::Apis::SheetsV4::SheetsService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open("ダウンロードした秘密鍵.json"),
scope: Google::Apis::SheetsV4::AUTH_SPREADSHEETS
)
# データの読み出し例
resp = service.get_spreadsheet_values(Sheet_id, "シート1!a1:z1")
p resp.values
# 行の追記例
service.append_spreadsheet_value(
Sheet_id, "シート1!a:c",
{"values": [["don't", "panic", 42]]},
value_input_option: "RAW" # 式を入れたいときは "USER_ENTERED"
)
終わりに
append_spreadsheet_value
はIoT機器ぽいものでログ等をどんどん追記する用途には便利だと思います。