サイトロゴ

curl を使って Google Spreadsheet を CSV ダウンロードする

著者画像
Toshihiko Arai
curl
を使って Google Spreadsheet を CSV ダウンロードする

クライアントシークレットの事前準備

Google Spreadsheet の中身を「curl」で CSV としてダウンロードする方法を説明します。Pythonやgspreadを使わずに、macOSのCLIのみで完結するのが目標です。

Google Cloud Console で OAuth 2.0 用の サービスアカウント を作成し、JSON 形式の「client_secret.json」をダウンロードしておきます。

作成したら、そのサービスアカウントの email (xxxx@project.iam.gserviceaccount.com) を、CSVでダウンロードしたいスプレッドシートの「閲覧者」として共有します。

スプレッドシートを共有に設定

Google Sheets のウェブページで、サービスアカウントの email を追加し、閲覧者として設定することで、そのアカウントからAPI経由でデータを取得できるようになります。

Google公式のOAuth 2.0 CLIツールのインストール

brew install oauth2l
  • GitHub: https://github.com/google/oauth2l
  • macOSのHomebrewで簡単に入手できます

アクセストークンを取得

ACCESS_TOKEN=$(oauth2l fetch --json /somewhere/client_secret.json --scope https://www.googleapis.com/auth/drive.readonly)
  • 通常、有効期限は1時間です
  • ACCESS_TOKEN は環境変数に一時的に保存しておけば便利

curlを使ってCSVダウンロード

curl -H "Authorization: Bearer $ACCESS_TOKEN" \
     "https://www.googleapis.com/drive/v3/files/XXXXXXXXXXXXXXXXXXXX/export?mimeType=text/csv"
  • XXXXXXXXXXXXXXXXXXXX の部分は、Google Sheets の URL に含まれる FILE_ID を指します
https://docs.google.com/spreadsheets/d/<FILE_ID>/edit#gid=0

特定のシートをダウンロードしたい

#!/bin/bash


function fetch_sheet() {
    local CLIENT_SECRET_JSON="$1"
    local SPREADSHEET_ID="$2"
    local SHEET_NAME="$3"
    local OUTPUT_DIR="$4"
    local OUTPUT_FILENAME="$5"

    if [[ -z "$CLIENT_SECRET_JSON" || -z "$SPREADSHEET_ID" || -z "$SHEET_NAME" || -z "$OUTPUT_DIR" || -z "$OUTPUT_FILENAME" ]]; then
        echo "Usage: fetch_sheet <client_secret.json> <spreadsheet_id> <sheet_name> <output_dir> <output_filename>"
        return 1
    fi

    echo "Google Spreadsheetのシート '${SHEET_NAME}' をフェッチしています..."

    ACCESS_TOKEN=$(oauth2l fetch --json "$CLIENT_SECRET_JSON" --scope https://www.googleapis.com/auth/spreadsheets.readonly)

    mkdir -p "$OUTPUT_DIR"

    curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \
        "https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/${SHEET_NAME}?majorDimension=ROWS" \
        | jq -r '
            .values[] | 
            map(gsub("\""; "\"\"")) | 
            map("\"\(.)\"") | 
            join(",")
        ' > "${OUTPUT_DIR}/${OUTPUT_FILENAME}"
}

sheets.googleapis.com/v4/spreadsheets/.../values/... からのレスポンスは JSON形式 で返されます。 したがって、curl で取得するのは CSVではなくJSON です。よって、その後の jq コマンドはこの .values 配列を CSV形式に変換しています。

Pyhtonでスプレッドシートをダウンロードしたい場合

gspreadoauth2client を使って同様の処理ができます。以前にpipモジュールとして公開したので、興味ある方は参考になさってみてください。

https://github.com/aragig/gspread_downloader


関連記事