Firexportガイド
Firestore のデータを CSV にエクスポートする方法
Firebase コンソールは Firestore のデータを表示しますが、CSV としてダウンロードするボタンはありません。Firestore から CSV ファイルを取り出す実用的な方法は 3 つあります。どれが合うかは、データの量と、どれだけの準備をするかによります。
2026年9月24日 更新。 方法 1 の拡張機能 Firexport は私たちのものです。方法 2 と 3 には不要です。
結論から言うと
| 1. コンソール + 拡張機能 | 2. Admin SDK スクリプト | 3. gcloud + BigQuery | |
|---|---|---|---|
| 準備 | Chrome 拡張機能をインストール | Node.js と Google Cloud の認証情報 | Cloud Storage バケットと BigQuery データセット |
| 課金の有効化 | 不要 | 不要 | 必要(Blaze プラン) |
| エクスポート対象 | クエリビルダーのクエリ 1 つ(フィルタ・並び順・上限つき) | コードがクエリしたもの | コレクション全体 |
| タイムスタンプ | コンソールの表示どおり(Advanced では ISO 8601) | ISO 8601 | BigQuery の TIMESTAMP |
| マップと配列 | コンソールの表示テキスト。長い値は「…」で切れることがある(Advanced では全体) | 1 つのセルに JSON | フラット化クエリのあと、1 つのセルに JSON |
1. Firexport で Firebase コンソールからエクスポート
Firebase コンソールの Firestore ページには、クエリを実行して結果を表に表示するクエリビルダー(Query builder)がありますが、それをダウンロードする手段はありません。 Firexport は、その結果の横にエクスポート ボタンを追加する無料の Chrome 拡張機能です。
- Chrome ウェブストアから Firexport をインストールします。
- Firebase コンソールで Firestore Database を開き、パネルビュー(Panel view)からクエリビルダー(Query builder)に切り替えます(データタブの右上)。
- クエリのスコープ(Query scope)とパス(Path)でコレクションを選び、必要なら フィルタや上限を加えて、実行(Run)をクリックします。
- 結果の上のエクスポートをクリックします。Firexport が結果の全ページをたどり、CSV ファイルを 1 つ ダウンロードします。JSON にするには、ボタンの横の ⋮ メニューを開いて JSON にエクスポートを選びます。

ファイルに入るもの:
- ドキュメント ID(Document ID)の列、続いてコンソールの表に表示される順にフィールドごとの列。
- 値はコンソールの表示どおりです。無料版では、タイムスタンプはコンソールの表示形式(ブラウザの言語とタイムゾーン)、 参照は短縮され、長いマップや配列は「…」で切れることがあります。
- 買い切りライセンスの Firexport Advanced は、コンソールがすでに読み込んだデータから、ISO 8601 のタイムスタンプ、 参照の完全なパス、ジオポイント、切り詰められていないマップと配列を復元します。
サービス アカウント キーも課金の設定も不要です。すでにサインインしているコンソールのセッションで動き、ファイルは ブラウザの中で作られます。一度に 1 つのクエリをエクスポートするので、サブコレクションはコレクション グループとして クエリしたときだけ含まれます。Chrome とその他の Chromium ベースのブラウザで動きます。
スクリプトもサービス アカウント キーもなしで、次の Firestore クエリをコンソールからエクスポートしましょう。
2. Admin SDK スクリプトでエクスポート
拡張機能を使いたくない場合や、エクスポートをスケジュールで実行する必要がある場合は、Firebase Admin SDK を使う短い Node.js スクリプトで済みます。Firestore を読めるアカウントが必要です。プロジェクトのオーナーか編集者、または Cloud Datastore 閲覧者のロールです。
- SDK をインストール:
npm install firebase-admin - ローカルの認証情報でサインイン:
gcloud auth application-default login。サーバーでは代わりにGOOGLE_APPLICATION_CREDENTIALSでサービス アカウント キーを指定します。 - 下のスクリプトを
export-to-csv.mjsとして保存し、your-project-idを置き換えて、node export-to-csv.mjs usersを実行します。
// Usage: node export-to-csv.mjs users → writes users.csv
import { writeFileSync } from 'node:fs';
import { initializeApp } from 'firebase-admin/app';
import {
getFirestore,
FieldPath,
Timestamp,
GeoPoint,
DocumentReference,
} from 'firebase-admin/firestore';
initializeApp({ projectId: 'your-project-id' });
const db = getFirestore();
const collection = process.argv[2];
if (!collection) throw new Error('Usage: node export-to-csv.mjs <collection>');
// Read the collection 1,000 documents at a time, so large collections don't time out.
const docs = [];
let last;
while (true) {
let query = db.collection(collection).orderBy(FieldPath.documentId()).limit(1000);
if (last) query = query.startAfter(last);
const page = await query.get();
if (page.empty) break;
docs.push(...page.docs);
last = page.docs[page.docs.length - 1];
}
// Firestore types become plain values: timestamps as ISO 8601, references as paths.
function plain(value) {
if (value instanceof Timestamp) return value.toDate().toISOString();
if (value instanceof DocumentReference) return value.path;
if (value instanceof GeoPoint) return { latitude: value.latitude, longitude: value.longitude };
if (value instanceof Uint8Array) return Buffer.from(value).toString('base64');
if (Array.isArray(value)) return value.map(plain);
if (value && typeof value === 'object') {
return Object.fromEntries(Object.entries(value).map(([key, v]) => [key, plain(v)]));
}
return value;
}
// Maps and arrays go in one cell as JSON. Quote any cell with a comma, a quote or a line break.
function cell(value) {
if (value === null || value === undefined) return '';
const text = typeof value === 'object' ? JSON.stringify(value) : String(value);
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
}
const rows = docs.map((doc) => ({ documentId: doc.id, ...plain(doc.data()) }));
// Documents in one collection can have different fields, so the columns are all of them.
const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const lines = [columns, ...rows.map((row) => columns.map((column) => row[column]))];
writeFileSync(`${collection}.csv`, lines.map((line) => line.map(cell).join(',')).join('\r\n'));
console.log(`Wrote ${rows.length} documents to ${collection}.csv`);- すべての親をまたいでサブコレクションをエクスポートするには、
db.collectionをdb.collectionGroupに変えます。 - このスクリプトはファイルを書く前に全行をメモリに保持します。数百万ドキュメントなら方法 3 を使ってください。
3. gcloud と BigQuery でエクスポート
Firestore のマネージド エクスポートは、CSV ではなく Firestore 独自の形式のバックアップを Cloud Storage に 書き出します。BigQuery はその形式を読み込んで CSV を書き出せます。大きなコレクション向けの道ですが、課金の有効化 (Blaze プラン)と、エクスポートを実行してバケットに書き込む権限が必要です。必要なロールは Google のエクスポートとインポートのドキュメントにあります。
# 1. Export one collection. BigQuery only loads exports made with --collection-ids.
gcloud firestore export gs://YOUR_BUCKET/users-export --collection-ids=users
# 2. Load it into a BigQuery dataset in the same location as the bucket.
bq --location=US mk --dataset firestore_export
bq load --source_format=DATASTORE_BACKUP firestore_export.users \
gs://YOUR_BUCKET/users-export/all_namespaces/kind_users/all_namespaces_kind_users.export_metadataBigQuery はネストした列を CSV に書けませんが、Firestore のエクスポートから読み込んだ表には必ず 1 つあります。 ドキュメント ID を持つ __key__ です。そこで先にクエリでマップと配列を JSON テキストにしたフラットな コピーを作り、それを抽出します。
# 3. Make a flat copy: maps and arrays become JSON text. List your own fields.
bq query --use_legacy_sql=false --destination_table=firestore_export.users_flat \
'SELECT __key__.name AS documentId, email, createdAt,
TO_JSON_STRING(address) AS address, TO_JSON_STRING(tags) AS tags
FROM firestore_export.users'
# 4. Write it to CSV and download it.
bq extract --destination_format=CSV firestore_export.users_flat gs://YOUR_BUCKET/users.csv
gcloud storage cp gs://YOUR_BUCKET/users.csv .- BigQuery はファイル 1 つに最大 1 GB を書きます。それより大きい場合は
gs://YOUR_BUCKET/users-*.csvのようなワイルドカードを使います。 - エクスポートはドキュメントごとに 1 回の読み取りとして課金されます。終わったら、Cloud Storage を使い続けないよう エクスポート フォルダを削除してください。
FAQ
Firebase コンソールから Firestore のデータを CSV にエクスポートできますか?
いいえ。Firebase コンソールの Firestore ページにダウンロード ボタンはありません。マネージド エクスポート(Google Cloud コンソールのインポート/エクスポート ページ、または gcloud firestore export)は、Firestore 独自の形式のバックアップを Cloud Storage に書き出します。データの復元のためのもので、スプレッドシートで開くためのものではありません。
Firestore のデータのエクスポートには費用がかかりますか?
どの方法でもエクスポートする各ドキュメントを少なくとも 1 回読み取り、Firestore はそれをドキュメントの読み取りとして課金します。1 日の無料枠の範囲内なら費用はかかりません。マネージド エクスポートはさらにプロジェクトで課金が有効である必要があり、そのファイルは削除するまで Cloud Storage を使います。
サブコレクションはどうエクスポートしますか?
コレクション グループとしてクエリします。コンソールでは、クエリビルダーのクエリのスコープ(Query scope)でコレクション グループ(Collection group)を選びます。スクリプトでは db.collection() の代わりに db.collectionGroup() を使います。gcloud では、サブコレクションの ID を --collection-ids に渡します。
代わりに JSON にエクスポートできますか?
はい。Firexport のエクスポート メニューに JSON にエクスポートがあります。スクリプトなら CSV の代わりに JSON.stringify(rows) を書けます。BigQuery からは bq extract --destination_format=NEWLINE_DELIMITED_JSON でマップと配列をネストしたまま出せます。
