Buri Memo:

アイデアや気づきとかが雑に書き殴られる

Google スプレッドシートから一括で CSV でダウンロードするpythonスクリプト

ゲームのシナリオをスプシ管理したくなった。でも1個ずつダウンロードするのはめんどくさいので自動化してみた。

必要なもの

  • python3
  • gspread
  • GCP の認証情報
  • ダウンロード元の Google スプレッドシートの ID

認証情報はこちらの記事の手順で作成できる。

Google SpreadSheetのデータを Pythonで取得する #GoogleCloud - Qiita

スプレッドシートのIDはURLから持ってくる。

https://docs.google.com/spreadsheets/d/{  スプレッドシートのID  }/edit

ダウンロードするシートをタイトルで絞り込める。例えば TARGET_SHEET_TO_DOWNLOAD = r"C[0-9]{3}_S[0-9]{3}" 設定することで画像の「シート2」を除外してダウンロードする。

ソースコード

$ pip install gspread
import gspread
import re
import csv
from concurrent.futures import ThreadPoolExecutor
import time

CREDENTIALS_PATH = "GCP クレデンシャルの JSON ファイルのパス"
SPREDSHEET_ID = "スプレッドシートURLから ID 部分を取ってくる"
OUTPUT_PATH = "出力先のパス"
TARGET_SHEET_TO_DOWNLOAD = r".*"

gc = gspread.service_account(filename=CREDENTIALS_PATH)

sh = gc.open_by_key(SPREDSHEET_ID)

def download(sheet):
    print(f"Downloading {sheet.title}...")
    with open(f"{OUTPUT_PATH}\{sheet.title}.csv", "w", -1, "utf-8") as f:
        writer = csv.writer(f)
        writer.writerows(sheet.get_all_values())
    time.sleep(1)

# 1秒間に送信するリクエスト数は worker 数で制御する
tpe = ThreadPoolExecutor(max_workers=10)

for sheet in sh.worksheets():
    if not re.match(TARGET_SHEET_TO_DOWNLOAD, sheet.title):
        continue
    
    tpe.submit(download, sheet)

tpe.shutdown()