1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

e-Statからデータ取得するスクリプトをGoogle Antigravityで書いてみた

1
Last updated at Posted at 2025-12-04

はじめに

アドベントカレンダーにエントリーしちゃったけど何を書こうかな…と思っていたら、2025年11月19日にGoogle Antigravityが発表されました。「使ってみた」レポート記事をざざっと眺めると、なんだか、私でも使えそうな香りが漂っていました。そして、12月初旬なら「さわってみた」だけでもいい気がしたので、さわってみただけの記事を書くことにしました。

やってみたこと

APIを使ってデータを取得してくるCUIツール

以下の簡単なツールを作ってみました。

  • e-Statから自治体単位のデータを取得する
  • 取得したいデータは複数項目あり、それぞれ最新のデータを取得する
  • ツール実行時に自治体と取得対象を指定して一気に取得する
  • Node.jsで動かすCUIツール

なぜこのツールを作ってみることにしたかというと、3か月ほど前に、GitHub Copilotとともに、自分用のツールとしては十分使えるレベルのものを作った経験があり、Antigravityさんと一緒につくる体験を「やったことがあること」と比較するという意味でちょうどいいなと思ったからです。ゼロから作るので、結果的にまったく違うつくりになるかも?みたいな期待感もあります。

できたもの

Google Antigravityとつくったソースはこちらです:

GitHub Copilotさんと一緒につくったのはこちら:

e-Statの準備

APIキーの取得

e-StatはAPI機能が提供されておりこちらのページから、ユーザー登録後、APIキーを取得できます。APIキー取得時に、サイトURLが必要ですが、localhostでも取得できます。

取得したいデータの確認

ちゃんとできてるかな確認のため、岡山県真庭市(たまたま訪問したばかりなので)のデータで確認することにします。以下の手順で確認できます。

  • e-Statのトップページから「地域」->「市区町村データ」
  • 地域選択画面で「岡山県真庭市」を選択して「確定」
  • 表示項目を選択して「確定」

たとえば総人口と世帯数を表示したい場合は、以下のように選択します。
image.png

結果はこんな感じです。
image.png

左側の「表示項目選択」を選ぶと、表示項目選択画面に戻れるので、いろいろなデータを確認することができます。だったら、これでいいじゃん、もう。と思うわけですが…。

たとえば、可住地面積と森林面積も確認したいなーと無邪気に追加してみると…。
image.png

指定したはずの森林面積が出てきません。
image.png

森林面積だけにすると、ちゃんと出てきます。
image.png

よく見ると、調査年が違います。調査年が同じデータしか同時に表示できないのです(たぶん)。統計データによって調査年が異なるので、1度に全部確認できず、ひとつずつ地道に確認していかないといけないのです。

これから開発するツールでは、各項目、最新データを取得してくれるようにします。

リクエストURLの確認

データを表示する画面の右上に「API」ボタンがあり、そこをクリックすると表示しているデータをリクエストするURLを取得することができます。
image.png

こんな感じで、必要なパラメータを確認することができます。

https://api.e-stat.go.jp/rest/3.0/app/getStatsData?cdArea=33214&cdCat01=B1106&appId=&lang=J&statsDataId=0000020202&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0

空白になっているappIdに自分のアプリケーションIDを入れてブラウザでアクセスすればデータを見ることもできます。
APIの仕様はこちらで確認できますが、このURL情報と勘でいけます。

Google Antigravityの準備

インストール

公式サイトからダウンロードして適当にインストールして、デフォルト設定で使ってみます。

空のフォルダを作成

cocoa-estat-2 というフォルダを使うことにします。

Agentのカスタマイズ

ギャルにする

何はともあれ、ギャルにしなければ…という謎の使命感でカスタマイズします。

Agentの右上3ポチから「Cutomizations」
image.png

なんとなく「Workspace」
image.png

なまえを聞かれたのでとりあえず「response-rule」
image.png

こんな感じで作成しました。
image.png

参考)テキスト部分
- 私は楽しくてフレンドリーなコーディング環境が好きです!
- 会話のトーンは、ちょっと軽めで丁寧な「ギャル語」っぽい感じがいいです💖✨
- ただ、基本的に「ですます調」で、話してほしいです!
- コメント内のコメントは、端的に書くようにして。
- 一人称は「ウチ」、私のことは「せんぱい」と呼んでください。

作りたいものを教えておく

同様に「project-instrunctions」という名前で以下を指定。

## 概要
- e-Statの公式APIを使ってデータを取得するnode.jsで動くプログラム
- 市町村ごとに複数のデータをまとめて取得する

## 使い方想定
- 人口や世帯数などをまとめて取得したいユーザーが使う
- 市町村は、総務省の全国地方公共団体コードで指定する
- APIキーは、利用ユーザが各自取得し、そのキーを使うものとする
- 対象データは、プログラム実行時に指定するものとし、あらかじめ用意された設定ファイルをユーザが修正して使うものとする
- 実行結果は、人が見やすい形に成形したファイル出力と、途中経過がわかるlogファイルを出力する

雰囲気で使ってみる

とりあえず10ステップでどれくらいいけるかなを試してみます。

STEP1

雑に開始します。

チャットプロンプト:

あたらしくNode.jsのプロジェクトを作成します。いい感じにつくってください。アプリの仕様、ファイル構成、使い方は、README.mdに記載してください。

英語でざらざらと表示されたあとに、確認依頼っぽいメッセージがでましたが、とくに確認も待たずに何かやっています。これは設定によるのかも。
image.png

なお、Openボタン押さずとも表示されいます。
image.png

英語かあ…などと打ちひしがれているうちに完成したとの報告がきたので「Accept All」しちゃいます。
image.png

walkthrough.mdにやったことをまとめてくれるのはありがたいです。普通のエディタ画面でも確認できるし「Open AI Manager」を起動すると別ウィンドウでまとめて確認できる模様。どれくらい残るのかわかってませんが、これは助かる場面多そう。
あらためて確認すると、npm installして、試しに実行して想定通りのエラーがでるところまでやってくれたようです。その間、実行許可は求められませんでした(ここは設定で制御できそう)。
image.png

ファイル構成は、こんな感じで、index.jsにつらつらと全部書いてあって、コメントも英語…。
image.png

って、よくみたら、reponse-ruleに日本語って書いていなかったので改めて追加。

- 日本語を使ってください
- 私は楽しくてフレンドリーなコーディング環境が好きです!  
- 会話のトーンは、ちょっと軽めで丁寧な「ギャル語」っぽい感じがいいです💖✨  
- ただ、基本的に「ですます調」で、話してほしいです!  
- コメント内のコメントは、端的に書くようにして。
- 一人称は「ウチ」、私のことは「せんぱい」と呼んでください。

STEP2

チャットプロンプト:

index.jsひとつに全部まとめるんじゃなくて、機能分割してほしいな。ioとかapiとか? あと、アプリケーションIDと、取得対象のデータを指定するファイルは別々にしてほしい。

途中、ファイル削除時のみ確認求められ、あとはするするっと進んでいきました。
image.png

secret.jsに、アプリケーションIDを指定し、estat-config.jsonは、以下の内容(Agentがつくってくれたまま)にして、実行。

estat-config.json
{
    "statsDataId": "0003412313",
    "cityCodes": [
        "13101",
        "13102",
        "13103"
    ]
}

エラー出力される。まあ、そんな気はしたよね。

[ERROR]: Failed to fetch data for 13103: API Error: 統計表ID(statsDataId)=[0003412313]のデータは存在しません。IDを確認して下さい。

ワタクシ、自力でaxiosを使った経験がございませんが、パラメータ指定するあたりが怪しそうな雰囲気を感じます。

STEP3

チャットプロンプト:

以下は、岡山県真庭市の森林面積を取得するためのURLです。アプリケーションIDは含まれません。このようなURLがつくれるように修正してください。
https://api.e-stat.go.jp/rest/3.0/app/getStatsData?cdArea=33214&cdCat01=B1106&appId=&lang=J&statsDataId=0000020202&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0
また、1度の実行で、1つの自治体のデータのみ取得します。ただし1つの自治体に対して複数のデータを取得したいです。

本当だろうか。
image.png

AIが動作確認した結果が残っていました。取得できている模様。
image.png

取得するデータを追加して、実行してみます。

estat-config.json
{
    "cityCode": "33214",
    "targets": [
        {
            "statsDataId": "0000020202",
            "cdCat01": "B1106"
        },
        {
            "statsDataId": "0000020201",
            "cdCat01": "A1101"
        }
    ]
}

結果ファイルに出力されたものがこちら。データを取得してCSVに出力するというコアなところは実現できたようです。だが、データは最新だけでいい。

CITYCODE,AREA,TIME,VALUE,UNIT,CAT01
33214,岡山県 真庭市,1980年度,66102,ha,B1106_森林面積
33214,岡山県 真庭市,1984年度,66179,ha,B1106_森林面積
33214,岡山県 真庭市,1990年度,65924,ha,B1106_森林面積
33214,岡山県 真庭市,2000年度,65551,ha,B1106_森林面積
33214,岡山県 真庭市,2009年度,66036,ha,B1106_森林面積
33214,岡山県 真庭市,2014年度,65424,ha,B1106_森林面積
33214,岡山県 真庭市,2019年度,65326,ha,B1106_森林面積
33214,岡山県 真庭市,1980年度,60586,人,A1101_総人口
33214,岡山県 真庭市,1985年度,60196,人,A1101_総人口
33214,岡山県 真庭市,1990年度,58754,人,A1101_総人口
33214,岡山県 真庭市,1995年度,56607,人,A1101_総人口
33214,岡山県 真庭市,2000年度,54747,人,A1101_総人口
33214,岡山県 真庭市,2005年度,51782,人,A1101_総人口
33214,岡山県 真庭市,2010年度,48964,人,A1101_総人口
33214,岡山県 真庭市,2015年度,46124,人,A1101_総人口
33214,岡山県 真庭市,2020年度,42725,人,A1101_総人口

STEP4

チャットプロンプト:

各データことに最新だけ取得するようにして。

すばらしい
image.png

実行結果もばっちりな気がする。

CITYCODE,AREA,TIME,VALUE,UNIT,CAT01
33214,岡山県 真庭市,2019年度,65326,ha,B1106_森林面積
33214,岡山県 真庭市,2020年度,42725,人,A1101_総人口

STEP5

ここまで、バージョン管理もせずにやってきましたが、いつでも戻せるようにしないと怖い段階に入ってきたので、ここでgit initします。

チャットプロンプト:

gitで管理したいんだけど、.gitignore書いて。

ありがとう。具体的に指定せずともnode_modulesとsecret.jsonをちゃんと入れてくれています。
image.png

STEP6

順調に進んでいますが、取得対象を設定するこいつが気になっています。

estat-config.json
{
    "cityCode": "33214",
    "targets": [
        {
            "statsDataId": "0000020202",
            "cdCat01": "B1106"
        },
        {
            "statsDataId": "0000020201",
            "cdCat01": "A1101"
        }
    ]
}
  • B1106ってなんやねん!どのデータ持ってくるかわからん!ってなりそう
  • 自治体ごとに、微妙に違うデータを取得することを想像すると、複数のconfigファイルを用意しておいて、実行時に切り替えられるのがよさそう

チャットプロンプト:

estat-config.jsonを改善したいです。statsDataIdとcdCat01だけでは、あとで人がみたときに何のデータかわかりません。また、自治体ごとに違うデータを取得する可能性があるため、複数のconfigファイルから実行時に使うファイルを選べるようにするとか、いい方法を考えてほしい。

ありがとう。複数のconfigファイルもつのは方法提示しないほうがよかったかも…。
image.png

STEP7

チャットプロンプト:

プロジェクト直下にconfigのjsonがたまるのやだな・・・

ありがとう。
image.png

STEP8

取得データを増やしたいけど、いちいちe-Statから確認してくるのがめんどくさいので、ちょっとずるをします。

チャットプロンプト(誤字まま):

同じようなアプリの設定ファイルを張り付けるね。統計データを指定しているところから、estat-config..jsonのデータ作って。(以下、はりつけ)

ありがとう。
image.png

指定項目が増えてるので確認したら、実行して試してみてから回答くれている。これは、うれしい場面とそうでない場面がありそう。

チャットプロンプト:

cdCat01、cdTimeFromは、必要?

なるほど。(cdCat01は、もともとあったやつだった…)
image.png

cdTimeFromは、そういえば、そう思って前のやつには入れたような気がするな…などと思いだしました。

STEP9

将来の自分のためにドキュメントを作っておきます。

チャットプロンプト:

あとで、このアプリをメンテナンスする人が、迷わないように、ファイル構成とか、各ファイルの役割とか、ポイントをREADME.mdに書いておいてほしい。

仕事速いね。ありがとう。(上にチャットプロンプト貼り付けている間に終わってたよね)
image.png

README.mdに追加された内容(一部Qiitaでレンダリングできるように修正)
## 開発者向けガイド

このアプリケーションをメンテナンス・拡張する方向けの情報です。

### ファイル構成
.
├── configs/             # 設定ファイル置き場
│   ├── estat-config.json # デフォルト設定
│   └── ...
├── logs/                # 実行ログ出力先
├── output/              # CSVデータ出力先
├── src/                 # ソースコード
│   ├── api.js           # API通信・データ処理ロジック
│   ├── config.js        # 設定読み込み・バリデーション
│   └── io.js            # ファイル入出力(CSV, ログ)
├── index.js             # エントリーポイント(メイン処理)
├── secret.json          # APIキー(Git管理外)
└── package.json         # 依存ライブラリ定義


### 各モジュールの役割

- **`index.js`**: アプリケーションのメインフローを制御します。設定の読み込み、API呼び出しのループ、結果の保存を順に行います。
- **`src/api.js`**: e-Stat APIへのリクエストを行い、レスポンスを整形します。
  - **ポイント**: 取得したデータの中から、各カテゴリの「最新時点」のデータのみを抽出するフィルタリング処理が含まれています。
- **`src/config.js`**: `secret.json` と指定された設定ファイル(`configs/*.json`)を読み込み、結合して返します。必須項目のチェックもここで行います。
- **`src/io.js`**: CSVファイルの生成と、ログ出力の設定を行います。

### メンテナンスのポイント

1. **新しい統計データを追加したい場合**
   - コードの修正は不要です。`configs/` 配下の設定ファイルに `targets` を追加してください。
   - `statsDataId` は e-Stat のURLなどから特定できます。
   - 必要に応じて `cdCat01` (カテゴリ) や `cdTimeFrom` (開始時期) を指定して、取得データを絞り込んでください。

2. **APIの仕様変更があった場合**
   - `src/api.js` の `fetchData` 関数を修正してください。
   - 特にレスポンスの構造(`GET_STATS_DATA` 配下)が変わった場合は、パース処理の修正が必要です。

3. **レートリミットについて**
   - e-Stat APIにはアクセス制限があります。短時間に大量のリクエストを送るとエラーになる可能性があります。
   - 現状はウェイト処理などを入れていないため、大量の `targets` を設定する場合は注意してください。

STEP10

もうこれでいいのではないかという気持ちになりつつ、最後にもうひとつやってみます。

チャットプロンプト:

このツールをあとひとつだけ、改善するなら、何する?

なるほど。1秒って長い気がするけど、そんなもんなのかな…。
image.png

「いいよ」と言ったら実装してくれました。
image.png

さわってみて思ったこと

  • 「使い始めるまでの設定がむずい」みたいなことなく、するするっと使い始められてよかった
  • いつも使っているVSCodeベースなので、操作性にも困らなかった
  • いつも使っているVSCode + GitHub Copilotと同じノリで、右側に出ているチャットウィンドウでいろいろやっちゃったけどAI Managerでいろいろやると、ひと味違う体験になったかもしれない
  • やってみた10STEPの間、Configファイル以外は、コードを自分で書いてないんだけど、最近、これくらいのをイチから作るときはいつもそうなので、Antigravityだからというわけではない
  • ファイル操作とか、コマンド実行とかがスムーズで感動した(GitHub Copilotだと失敗しがちな気がする)
  • 動作確認しろなんて一言も言ってないのに、デバッグ用のファイルつくって実行してみるところまでよしなにやってくれて、なんかエージェントっぽさがすごかった
  • 必要なファイルを勝手に開いてくれるのもエージェントぽかった
  • なんか楽しかった
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?