Blue Unicorn
A Dodgers fan site providing MLB game data, at-bat logs, and AI commentary. Track game results with real-time data.
What We Built
広告運用の現場では「この広告に使った画像・動画を見せてほしい」という確認が何度も発生します。ところが管理表に並んでいるのは広告名と数値だけで、実物のクリエイティブは広告マネージャの奥にあり、毎回手作業で探して落とす必要がありました。このツールは、Meta広告APIから画像・動画のクリエイティブを一括で取得し、広告アカウント別・広告別のフォルダに整理してGoogleドライブへ格納、さらに広告管理スプレッドシートの該当行へ保管先リンクを書き戻します。管理表の行から実物へ1クリックで辿れる状態を、毎回の手作業なしで維持するのが目的です。ココナラ経由で受注し、Windows環境で動く納品ツールとして手順書一式とあわせて納品しました。
What happens between launch and completion
Preflight
Verifies auth, destination folder, and sheet columns up front; aborts in seconds on misconfiguration
List ads
Pulls ads per account with their ad set and campaign names attached
Resolve creatives
Walks single-image, carousel, and dynamic creatives to locate the real asset URLs
Name & dedupe
Derives names from each asset's own ID or hash; skips anything already on Drive
File to Drive
Auto-creates per-account and per-ad folders; generates fallback docs for unavailable videos
Write back to sheets
Matches rows by ad name and writes the link into one designated column only
Report
Outputs the run result, unmatched rows, and any failed assets
How things end up organized (dummy data)
Google Drive structure
📁 広告クリエイティブ/
📁 アカウントA/
📁 20260701_夏キャンペーン_A/
🖼 img_a1b2c3d4.jpg
🖼 img_e5f6g7h8.jpg
🎬 1234567890__メイン動画.mp4
📁 20260701_夏キャンペーン_B/
🖼 img_i9j0k1l2.jpg
📄 動画の参照先まとめ.gdoc
📁 アカウントB/
📁 20260715_リタゲ_01/
🖼 img_m3n4o5p6.jpgSpreadsheet output
| Ad name | Spend | CPA | Creative |
|---|---|---|---|
| 20260701_夏キャンペーン_A | ¥120,000 | ¥3,200 | 🔗 Driveで開く |
| 20260701_夏キャンペーン_B | ¥86,000 | ¥2,900 | 🔗 Driveで開く |
| 20260715_リタゲ_01 | ¥54,000 | ¥4,100 | 🔗 Driveで開く |
Note: all values shown are dummy data. The tool writes only the rightmost column and never touches existing columns or formulas.
Why & For Whom
What was built
Meta広告のクリエイティブを一括取得し、Drive整理とスプレッドシート反映まで行う運用ツール
Target audience
複数の広告アカウント・複数の管理シートを回している広告運用チーム
Type
受注制作 / 納品済み
Time Investment
Total: 約4日(初回納品〜機能追加まで)
要件のすり合わせ・API検証
約1日
本体実装
約1日
実機テスト・レビュー修正
約1日
手順書作成・納品パッケージ化
約1日
What We Used
Build Order
最初の相談は「広告素材を一元管理したい」という広い要望でした。ヒアリングを重ねて、実際に時間を食っているのは『管理表の行から実物のクリエイティブに辿り着けないこと』だと切り分け、そこだけを解く構成に絞り込みました。範囲外にしたもの(成果数値の集計、他サービスに散っている資料の統合)も、その場で合意して書面に残しています。
実装前に、クライアント本人名義のアプリ+読み取り専用の権限で必要なデータに届くかを実APIで確認しました。ここで通ることを確かめておくと、審査申請が不要になり着手が数週間早まります。逆にここを飛ばすと、作り終えてから「権限が下りない」で全部止まります。
広告一覧から、単体画像・カルーセル・動的クリエイティブそれぞれの構造をたどってアセットを解決します。動画はアカウントの動画ライブラリ経由でまとめて引く必要があり(個別に問い合わせると権限エラーになる)、ここは実際に叩いて分かった仕様に合わせています。
再実行しても二重取得しないよう、Drive上の同名ファイルの有無で「取得済み」を判定しています。つまりファイル名の決め方がそのまま欠落の有無に直結するため、名前の決定ロジックだけを独立したモジュールに切り出し、アセット固有のID・ハッシュを必ず名前に含める方式に統一しました。
実行はバッチファイルのダブルクリック、エラーは日本語の指示文に変換。重い処理に入る前に認証・保存先・シート構造をまとめて確認し、設定ミスがあれば最初の数秒で止めます。手順書は初回セットアップ・Google認証・トークン更新・受け入れチェックなど7本に分けてPDFで納品しました。
初回納品後、管理シートが1枚ではなく案件ごとに複数枚あることが判明。取得とDrive格納は1回のまま、リンクの書き込みだけをシートの枚数分繰り返す形に拡張しました。対象シートの指定はクライアント自身が設定ファイルを編集する運用にし、シートが増減するたびにこちらへ依頼が発生しない形にしています。
Problems & Solutions
Problem
ファイル名を「取得できた順の連番」で付けていたため、広告の構成が変わると新しい素材が『取得済み』と誤判定され、静かに欠落する経路があった
Solution
名前を「アセット自身の情報(画像のハッシュ・動画のID)だけで決まる」方式に変更。同じ題名の動画に差し替えられても別ファイルとして扱われます。名前をその時の集合に依存させないことが冪等性の条件だと分かり、この原則を設計メモに明文化して以降の変更で崩さないようにしました。
Problem
アクセストークンをURLのクエリに載せていたため、通信エラー時のログにトークンが平文で残っていた。しかもそのログは「詰まったら送ってください」と案内しているファイルだった
Solution
トークンをAuthorizationヘッダー送信に変更し、加えてログ出力の直前でマスクする二重の防御にしました。別モデルによるクロスレビューで見つかった問題で、以降は出荷前のクロスレビューを工程に組み込んでいます。
Problem
APIの仕様上、どうしても本体を取得できない動画が全体の約半分あった。しかも先に「動画も全部ドライブに入ります」と伝えてしまっていた
Solution
取得できない条件を切り分けて、権限を足しても解決しないことを実測で確定させたうえで、正直に訂正しました。そのうえで代替として高解像度サムネイルと、動画ごとの直接リンクを並べた案内ドキュメントを自動生成する形に変更。できないことを早く言い切って代替案を出すほうが、曖昧なまま引っ張るより結果的に信用されると実感しました。
Problem
Windowsのパス長上限を超え、名前の長い広告のファイルだけが毎回失敗していた。再実行しても同じ場所で落ちるため、利用者から見ると原因不明のまま永久に取得できない
Solution
一時作業フォルダの階層を浅くして回避しました。開発環境(Linux)では絶対に踏まない不具合で、納品先の環境で実際に動かして初めて出る種類の問題です。以降、納品前の実機確認は工程から外さないことにしています。
Takeaways for Next Time
I build similar work with AI — faster and at lower cost
Everything shown here is a real, orderable project. After a short chat about your industry and goals, I build it from scratch to fit your business. Feel free to reach out just for a rough estimate.
Price guide
¥20k–¥150k
Turnaround
1–2 weeks
Explore more behind the scenes