Meta広告運用を効率化!無料APIで広告データをGoogleスプレッドシートに出力する手順

株式会社SPENDAの中都です。

皆さんは日々のレポート作成やデータ集計にどれくらいの時間を費やしているでしょうか。

キャンペーンの効果を日次で把握することはPDCAを回してCPAを改善する活動に欠かせません。しかし、それを手動でデータを取得/管理することを非効率に感じている方もいらっしゃるのではないでしょうか。

そこで本記事では、Meta APIを利用し、無料で広告データを日次で自動取得する方法を実際の画面を交えながら解説していきます。

Meta広告を自動化するべき理由

以前の記事でも、初心者向けということでGoogleスプレッドシートのアドオンを活用したMeta広告データの自動取得法をご紹介しました。

>>> 【初心者向け】Meta広告レポートを自動化する方法

本記事と重なる内容になりますので、手動作成の課題と自動化を導入する理由を再掲いたします。

手動作成の課題

課題①:時間の浪費

広告レポートを作成するために、管理画面からCSVファイルをダウンロードし、スプレッドシートに転記する作業を繰り返す必要があります。これには膨大な時間がかかり、結果的に運用担当者がクリエイティブ改善や戦略立案といった基幹業務に時間を割けなくなってしまいます。

課題②データの不正確さ

手作業でのデータ入力は、入力ミスや集計漏れといった人為的ミスを引き起こすリスクがあります。これにより、意思決定が不正確になる可能性が高まり、誤った戦略を立ててしまう原因にもなります。

課題③リアルタイムでの把握が困難

手動でのデータ取得には時間がかかるため、広告効果をリアルタイムで追跡することが難しくなります。結果として、数値の悪化に即応できず、改善のタイミングを逃す恐れがあります。

以上3点よりMeta広告の自動取得/定期更新を検討する必要がありました。

Meta広告の管理を自動化することで、運用担当者は本来注力すべき業務に専念することができることを以前の記事で紹介しておりました。

Meta APIが向いている人

とはいえ、前回執筆した内容は初心者向けで、利用したアドオンには以下のような課題がありました。

・無料の場合月に35回までしか更新できない
・無料の場合35回を超えると設定をやり直す必要がある
柔軟なデータカスタマイズが難しい

これらの課題を解決するため、今回は無料で利用できるMeta マーケティングAPIを利用した完全自動化の方法をご紹介します。

Meta広告データの自動化が運用に与える影響

Meta APIを活用することで得られる主なメリットを以下にまとめました。

1. 制約のないデータ更新

アドオンのような更新頻度の制限がないため、必要なタイミングで何度でもデータを取得できます。これにより、広告パフォーマンスをよりリアルタイムで確認できるようになります。

2. データ取得の自由度が高い

特定のキャンペーンや広告セットだけを抽出したり、日次ではなく1時間ごとのデータを取得したりと、スクリプトを調整することでカスタマイズ性が大幅に向上します。つまりAPIを使えば、必要なデータだけを正確に収集可能です。

3. ヒューマンエラーを排除

手作業によるデータ転記の手間がなくなり、ミスを完全に防げます。これにより、精度の高いデータに基づいた意思決定ができるようになります。

4. 広告運用全体の効率化

自動化によってレポート作成にかかる時間を大幅に削減できます。その結果、運用担当者はクリエイティブの改善や戦略立案といった、本来注力すべき業務に専念できます。

Meta APIを使った広告データ自動化の完全ガイド

以下では、Meta APIを用いてGoogleスプレッドシートに広告データを自動出力する方法を、APIがわからない!という初心者でも分かりやすいように丁寧に解説します。

1. Meta APIを利用する準備を整える

Meta for Developersアカウントの作成

Meta for Developersにアクセスし、ログインより「Meta for Developers」のアカウントを作成します。
その際、出力したいMeta広告アカウントに紐づくアカウントでログインが必要です。

▼Meta for Developers
https://developers.facebook.com/

②アプリの作成

ログインができたら「アプリを作成」をクリックし、下記項目でアプリを作成します。

アプリ名{任意のアプリ名(例:Meta広告出力アプリ)}
アプリの連絡先アドレス定期的に確認するメールアドレス
ユースケース他の情報をお探しの場合 > その他
アプリタイプビジネス
ビジネスポートフォリオアプリへのアクセスを制限したい場合に利用。

・特定のチームや代理店に対するアクセスを制限したい場合
・アクセス許可を厳密に管理したい場合
は設定を検討。逆に言うと、そうでなければ未設定で問題ない。

③アクセストークンの発行

先ほど作成したアプリが選択されていることを確認し、「マーケティングAPI」の設定を行います。
アクセストークンを取得にて、「ads_read」を選択し、「トークンを取得」を選択します。
*トークンは安全な場所に保存しましょう。

広告アカウントIDの確認

Meta広告の管理画面から、自分の広告アカウントID(例:act_123456789)を確認します。

管理画面を確認する簡単な方法はいずれかです。
・管理画面のアカウント選択箇所で括弧で囲まれている数字列
・管理画面のURLの「?act=」以降の数字列

「トークン」「Meta広告アカウントID」が揃ったら準備は完了です。スプレッドシート側を構築していきます。

2. Googleスプレッドシートの準備

⑤スプレッドシートの作成

Meta広告データを出力するスプレッドシートを作成し、Meta広告のデータを出力するシートを作成しておきます。(例:Meta広告rawデータ)

⑥Google App Script(以降GASと呼称)の設定

「拡張機能」 > 「App Script」より、GASを開きます。
(この記事ではGAS自体の名称を「広告接続」、gsファイルの名称を「Meta広告出力」としておりますが、名称は任意で問題ないです。)

下記スクリプトをコピペします。この際、6行目のアクセストークン、10行目の広告アカウントIDとシート名はこれまで準備してきたものを入力します。

function fetchMultipleCampaigns() {
  try {
    Logger.log("実行開始");

    // アクセストークン
    const accessToken = '{③のトークンを入力}';

    // 広告アカウントとシート名の対応
    const adAccounts = {
      'act_{④の広告アカウントIDを入力}': '{⑤のシート名を入力}',
    };

    // 各広告アカウントのデータ取得
    Object.keys(adAccounts).forEach(adAccountId => {
      const sheetName = adAccounts[adAccountId];
      fetchMetaAdsData(adAccountId, sheetName, accessToken);
    });

    Logger.log("すべての案件の処理が完了しました。");
  } catch (e) {
    Logger.log('エラーが発生しました: ' + e.toString());
  }
}

function fetchMetaAdsData(adAccountId, sheetName, accessToken) {
  // 日付範囲の設定
  const today = new Date();
  const startDate = new Date();
  startDate.setDate(today.getDate() - 90); // 90日前
  const startDateStr = startDate.toISOString().split('T')[0];
  const endDateStr = today.toISOString().split('T')[0];
  const timeRange = encodeURIComponent(`{"since":"${startDateStr}","until":"${endDateStr}"}`);

  // API URLの作成
  const apiUrl = `https://graph.facebook.com/v15.0/${adAccountId}/insights?fields=date_start,date_stop,campaign_name,adset_name,impressions,spend,actions,ctr,cpc,cost_per_action_type,cpm,frequency` +
                 `&level=adset&time_increment=1&time_range=${timeRange}`;

  // リクエストオプション
  const options = {
    method: 'get',
    contentType: 'application/json',
    headers: {
      Authorization: `Bearer ${accessToken}`
    },
    muteHttpExceptions: true
  };

  // シートの準備
  const sheet = prepareSheet(sheetName);

  // ヘッダー行の追加
  const headers = ['Day', 'Campaign Name', 'Adset Name', 'Impressions', 'Link Clicks', 'Amount Spent', 
                   'Results', 'CTR', 'CPC', 'Cost Per Result', 'CPM', 'Frequency'];
  sheet.appendRow(headers);

  // データ取得と書き込み
  fetchAllPages(apiUrl, options, sheet, adAccountId);
}

function prepareSheet(sheetName) {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName(sheetName);
  if (!sheet) {
    Logger.log(`${sheetName} シートを新規作成します。`);
    sheet = spreadsheet.insertSheet(sheetName);
  } else {
    Logger.log(`${sheetName} シートをクリアします。`);
    sheet.clear();
  }
  return sheet;
}

function fetchAllPages(url, options, sheet, adAccountId) {
  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  // データが存在しない場合
  if (!data || !data.data || data.data.length === 0) {
    Logger.log(`広告アカウント ${adAccountId} のデータが存在しませんでした。`);
    return;
  }

  // データをスプレッドシートに書き込み
  data.data.forEach(row => {
    const linkClicks = row.actions?.find(a => a.action_type === 'link_click')?.value || 0;
    const results = row.actions?.find(a => a.action_type === 'lead' || a.action_type === 'purchase')?.value || 0;
    const ctr = linkClicks / (row.impressions || 1) * 100;
    const costPerResult = results > 0 ? row.spend / results : 'N/A';

    const values = [
      row.date_start,
      row.campaign_name || '',
      row.adset_name || '',
      row.impressions || 0,
      linkClicks,
      row.spend || 0,
      results,
      ctr.toFixed(2),
      (row.spend / (linkClicks || 1)).toFixed(2),
      costPerResult,
      row.cpm || 0,
      row.frequency || 0
    ];

    sheet.appendRow(values);
  });

  // 次ページのデータ取得
  if (data.paging?.next) {
    Logger.log(`次のページを取得します: ${data.paging.next}`);
    fetchAllPages(data.paging.next, options, sheet, adAccountId);
  }
}

もし複数アカウントを同時に出力したい場合は、

    const adAccounts = {
      'act_{④の広告アカウントIDを入力}': '{⑤のシート名を入力}',
    };

    const adAccounts = {
      'act_{④の広告アカウントIDを入力}': '{⑤のシート名を入力}',
      'act_{④の広告アカウントIDを入力}': '{⑤のシート名を入力}',
    };

とそのまま下に接続します。

⑦GASを実行

スクリプトを入力したら「実行」を選択します。初回実行時にはアクセス許可の警告が出る場合がありますので、「安全ではないページに接続」を選択し、アクセスを許可します。

実行ログにて、「実行完了」と出れば成功です。シートにデータが出力されているかと思います。

*データはデモデータです。

⑧トリガーで毎日更新に設定

GASは実行できましたが、このままだと自動更新されないため、トリガーで毎日決まった時間にGASが動くように設定します。

GASを開き、左側のメニューバーよりトリガーを選択。「トリガーを追加」を選択後、下記のように設定します。

実行する関数fetchMultipleCampaigns
実行するデプロイHead
イベントソース時間主導型
時間ベースのトリガータイプ日付ベースのタイマー
時刻任意の時間
(始業に合わせて8:00~9:00で設定することが多いです。)

これで日次でMeta広告のデータが自動更新されるようになりました。

Meta API接続後に考えたいこと

Meta API接続後にできることのアイデアを記載します。

1. クロスプラットフォームのデータ統合

Meta広告だけでなく、Google広告、Yahoo広告、GA4など他のプラットフォームからもデータを収集し、統合的に分析する仕組みを構築できます。

Google広告自動出力の方法はこちら
Yahoo広告自動出力の方法はこちら
GA4自動出力の方法はこちら

2. Looker Studioでのダッシュボード化

Looker Studio(旧Google Data Studio)と連携して、リアルタイムで更新されるビジュアルダッシュボードを作成。社内外の関係者とデータを簡単に共有できます。

3. 自動アラートの設定

特定のKPI(例:CTRが1%を下回る)を検知した場合、メールやSlack通知を自動送信する仕組みをApps Scriptで構築できます。

多くのWeb広告や、GA4は無料でデータの自動収集ができるため、1つのスプレッドシートにデータを集めて分析してみると、より面白い示唆が出せるようになるかもしれませんね。


まとめ

Meta広告の自動レポート出力は、時間の節約だけでなく、パフォーマンス向上と正確な意思決定を支援します。自動化によって運用効率が向上し、人的ミスを防止しながら、PDCAサイクルを円滑に回せるようになります。

弊社では、広告運用だけでなく、データ活用の支援も行っています。ご相談は無料で承っておりますので、ぜひお気軽にお問い合わせください。

最新情報をチェックしよう!