TL; DR
- Google Spreadsheets の表を Python プログラムを使って無人操作する方法を書きました。
- 公式 Quick Start は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。
- サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。
スプレッドシートの準備
これは何も特別なことはありません。Google Drive に適当なシートを作成して、ファイルの ID だけ控えておいてください。
プロジェクトとサービスアカウント
各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に行って2とおりの権限獲得の手法があります。
- 一時的に人間の許可を得て、その人間のアカウントで操作
- 権限を与えられた 機械ようのアカウント で操作
ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を サービスアカウントと言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。
- GCPのコンソール に行って、プロジェクトを作ります。
- GCPの左上のハンバーガーメニュー > IAMと管理 > サービスアカウント > サービスアカウントを作成
- 入力は必須項目だけで良いと思います。
name@project.iam.gserviceaccount.com
というアカウントができます。 - アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
- このアカウントに対して、操作したいファイル(スプレッドシート)の操作権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
- ハンバーガーメニュー > APIとサービス > ダッシュボード > +APIとサービスを有効化 と進み、
Google Sheets API
を有効化してください。
パッケージのインストール
たぶんこれだけでいいはず。
$ pip3 install google-api-python-client google-auth-oauthlib oauth2client
コード
シートの A1 セルに test と書き込むコードです。たったこれだけ!
from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
PRIVKEY_FILE = "projectname-*********.json" # ダウンロードした秘密鍵
SPREADSHEET_ID = "********" # シートのファイルのID
SCOPE = ["https://www.googleapis.com/auth/spreadsheets"]
creds = ServiceAccountCredentials.from_json_keyfile_name(PRIVKEY_FILE, SCOPE)
service = build("sheets", "v4", credentials=creds)
sheet = service.spreadsheets()
result = sheet.values().update(
spreadsheetId=SPREADSHEET_ID,
range="a1",
valueInputOption="RAW", # USER_ENTERED とすると式を式として入力できる(例: "=sum(a1:a100)")
body={"values": [["test"]]}).execute()
おわりに
Ruby でも同じくらい簡単にできました。