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でスプレッドシートをダウンロードしたい場合
gspread
と oauth2client
を使って同様の処理ができます。以前にpipモジュールとして公開したので、興味ある方は参考になさってみてください。
https://github.com/aragig/gspread_downloader