こんにちは、中都です。
Meta広告の管理画面を開いて、CSVをダウンロードして、スプレッドシートに貼り付ける。毎日、あるいはレポートを作るたびに、この作業を繰り返していないでしょうか。
僕は、Meta広告の管理画面って、地味に見るのが大変だなと思っています。動きが重かったり、もう見なくていいキャンペーンのデータまで並んでいたり。ひとつひとつは小さなことですが、毎日のことだとストレスになりますよね。手動での転記も含めて、こういう作業にかかる時間は減らしてしまいたいんです。
MetaのMarketing APIとGoogle Apps Script(GAS)をつなぐと、広告データの取得とシートへの書き込みを自動化できます。さらに毎日の実行時間を設定すれば、朝の確認に使うデータをシートへ集められます。
今回は、Meta側のアプリ作成から、トークンの取得、GASの設定、毎日の自動実行まで説明します。まずは広告アカウントを1つに絞り、手動でデータが取れるところまで進めましょう。
実際の画面を見ながら進めたい方は、下の動画もあわせてご覧ください。
動画でも解説しています
広告データをシートに集めると、何が楽になる?
スプレッドシートへ必要なデータを集めておけば、いつもの表で確認したり、ピボットテーブルで集計したりできます。
僕がいいなと思うのは、使い慣れたシートで、自分の見やすい形に集計できるところです。管理画面から数字を持ってくる作業を減らして、レポートを作ったり、中身を見たりするところに時間を使えます。
役割は次の3つに分かれます。
| 使うもの | 役割 |
|---|---|
| MetaのMarketing API | 権限のある広告アカウントから、広告の実績データを取得する |
| Google Apps Script | APIへ取得を依頼し、結果をスプレッドシートに書き込む |
| 時間主導型トリガー | 決めた時間帯にGASを実行する |
今回は広告の実績を読むための設定です。広告文や入札、予算を変更する処理は扱いません。
始める前に用意するもの
- 対象の広告アカウントにアクセスできるFacebookアカウント。広告マネージャで、取得したいアカウントと実績が見えることを確認します。
- Meta for Developersでアプリを作成・設定できるアカウント。初回は開発者登録など、画面に表示される手続きが必要になる場合があります。
- Googleアカウントと、書き込み先のスプレッドシート。Apps Scriptを編集・実行できるものを用意します。最初は検証用の新しいファイルを使います。
- Meta広告データを取得するGAS。このあと掲載するコードをコピーして使います。
使用するGASは、この記事の「GASコード全文」からコピーできます。別途コードを受け取る必要はありません。
掲載画像は2026年4月公開の動画で使った実演画面です。現在のメニュー名や配置が異なる場合は、同じ機能に当たる項目を選んでください。
手順1.Meta for Developersでアプリを作る
アプリ名とユースケースを設定する
Meta for Developersのマイアプリを開き、対象の広告アカウントにアクセスできるFacebookアカウントでログインします。画面の「アプリを作成」を押してください。
アプリ名は、たとえば「広告データ出力」にします。連絡先メールアドレスには、通知を確認できる自分のアドレスを入力します。「Meta」などのブランド名をアプリ名に含めるとエラーになることがあるため、用途が分かる名前にしておくと進めやすいです。
次に「広告と収益化」から、「マーケティングAPIで広告パフォーマンスデータを測定」を選び、「次へ」を押します。
ビジネスポートフォリオや要件の確認が続く場合は、自分の管理主体に合う情報を選び、作成を完了します。画面を合わせるために、別の会社のポートフォリオを選ばないようにしてください。
作成したアプリの設定を開く
アプリのダッシュボードが開いたら、左上に先ほど付けたアプリ名が表示されていることを確認します。中央の「マーケティングAPIで広告パフォーマンスデータを測定」のカスタマイズへ進みます。
手順2.広告の読み取り用トークンを取得する
ユースケースの設定画面で「ツール」を開きます。「トークンアクセス許可」のads_readにチェックを付け、「トークンを取得」を押してください。認可画面が出たら、利用するアカウントと許可の内容を確認して進めます。
表示されたトークンは、このあとGASの設定で使います。文字列をコピーしても、公開シートやチャットには貼り付けないでください。トークンは、アプリから広告データへアクセスするための認証情報です。Meta公式のAds Insights APIでも、広告実績の取得にads_readが必要と説明されています。
トークンを取得したら、有効期限も確認します。動画では60日という目安を説明していますが、すべてのトークンに同じ期限が付くわけではありません。Metaのアクセストークンツールから確認できる情報を開き、期限と付与された権限を確認してください。
Meta公式では、短期トークンは通常1〜2時間、長期トークンは通常約60日と説明される一方、早期に失効する場合や、時間による期限の扱いが異なるトークンもあります。日次実行を設定する前に、今回取得したトークンの状態を見ておきましょう。Meta公式:アクセストークン
手順3.スプレッドシートにGASを設定する
書き込み先からApps Scriptを開く
Googleスプレッドシートを新規作成し、「Meta広告レポート」などの名前を付けます。上部メニューの「拡張機能」→「Apps Script」を選んでください。
別タブでエディタが開いたら、プロジェクト名を「広告データ出力」などに変更します。新規プロジェクトの初期コードを、以下のGASのコード全体に置き換えます。既に業務用のコードがあるプロジェクトには、そのまま上書きしないでください。
コピーするGASコード全文
GASコード全文を開く
function fetchMultipleCampaigns() {
// ==================== 設定エリア ====================
var accessToken = '';
var adAccounts = {
'act_': ''
};
var daysBack = 7; // 取得日数
// ===================================================
try {
var today = new Date();
var startDate = new Date(today.getTime() - daysBack * 86400000);
var dateRange = {
since: startDate.toISOString().split('T')[0],
until: today.toISOString().split('T')[0]
};
Object.keys(adAccounts).forEach(function(adAccountId) {
fetchMetaAdsData(adAccountId, adAccounts[adAccountId], accessToken, dateRange);
});
} catch (e) {
Logger.log('エラー: ' + e.toString());
}
}
function fetchMetaAdsData(adAccountId, sheetName, accessToken, dateRange) {
var timeRange = encodeURIComponent(JSON.stringify(dateRange));
var apiUrl = 'https://graph.facebook.com/v24.0/' + adAccountId +
'/insights?fields=date_start,date_stop,campaign_name,adset_name,impressions,spend,actions,cpm,frequency' +
'&level=adset&time_increment=1&time_range=' + timeRange;
var options = {
method: 'get',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + accessToken },
muteHttpExceptions: true
};
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
} else {
sheet.clear();
}
sheet.appendRow(['Day','Campaign Name','Adset Name','Impressions','Link Clicks','Amount Spent','Results','CTR','CPC','Cost Per Result','CPM','Frequency']);
var url = apiUrl;
while (url) {
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
if (!data.data) break;
data.data.forEach(function(row) {
var getAction = function(type) {
return row.actions ? (row.actions.find(function(a) { return a.action_type === type; }) || {}).value || 0 : 0;
};
var linkClicks = getAction('link_click');
var results = getAction('lead') || getAction('purchase');
var ctr = linkClicks / (row.impressions || 1) * 100;
sheet.appendRow([
row.date_start,
row.campaign_name || '',
row.adset_name || '',
row.impressions || 0,
linkClicks,
row.spend || 0,
results,
ctr,
row.spend / (linkClicks || 1),
results > 0 ? row.spend / results : 'N/A',
row.cpm || 0,
row.frequency || 0
]);
});
url = data.paging ? data.paging.next : null;
}
}全体を貼り付けたあと、先頭の設定エリアを次の手順で書き換えます。接続するAPIのバージョンは、コード内のv24.0です。
トークン・広告アカウント・取得期間を入力する
コードの先頭にある「設定エリア」を書き換えます。ここで指定するのは、主に次の項目です。
| 項目 | 入力するもの | 確認する点 |
|---|---|---|
accessToken | Metaで取得したトークン | 引用符の内側に入れ、前後の空白や改行を混ぜない |
adAccounts | act_付きの広告アカウントIDと出力先タブ名 | ビジネスポートフォリオIDやアプリIDと取り違えない |
daysBack | さかのぼる日数 | 最初は7など短い期間で、取得結果の日付を確認する |
広告アカウントIDは、広告マネージャの画面上部にあるアカウント選択を開いて確認します。対象のアカウント名と、表示された広告アカウントIDを照合してください。複数のアカウントを扱っている場合も、最初は1つで動作を確かめます。
設定部分の記入例は次の形です。これは設定の説明用の抜粋で、実行に必要なコード全体ではありません。山括弧を含む仮の文字列を、自分の値に置き換えてください。
var accessToken = '<取得したトークン>';
var adAccounts = {
'act_<自分の広告アカウントID>': 'Meta広告'
};
var daysBack = 7;
右側のMeta広告は、スプレッドシート下部に並ぶタブの名前です。ファイル全体の名前と区別してください。複数アカウントを追加するときは、アカウントIDごとに別のタブ名を割り当てます。
このコードの日付は、toISOString()によるUTC基準です。daysBack = 7では「UTCの今日」と「7日前」を取得範囲として渡します。日本時間の昨日までの7日間を指定するコードではないので、実際に返された日付を見て、管理画面と比較する期間をそろえてください。日付はtime_increment=1で1日単位、集計はlevel=adsetで広告セット単位にしています。
GASの設定にトークンを記載する場合、コードを読める人はその値も読めます。作業用ファイルやプロジェクトの共有先を必要な担当者に絞り、AIへの相談やエラーの共有ではトークンを除いてください。
手順4.一度実行し、広告マネージャと数字を照合する
保存してから、Googleの権限確認を進める
エディタ上部の保存ボタンを押します。続いて、実行する関数の選択欄でfetchMultipleCampaignsを選び、「実行」を押してください。
初回はGoogleの承認が求められる場合があります。「権限を確認」から、スプレッドシートを管理するGoogleアカウントを選びます。対象のスクリプトと、外部サービスへの接続・シートへのアクセスなど、求められている権限を確認して承認します。配布元やコードの内容が分からない場合は、そのまま許可しないでください。
承認後、実行が始まらなければ、もう一度同じ関数を選んで「実行」を押します。実行ログを開き、エラーが出ていないかを確認します。
シートにデータが入り、条件が合っているかを見る
元のスプレッドシートに戻り、設定したタブを開きます。日付、キャンペーン名、広告セット名、表示回数、広告費などの列と、データ行が入っているか確認してください。
行が増えただけでは、取得の確認はまだ終わりではありません。広告マネージャでも同じアカウント・同じ日付を開き、まず広告費や表示回数など、照合しやすい項目を比べます。
- 取得したのは、意図した広告アカウントか。
- 期間と日付の区切り、タイムゾーンが合っているか。
- キャンペーン単位、広告セット単位など、比較する集計単位が同じか。
- クリックは「すべてのクリック」か「リンククリック」か。
- 成果は購入、リードなど、同じアクションを数えているか。
このコードの「Results」は、取得できたleadの値を優先し、それが採用されない場合にpurchaseの値を使う計算です。購入とリードを合算した数でも、広告マネージャの「結果」を自動判別した数でもありません。「Cost Per Result」も、このResultsを分母にしています。自分の広告で数えたい成果と一致するかを確認してください。
「CTR」はリンククリック数÷表示回数×100、「CPC」はリンククリックを基準とする計算です。リンククリックが0の行のCPCは、単価として使わないでください。この原稿のコードでは、0件の扱いによって広告費そのものなどが入る場合があります。管理画面と比べる際は、期間・成果の定義・アトリビューション設定をそろえます。Meta公式:Ads Insights APIの取得条件
このコードは毎回出力タブを初期化し、指定期間を取得し直す方式です。過去の全履歴が追記され続けるわけではありません。集計式やメモは、別のタブに置いてください。
また、APIの取得前にタブを初期化するため、認証エラーなどで取得に失敗すると、以前のデータが消えて見出し行だけになる場合があります。まず検証用ファイルで動かし、必要な過去データは別途保存してください。
手順5.毎日の自動実行を設定する
手動での取得が確認できたら、GASの左側にある時計アイコンの「トリガー」を開きます。右下の「トリガーを追加」を押してください。
「実行する関数」に、手動実行と同じfetchMultipleCampaignsを選びます。「実行するデプロイ」はHeadにします。
続いて、次のように設定します。
| 設定項目 | 選ぶ値の例 |
|---|---|
| イベントのソース | 時間主導型 |
| 時間ベースのトリガーのタイプ | 日付ベースのタイマー |
| 時刻 | 午前3時〜4時など、確認業務の前の時間帯 |
| エラー通知設定 | 担当者が確認できる頻度。実演では毎日通知 |
保存後、トリガーの一覧に関数名と「時間ベース」が表示されれば登録できています。
この設定は「毎日3時ちょうど」の予約ではありません。Googleの時間主導型トリガーは、指定した時間帯の中で実行時刻が調整されます。また、作成した人のアカウントで動くため、引き継ぎ時はその人の権限やトリガーの管理も確認してください。Google公式:インストール型トリガー
翌日は、Apps Scriptの「実行数」から実行時刻と結果を確認し、シートの対象日付も照合します。このコードは、APIの応答にdataがない場合に処理を終了し、例外もログに記録して終了します。実行が「完了」になっていても、データ取得の成功とは限りません。シートに必要な行が入ったかまで見ておきましょう。
データ更新が止まったときの確認順
一度設定したら、ずっと放置できるというわけではありません。トークンの期限や権限の変更、API側の仕様変更などで、取得が止まることがあります。
| 起きていること | 先に確認する場所 |
|---|---|
| 認証・トークンのエラーが出る | トークンの有効期限、失効、ads_readの付与状態。必要なら再取得し、GASの設定値を差し替える |
| 対象の広告アカウントへアクセスできない | 広告アカウントID、Facebookユーザーの権限、Metaアプリ側のアクセスレベル |
| シートに行が出ない | トークン・権限・対象期間・出力先タブ。このコードではAPIエラーがログに出ない場合もある |
| 手動では動くが毎朝更新されない | トリガーの有無、実行関数、時刻・タイムゾーン、作成者の権限 |
| 大量取得で途中から止まる | 実行時間やAPIの利用上限。まずアカウント数と期間を絞って切り分ける |
| 管理画面と数値が合わない | 期間、集計単位、クリック・成果の定義、アトリビューションの条件 |
掲載コードには、APIのエラー内容を必ず表示する処理や、失敗時に以前のシートを復元する処理は入っていません。取得できない状態が続く場合は、まず担当者にAPIの応答を確認してもらってください。
GASには実行時間やサービスごとの利用上限があります。長い期間を一度に取得して失敗するときは、短い期間で動くかを確かめてください。上限の詳細はGoogle公式の割り当てで確認できます。
トークンを更新したら、保存して手動実行し、取得できることまで確認します。「毎月交換しているから大丈夫」と考えるより、実際の期限と更新結果をセットで見る方が、停止に気づきやすくなります。
集めたデータを、AIでの比較・分析につなぐ
毎回データを転記しなくてよくなったら、次は数字を使うところです。たとえば、前週より費用が増えた広告セットを拾ったり、表示回数と成果の変化を並べたりする作業に、AIを使えます。
Synapse MCPのスプレッドシート接続では、指定したタブのセル値をAIから読めます。まず接続ガイドに沿って対象ファイルを接続し、小さな範囲を読ませて、ヘッダーと値が一致することを確かめます。この接続は読み取り用です。
最初の確認ができたら、次のように質問してみてください。これは活用のための質問例で、実際の分析結果ではありません。
- 接続した「Meta広告レポート」の「Meta広告」タブを確認してください。まずヘッダーと先頭の数行を読み、日付、広告費、広告セット名、成果の列を整理してください。成果の定義が分からなければ、集計前に私に確認してください。シートは変更しないでください。
- 同じ定義のデータがそろっている2つの7日間を、広告セット別に比較してください。各期間の広告費・表示回数・成果数と差分を表にし、数値から分かる事実と、追加で調べたい仮説を分けてください。期間のデータが不足していれば、その時点で伝えてください。
週ごとの比較には、比較対象の両期間が必要です。取得範囲が片方の週までしか含んでいなければ、比較はできません。このコードは出力タブを毎回初期化するため、両期間を含むように取得範囲を設定し、途中までの当日データを比較から除いてください。
CPAを見る場合は、行ごとのCPAを単純平均せず、広告費の合計を同じ定義の成果数で割ります。数字の見方はCPAが上がったときの確認手順でも説明しています。
正直、「API」と聞くと難しそうに感じますよね。でも、ここまで一緒に進めてみると、意外とできそうだと思ってもらえたのではないでしょうか。僕としては、集計やコピペに使っていた時間を、施策を考えたり、クリエイティブを磨いたりする時間に変えてもらえたらうれしいです。
ログイン後、利用する店舗・案件でスプレッドシートを接続し、AIへの接続設定を進めます。利用条件は料金ページで確認できます。
