株式会社WR

株式会社WR

WEB TOTAL CONSULTING

Python + Google Sheets APIでデータを読み書きする
ブログ一覧へ
技術ブログ

Python + Google Sheets APIでデータを読み書きする

Pythonのgspreadライブラリを使うと、Googleスプレッドシートをプログラムから読み書きできます。スクレイピング結果の自動保存・定期レポートの作成に活用しています。

Python + Google Sheets APIの活用シーン

PythonからGoogle Sheets APIを使うことで、スクレイピング結果・分析データ・バッチ処理の出力をGoogleスプレッドシートに自動書き込みできます。チームやクライアントとのデータ共有が容易になり、Googleスプレッドシートをデータベース的に活用できます。


環境構築

pip install gspread google-auth pandas

サービスアカウントの作成

  1. Google Cloud Console でプロジェクト作成
  2. 「APIとサービス」→「Google Sheets API」を有効化
  3. 「認証情報」→「サービスアカウント」を作成
  4. JSONキーをダウンロード(service_account.json
  5. スプレッドシートでサービスアカウントのメールアドレスに編集権限を付与

基本的な読み書き

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スプレッドシートへの自動書き込みを定常運用しており、クライアントが常に最新データを確認できる環境を提供しています。

データ収集・分析システムの開発についてはお気軽にご相談ください。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →