予算表と各媒体の消化データを突合し、配信漏れ・進捗異常をチェックしてExcelレポートを出力。「予算チェックして」「配信漏れを確認して」「進捗を確認して」で使用
入力: $ARGUMENTS
広告運用の予算表(Excel/CSV)と各媒体の消化データ(CSV/Excel)を突合し、 配信漏れ・進捗異常・データ受け渡し漏れを検出してExcelレポートを出力する。
対応媒体: Google広告、Meta広告、LINE広告、TikTok広告、X(Twitter)広告、その他任意のCSV/Excel
全体は6ステップ構成で、レポートの番号(①〜⑥)と一致させる。
python3 -c "import openpyxl" 2>/dev/null || pip3 install openpyxl
$ARGUMENTSにフォルダパスがあればそこを、なければカレントディレクトリを対象とする。
ls -la)案件名, 媒体, 予算額 を含むもの媒体判定ルール:
エンコーディング検出: 以下の順で試行する
utf-8-sig(BOM付きUTF-8: Excel出力に多い)utf-16(Google広告エクスポートに多い)utf-8cp932 / shift_jis(日本語Windows環境)区切り文字の自動検出: CSVがカンマ区切りかタブ区切りか判定する
csv.Sniffer().sniff() も活用可能Google広告CSVのメタデータ行: Google広告のエクスポートCSVには先頭に2行のメタデータがある:
行1: レポートタイトル(例:「無題のレポート」)
行2: レポート期間(例:「2026年4月1日 - 2026年4月11日」)
行3: ヘッダー行(アカウント名, お客様ID, キャンペーンタイプ, ...)
行4〜: データ行
→ 行1-2をスキップし、行3をヘッダーとして使う。ただし形式が異なる場合もあるため、 ヘッダー行は「アカウント」「キャンペーン」「費用」等のキーワードを含む行を動的に検出する。
予算表・消化データ共に、列名は毎回異なり得る。以下のキーワードで列を特定する:
| 検出する列 | マッチするキーワード(部分一致) |
|---|---|
| アカウント名 | アカウント, account, 広告主 |
| キャンペーン名 | キャンペーン, campaign, CP名 |
| キャンペーンタイプ | タイプ, type, 種別, 配信方式 |
| 費用/消化額 | 費用, 消化, cost, spend, 金額, 利用額 |
| 通貨 | 通貨, currency, JPY |
| 案件名 | 案件, クライアント, 広告主, client |
| 媒体 | 媒体, メディア, media, 配信面 |
| 予算額 | 予算, budget |
マッチしない場合は列の中身をサンプリングして推定する。それでも不明なら質問する。
予算表から以下を抽出:
媒体名や予算額が空の行は「新規提案」「計測設定のみ」等として記録し、突合対象外とする。 ただしレポートには記載し、ユーザーが把握できるようにする。
各媒体CSVから以下を抽出:
Google広告のキャンペーンタイプ → 予算表媒体名の変換:
| キャンペーンタイプ | 予算表上の媒体名 |
|---|---|
| 検索 | Google検索 |
| P-MAX | GoogleP-max |
| デマンド ジェネレーション | Googleデマンド |
| ディスプレイ | Googleディスプレイ |
| 動画 | Google動画 |
| その他 | Google(タイプ名) |
Google以外の媒体はキャンペーンタイプ = 媒体名(Meta, LINE, TikTok等)とする。
全媒体のデータを以下の列で1つに統合:
ソース | アカウント名 | キャンペーン名 | キャンペーンタイプ(媒体) | 費用
マッピングは本スキルの最重要ステップ。 ここのミスは全体の信頼性を損なう。
| 予算表の表記 | CSVの表記 | パターン |
|---|---|---|
| エニタイム〇〇 | AF〇〇店 | ブランド名の略称 |
| UFC*〇〇店 | UFCGYM | 英語正式名 |
| ドクターズマン | ドクターズ・マン | 中点(・)の有無 |
| フィットコム | フィット・コム | 同上 |
| VISION24〇〇 | VISION24〇〇店【新アカウント】 | 接尾辞の付加 |
| ViSiONS UP〇〇 | visions up 〇〇 | 大小文字・スペースの違い |
| ロイヤルフィットネス系 | ロイヤルフィットネス(RF24&プラザ&ラフィモ) | 1アカウントに複数施設 |
| 〇〇(直営) | 〇〇店 | 括弧内の補足の有無 |
複数店舗/ブランドが1つの広告アカウントに混在しているケースの対処:
店舗分割(キャンペーン名の【】内で判定):
ブランド分割(キャンペーン名のブランド名で判定):
施設分割(キャンペーン名の施設名で判定):
ポイント: 全件を1つ1つ確認させると非効率。自信度が高いものはまとめて提示し、 不確実なものだけ個別確認する。
消化額 = マッピングされたキャンペーンの費用合計
進捗率 = 消化額 ÷ 予算額 × 100
期待進捗率 = 経過日数 ÷ 月日数 × 100
経過日数・月日数の決定方法:
月末にちょうど予算額に着地させるための残期間の日予算を算出する:
残予算 = 予算額 − 消化額
残日数 = 月日数 − 経過日数
想定日予算 = 残予算 ÷ 残日数(円未満切り捨て)
判定基準:
| 進捗率 vs 期待 | 判定 |
|---|---|
| 配信なし(0%) | ❌ 配信なし |
| 期待の70%未満 | ⚠️ 進捗遅れ |
| 期待の70%〜130% | ✅ 適正 |
| 期待の130%超 | ⚠️ 進捗過多 |
以下を検出:
予算表にあるが消化データにないもの
消化データにあるが予算表にないもの(費用 > 0のもののみ対象)
③で算出した進捗率を基に、異常値を以下の3カテゴリで報告:
各カテゴリ内は進捗率の昇順/降順でソートし、最もアクションが必要なものを先頭にする。
以下をすべて検証:
1つでも不整合があれば原因を特定し、修正してから出力に進む。
シート1: チェック報告(先頭配置)
シート2: 統合データ(全媒体)
シート3: 予算進捗表
シート4: 予算表外キャンペーン
#,##0 カンマ区切り0.0% パーセント表示Excelと同じ内容を簡潔にターミナルにも出力する:
━━━ 予算進捗チェック報告 ━━━
■ ① データ統合: {媒体名}: {件数}件 / {合計}円 ...
■ ② マージチェック: ✅ 一致 / ❌ 不一致
■ ③ 予算表突合: マッチ{X}件 / 配信なし{X}件 / 予算表外{X}件
■ ④ 配信漏れ可能性: {一覧}
■ ⑤ 進捗異常: 遅れ{X}件 / 過多{X}件 / 適正{X}件
■ 想定日予算: 停止推奨{X}件 / 要注意(日予算500円以下){X}件
■ ⑥ Wチェック: ✅ 全項目一致
結論: {要対応件数}件の確認事項あり
━━━━━━━━━━━━━━━━
予算進捗チェック_{フォルダ名}_{年月}.xlsx
突合完了後、確定したマッピングテーブルをJSONで保存する:
// {フォルダ}/_mapping.json
{
"created": "2026-04-11",
"updated": "2026-04-11",
"mappings": [
{
"budget_name": "UFC*荻窪店*日本語",
"budget_media": "Google検索",
"csv_account": "UFCGYM",
"csv_campaign_filter": "荻窪 AND NOT 英語",
"csv_media": "Google検索"
}
]
}
次回実行時にこのファイルが存在すれば:
新しい媒体のCSV/Excelが追加された場合: