Python + Google Sheets APIの活用シーン
PythonからGoogle Sheets APIを使うことで、スクレイピング結果・分析データ・バッチ処理の出力をGoogleスプレッドシートに自動書き込みできます。チームやクライアントとのデータ共有が容易になり、Googleスプレッドシートをデータベース的に活用できます。
環境構築
pip install gspread google-auth pandas
サービスアカウントの作成
- Google Cloud Console でプロジェクト作成
- 「APIとサービス」→「Google Sheets API」を有効化
- 「認証情報」→「サービスアカウント」を作成
- JSONキーをダウンロード(
service_account.json) - スプレッドシートでサービスアカウントのメールアドレスに編集権限を付与
基本的な読み書き
import gspread
from google.oauth2.service_account import Credentials
import pandas as pd
# 認証
SCOPES = [
'https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive',
]
creds = Credentials.from_service_account_file('service_account.json', scopes=SCOPES)
client = gspread.authorize(creds)
# スプレッドシートを開く
SPREADSHEET_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
doc = client.open_by_key(SPREADSHEET_ID)
# シートを取得
ws = doc.worksheet('売上データ')
# 全データを読み込む
all_values = ws.get_all_values()
df = pd.DataFrame(all_values[1:], columns=all_values[0]) # 1行目をヘッダーに
print(df.head())
print(f"行数: {len(df)}, 列数: {len(df.columns)}")
データの書き込み
def write_dataframe_to_sheet(ws, df, start_cell='A1', include_header=True):
"""DataFrameをシートに書き込む"""
ws.clear()
if include_header:
data = [df.columns.tolist()] + df.values.tolist()
else:
data = df.values.tolist()
# None・NaN を空文字列に変換
data = [
['' if (v is None or (isinstance(v, float) and pd.isna(v))) else v for v in row]
for row in data
]
ws.update(start_cell, data)
print(f"{len(data)}行を書き込みました")
# 使い方
df_result = pd.DataFrame([
{'日付': '2024-01-15', '売上': 125000, '注文数': 42},
{'日付': '2024-01-16', '売上': 98000, '注文数': 35},
])
write_dataframe_to_sheet(ws, df_result)
特定セルの読み書き
# 特定セルを読む
value = ws.acell('B2').value
print(f"B2の値: {value}")
# 範囲を読む
values = ws.get('A1:D10')
print(values)
# 特定セルに書き込む
ws.update_cell(2, 3, '新しい値') # 行2・列3(C2)に書き込む
ws.update('B5', [['更新値']]) # B5に書き込む
ws.update('A1:C1', [['名前', '価格', '数量']]) # 範囲で書き込む
# 行を追加
ws.append_row(['2024-01-17', 115000, 38], value_input_option='USER_ENTERED')
セルの書式設定
# ヘッダー行に背景色を設定
ws.format('A1:Z1', {
'backgroundColor': {'red': 0.2, 'green': 0.6, 'blue': 0.9},
'textFormat': {'bold': True, 'foregroundColor': {'red': 1, 'green': 1, 'blue': 1}},
'horizontalAlignment': 'CENTER',
})
# 数値列に通貨書式を設定
ws.format('B2:B100', {
'numberFormat': {
'type': 'CURRENCY',
'pattern': '¥#,##0',
}
})
バッチ処理での高速化
大量のデータを書き込む場合は、1セルずつではなくバッチ処理を使います。
# NG:1セルずつ更新(遅い)
for i, row in df.iterrows():
ws.update_cell(i + 2, 1, row['date'])
ws.update_cell(i + 2, 2, row['sales'])
# 1操作ごとにAPIリクエストが発生
# OK:一括更新(速い)
write_dataframe_to_sheet(ws, df) # 1回のAPIリクエスト
# または batch_update で複数範囲を一度に更新
ws.batch_update([
{'range': 'A1', 'values': [['更新日時', datetime.now().strftime('%Y-%m-%d %H:%M')]]},
{'range': 'C2', 'values': [[sum_value]]},
])
実践例——スクレイピング結果をシートに保存
import time
def save_price_data_to_sheets(products: list[dict]) -> None:
"""収集した価格データをスプレッドシートに保存"""
creds = Credentials.from_service_account_file('service_account.json', scopes=SCOPES)
client = gspread.authorize(creds)
doc = client.open_by_key(SPREADSHEET_ID)
today = datetime.now().strftime('%Y-%m-%d')
# 今日のシートを取得または作成
try:
ws = doc.worksheet(today)
except gspread.WorksheetNotFound:
ws = doc.add_worksheet(title=today, rows=1000, cols=10)
ws.append_row(['商品名', '価格', 'プラットフォーム', 'URL', '収集時刻'])
# データを追記
rows = [
[
p['name'],
p['price'],
p['platform'],
p['url'],
datetime.now().strftime('%H:%M'),
]
for p in products
]
ws.append_rows(rows, value_input_option='USER_ENTERED')
print(f"{len(rows)}件をシート「{today}」に保存しました")
まとめ
Python + Google Sheets APIの組み合わせは、スクレイピングデータ・分析結果の共有と可視化を手軽に実現できます。弊社ではEC価格データの日次収集とGoogleスプレッドシートへの自動書き込みを定常運用しており、クライアントが常に最新データを確認できる環境を提供しています。
データ収集・分析システムの開発についてはお気軽にご相談ください。