Search Console APIでCSV出力する方法【初心者でもコピペで動いた最小コード】
結論|APIでCSVを自動出力する仕組みと使い道
Search Console APIを使えば、毎回UIからエクスポートしなくてもGSCのデータをCSVとして自動取得できます。コマンド1つで直近90日分のクエリ・順位・CTR・表示回数をCSVに保存する仕組みを実装しました。
UIエクスポートでは自動化できないため、APIで仕組み化する必要があります。手動では継続できない、ということを痛感してAPIに切り替えました。
この記事は以下に当てはまる方向けです。
- GSCのデータを毎回手動エクスポートしていて面倒に感じている
- APIで自動化したい
- CSVで分析したい
- GCPやNode.jsに詳しくないが、コードをコピペして動かせる環境はある
- 取得したデータをSEO改善の判断に使いたい
UIエクスポートとAPIの違い
GSCのUIからCSVエクスポートする方法と、APIで取得する方法の違いはシンプルです。
| | UIエクスポート | API取得 |
|---|---|---|
| 操作 | 毎回手動 | コマンド1つで自動 |
| 取得行数 | 最大1000行 | 最大25000行 |
| 自動化 | できない | できる |
| 定期実行 | できない | cronやスケジューラで可能 |
SEO改善を継続的に行いたい場合、毎回UIから手動でエクスポートしていては非効率です。APIを使えば、スクリプトを1回書くだけで以後は自動化できます。
取得したデータをどう使うか
取得したCSVには以下のカラムが含まれます。
クエリ, ページ, クリック数, 表示回数, CTR, 掲載順位このデータから「表示されているのにクリックされていない記事」「順位が11〜20位で改善余地がある記事」を特定できます。記事の改善優先度をデータで判断できるようになります。
事前準備|GCP・サービスアカウント・権限設定
実装に入る前に、3つの準備が必要です。詰まりやすい箇所なので丁寧に説明します。
1. GCPプロジェクトの用意
Google Cloud Console(https://console.cloud.google.com)にアクセスします。既存のGCPプロジェクトがあれば、それを流用できます。私はすでに別のプロジェクトで使っていたものを使い回しました。
プロジェクトがない場合は新規作成します。料金は発生しません。
2. Search Console APIの有効化
GCPの「APIとサービス」→「ライブラリ」から Google Search Console API を検索して有効化します。
3. サービスアカウントの作成とJSONキー取得
「IAMと管理」→「サービスアカウント」からサービスアカウントを作成します。
名前例:bizinets-fetcher
メール形式:bizinets-fetcher@[プロジェクトID].iam.gserviceaccount.com作成後、「キー」タブから「新しいキーを追加」→「JSON」を選択してダウンロードします。このJSONファイルが認証に使います。安全な場所に保存してください。Gitにコミットしないよう注意します。
4. GSCにサービスアカウントを追加する(重要)
ここが最も詰まりやすいポイントです。Search Console(https://search.google.com/search-console)を開いて:
- 対象プロパティを選択
- 左下「設定」→「ユーザーと権限」
- 「ユーザーを追加」
- サービスアカウントのメールアドレスを入力
- 権限を「フル」に設定して保存
「制限付き」ではAPIでデータを取得できません。必ず「フル」を選択してください。
最小コードでCSVを出力する
以下が実際に動いたコードです。googleapis パッケージのみで動きます。すぐ試したい方は、次のコードから実行できます。
パッケージのインストール
npm install googleapisfetch_gsc.mjs(完全版)
import { google } from 'googleapis'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
// JSONキーファイルのパス(実際のパスに変更してください)
const KEY_FILE = '/path/to/your/gsc_key.json'
// sc-domain: はドメインプロパティの場合。
// URLプレフィックスプロパティの場合は 'https://example.com/' 形式
const SITE_URL = 'sc-domain:example.com'
// 日付ユーティリティ
function toYMD(date) {
return date.toISOString().split('T')[0]
}
const endDate = new Date()
const startDate = new Date()
startDate.setDate(endDate.getDate() - 90)
// Google認証
const auth = new google.auth.GoogleAuth({
keyFile: KEY_FILE,
scopes: ['https://www.googleapis.com/auth/webmasters.readonly'],
})
const searchConsole = google.searchconsole({ version: 'v1', auth })
// データ取得(ページネーション対応・最大25000行)
console.log(`📡 GSC APIからデータ取得中... (${toYMD(startDate)} 〜 ${toYMD(endDate)})`)
let rows = []
let startRow = 0
while (true) {
const res = await searchConsole.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate: toYMD(startDate),
endDate: toYMD(endDate),
dimensions: ['query', 'page'],
rowLimit: 25000,
startRow,
},
})
const fetched = res.data.rows ?? []
rows = rows.concat(fetched)
if (fetched.length < 25000) break
startRow += fetched.length
}
console.log(`✅ ${rows.length}行取得`)
// CSV出力(BOM付きUTF-8でExcel文字化け対策)
const today = toYMD(new Date()).replace(/-/g, '')
const outDir = path.join(__dirname, '..', 'reports')
const outPath = path.join(outDir, `gsc_export_${today}.csv`)
fs.mkdirSync(outDir, { recursive: true })
const header = 'クエリ,ページ,クリック数,表示回数,CTR,掲載順位'
const csvRows = rows.map(row => {
const [query, page] = row.keys
const clicks = row.clicks
const impressions = row.impressions
const ctr = (row.ctr * 100).toFixed(2) + '%'
const position = row.position.toFixed(1)
const escape = v => v.includes(',') ? `"${v}"` : v
return [escape(query), escape(page), clicks, impressions, ctr, position].join(',')
})
fs.writeFileSync(outPath, '\uFEFF' + header + '\n' + csvRows.join('\n'), 'utf-8')
console.log(`💾 保存完了 → ${outPath}`)実行方法
node scripts/fetch_gsc.mjs出力結果の確認
正常に動くと以下のような表示になります。
📡 GSC APIからデータ取得中... (2026-01-21 〜 2026-04-21)
✅ 142行取得
💾 保存完了 → reports/gsc_export_20260421.csvreports/gsc_export_YYYYMMDD.csv というファイルが生成されます。ExcelやGoogleスプレッドシートで開けます。
実際に詰まったポイント
最小構成でも詰まる箇所がありました。同じところで止まらないように書いておきます。
詰まり①:権限「制限付き」のままでAPIエラー
GSCにサービスアカウントを追加するとき、デフォルトで「制限付き」になっていました。この状態でAPIを実行すると403エラーが返ります。「ユーザーと権限」から「フル」に変更することで解消しました。
判断基準:
- APIが403エラーを返す → GSCの権限が「制限付き」になっている可能性が高い
- 「フル」に変更後も403が続く → サービスアカウントのメールアドレスが間違っている可能性
詰まり②:SITE_URLの形式が合わない
GSCのプロパティには「ドメインプロパティ」と「URLプレフィックスプロパティ」の2種類があります。形式が違うと正しくデータが取得できません。
| プロパティ種別 | SITE_URL形式 | 例 |
|---|---|---|
| ドメインプロパティ | sc-domain:ドメイン | sc-domain:example.com |
| URLプレフィックス | https://example.com/ | https://example.com/ |
GSCの設定画面でどちらのプロパティを使っているか確認してから設定してください。私はドメインプロパティだったので sc-domain:bizinets.life を指定しました。
詰まり③:取得件数が1件しかなかった
実装は正常に動いているのに取得件数が1件だった場合、APIの問題ではなくサイト自体のインデックス状況の問題です。GSCに表示されるデータがなければ、APIで取得しても空に近い結果になります。
サイト公開直後やインデックスが少ない場合は、まずGSCのUI上で「検索パフォーマンス」を確認してデータがあることを確認してから実行します。私の場合はbizinets.lifeのインデックスが1件しかない時期に実行したため、正しく1行だけ取得されていました。
詰まり④:ExcelでCSVが文字化けする
WindowsのExcelは、UTF-8のCSVをそのまま開くと日本語が文字化けすることがあります。コードの出力部分で \uFEFF(BOM)を先頭に付けることで解決します。
fs.writeFileSync(outPath, '\uFEFF' + header + '\n' + csvRows.join('\n'), 'utf-8')Googleスプレッドシートにインポートする場合はBOMなしでも問題ありません。
出力したCSVのSEO分析への使い方
CSVが取れたら、次は分析です。どのように使うかの考え方を書きます。
改善優先度の判断基準
取得したデータで特に見るべきは以下の組み合わせです。
- 掲載順位が5〜20位 かつ CTRが低い記事 → タイトルや説明文を改善するだけでクリック数が増える可能性が高い
- 表示回数が多いのに掲載順位が20位以下 → 本文の強化・内部リンク整備で順位を上げる余地がある
- 公開60日以上経過しているのに表示回数が50未満 → インデックスされていない・検索需要がない可能性
データ取得→分析→改善の流れ
Cloudflareのデプロイ問題を解決してサイトが正常に動くようになった後、次に必要になるのが「データ取得と改善」です。サイトが壊れていない状態で初めてGSCのデータが意味を持ちます。[CloudflareデプロイがWindowsだけ失敗して本番が白画面になる原因とWSLで解決した手順](https://bizinets.life/cloudflare-deploy-fail-windows)でデプロイ問題を解決してから、本記事のAPIを設定するという順番が自然な流れです。
また、[Next.jsでChunkLoadErrorがキャッシュクリアしても直らない原因【本番だけ壊れた時の対処法】](https://bizinets.life/chunkloaderror-cache-not-fixed)で書いたようなエラーが出ている状態では、GSCのデータも正しく反映されません。環境を整えてからデータ取得の仕組みを作る順番が、結果的に正しいと感じています。
まとめ
Search Console APIでCSVを自動出力する方法をまとめます。
必要なもの: GCPプロジェクト・サービスアカウントJSONキー・GSCへの「フル」権限付与・Node.js環境
手順: npm install googleapis → JSONキーとSITE_URLを設定 → node fetch_gsc.mjs 実行
よくある詰まり: GSC権限が「制限付き」のまま・SITE_URLの形式違い・インデックス不足
UIエクスポートは手軽ですが、毎回手動では継続しません。一度APIで仕組みを作ってしまえば、コマンド1つで最新データが手に入ります。データが溜まってくると、記事の改善優先度を客観的に判断できるようになります。
データを取得して分析できるようになると、次は「何をどう改善するか」という判断の問題になります。bizinets.bizでは、こうした判断の軸を体系化して公開しています。[判断軸について読む](https://bizinets.biz/judgment-axis/)
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →