Kon's DX Lab - Case Study

Day 76|PythonでGoogle DriveにCSVを書き込むまでにハマったこと全部書く

Published on 2025-06-16

🔬 Case Study Summary
Problem

(ここに課題を記述)

Result

(ここに具体的な成果を記述)


Tech & Process

(ここに採用技術とプロセスを記述) コードを詳しく見る »

こんにちは、こんです。

今回は「Google Drive APIをPythonで使ってCSVをアップロードしたい!」と思ってトライしたときの記録です。
結論から言うと、うまくいくまで何度もエラーにハマったので、
未来の私と誰かのために、成功までの過程を残しておこうと思います。


実験のきっかけ:Driveに自動でCSVを保存したい!

こんなこと、起きていませんか?

  • 毎回ローカルで保存してから手動でDriveにアップしてる

  • Streamlitで自動処理してるのに、最後の出力だけ手作業なのがもったいない

  • GASじゃなくてPythonで一気通貫にやりたい

「どうにか自動でGoogle Driveにファイルを書き出せないか?」
と思って、Google Drive APIに挑戦しました。


作ってみたもの(検証用スクリプト)

最小構成でCSVをDriveへアップロードするスクリプトはこちら👇

import pandas as pd
from io import BytesIO
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseUpload
from oauth2client import file

def upload_test_file_to_drive(df: pd.DataFrame, filename: str, folder_id: str):
    creds = file.Storage('config/token.json').get()
    service = build('drive', 'v3', credentials=creds)

    about = service.about().get(fields="user").execute()
    print("✅ 現在の認証ユーザー:", about["user"]["emailAddress"])

    buffer = BytesIO()
    df.to_csv(buffer, index=False, encoding='cp932')
    buffer.seek(0)

    file_metadata = {
        'name': filename,
        'parents': [folder_id]
    }
    media = MediaIoBaseUpload(buffer, mimetype='text/csv')

    uploaded_file = service.files().create(
        body=file_metadata,
        media_body=media,
        fields='id',
        supportsAllDrives=True  # ← 共有ドライブなら必須!
    ).execute()

    print(f"✅ アップロード成功: https://drive.google.com/file/d/{uploaded_file['id']}/view")

# テスト実行
if __name__ == "__main__":
    df = pd.DataFrame([{"商品CD": "TEST001", "商品名": "テスト商品", "数量": 1}])
    upload_test_file_to_drive(df, "TEST_UPLOAD.csv", "ここにフォルダIDを入力")

ハマったポイントと乗り越えた方法

1. 404 File not found が出る → フォルダIDが間違ってる?いや違った!

✅ 原因:フォルダが「共有ドライブ」にある場合、APIに明示が必要

supportsAllDrives=True  # ← これを入れないと永遠に 404

2. 「リンクを知っている全員が編集者」なのに、なぜか認証できない

✅ 解決策:認証に使っているGoogleアカウントが、明示的にフォルダの共有メンバーになっている必要あり!

  • ブラウザでフォルダ開く

  • 「共有」→ 自分のメールアドレスを追加(編集者)

  • token.json で認証しているアカウントと一致しているか確認


3. token.json の中のユーザーを確認する方法

creds = file.Storage('config/token.json').get()
service = build('drive', 'v3', credentials=creds)
about = service.about().get(fields="user").execute()
print("✅ 現在の認証ユーザー:", about["user"]["emailAddress"])

認証設定(token.json)の準備について

本記事では「Google Drive APIの呼び出し方」に焦点を当てているため、
`token.json` の作成手順については詳しく触れていません。

私は以下の記事を参考にしてセットアップしました👇

📘 PythonでGoogle Drive APIを使う - Zenn(spacegeekさん)

初めての方でも、上記の手順どおりに進めれば、

  • プロジェクトの作成

  • Drive APIの有効化

  • OAuthクライアントIDの作成

  • `credentials.json` → `token.json` の生成

までスムーズにできると思います。

もし `token.json` がない or エラーになる場合は、まずこの記事から始めるのがおすすめです。


実感したメリット

✅ GASに頼らずPythonで完結できる!

今まではGoogle Apps Scriptにファイルを渡すような処理をしてたけど、
Pythonから直接Driveに書き出せるようになったのはかなり気持ちいい。

✅ Streamlitなどのバッチ出力と相性抜群

データを出力→Driveへアップ→Slack通知までPythonでやれるので、
「Pythonで完結した仕組み」を作れるようになった。


次回予告:DriveにCSVアップ+Slack通知の全自動化

次はこの仕組みを活かして、

  • 入荷予定CSVの自動生成

  • 自動アップロード+Slack通知

  • スプレッドシート側にフラグ更新

までを一貫してやっている generate_inbound_csv_from_sheet.py を紹介予定です。


まとめ:Drive APIの404は supportsAllDrives=True を疑え!

Drive API、一見シンプルそうでめちゃくちゃハマります。

でも、共有ドライブと OAuth 認証まわりの癖さえつかめば、
Pythonから安全にDrive操作ができる強力な武器になります。

それでは、また次の実験で!🦊


#Python自動化 #GoogleDriveAPI #業務効率化 #ChatGPTで開発 #ノーコードの先へ