Pythonの応用 - Google Sheets API
ナビゲーションに移動
検索に移動
概要
- 大量のデータを扱う場合
- gspread-pandas
- 細かい書式設定が必要な場合
- gspread
- Google Sheets API
サービスアカウントキー
サービスアカウントキーは、Google Cloud Platformで発行されるサービスアカウントの認証情報が含まれるJSONファイルである。
以下に示す手順で取得することができる。
- Google Cloud Platform (GCP) でのセットアップ
- GCPコンソール (https://console.cloud.google.com/) にアクセスする。
- プロジェクトを作成または選択する。
- Google Sheets APIとGoogle Drive APIを有効化する。
- サービスアカウントの作成
- GCPコンソールの[IAMと管理] - [サービスアカウント]に移動する。
- [サービスアカウントを作成]を選択する。
- 名前と説明を入力する。
- 例: spreadsheet-automation
- 適切な権限を付与する。
- 例: [編集者]ロール
- 認証情報 (JSONキー) の取得
- 作成したサービスアカウントを選択する。
- [鍵]タブから[鍵を追加] - [新しい鍵を作成]を選択する。
- キーのタイプで[JSON]を選択する。
- ダウンロードされるJSONファイルが"your-credentials.json"に相当する。
Google Cloud Platformでは、このファイルは以下のような名前で自動的にダウンロードされる。
<プロジェクトID>-<ユニークID>.json # 例: my-project-123456-458ad41e85a9.json
開発者は、このファイルを任意の名前 (credentials.json等) にリネームして使用する。
ただし、セキュリティの側面から元のファイル名をそのまま使用することも推奨されている。
サービスアカウントキーの内容は、以下に示すような構造になっている。
{
"type": "<サービスアカウント>",
"project_id": "<プロジェクトID>",
"private_key_id": "<秘密鍵ID>",
"private_key": "<秘密鍵の内容>",
"client_email": "<サービスアカウントのメールアドレス>",
"client_id": "<クライアントID>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/..."
}
※注意
サービスアカウントキーは秘密鍵を含むため、絶対に公開してはならない。
そのため、環境変数や設定ファイルとして安全に管理することが推奨される。
サービスアカウントキーを使用する前に、対象のスプレッドシートをサービスアカウントのメールアドレス (client_email) と共有する必要がある。
スプレッドシートのオープン
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# OAuth2の認証設定
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('<サービスアカウントキー>', scope)
gc = gspread.authorize(credentials)
# スプレッドシートを開く
worksheet = gc.open('<スプレッドシート名>').sheet1
# セルの書式設定例
worksheet.format('A1:D1', {
"backgroundColor": {"red": 0.8, "green": 0.8, "blue": 0.8},
"horizontalAlignment": "CENTER",
"textFormat": {"bold": True}
})
レート制限への対応
import time
def retry_with_backoff(func, max_retries=5):
for i in range(max_retries):
try:
return func()
except gspread.exceptions.APIError as e:
if e.response.status_code == 429: # リクエストが多すぎる場合
time.sleep(2 ** i) # 指数バックオフ
else:
raise
エラーハンドリング
try:
worksheet.format('A1:D1', {...})
except gspread.exceptions.APIError as e:
print(f"APIエラーが発生 : {e}")
データフレームを使用した操作
pandasライブラリおよびgspread-pandasライブラリを組み合わせることにより、データフレームを使用した操作を簡単に行うことができる。
from gspread_pandas import Spread
import pandas as pd
# スプレッドシートに接続
spread = Spread('<スプレッドシート名>')
# データフレームの作成と書き込み
df = pd.DataFrame(your_data)
spread.df_to_sheet(df, index=False, sheet='Sheet1')