Meta広告をGASで自動でGoogleスプレッドシートに記入

Google Apps Script(GAS)を使ってFacebook広告の費用などをGoogleスプレッドシートに自動転記する手順について、詳細に解説します。以下は、GASでFacebook Ads APIとGoogle Sheets APIを利用する流れです。

目次

Facebook Ads APIのセットアップ

Facebook Developerアカウントの作成

  • Facebook for Developersにアクセスして、開発者アカウントを作成します(未作成の場合)。

アプリの作成

  1. Facebook for Developersのダッシュボードで「Create App」(アプリを作成)をクリック。
  2. 「Manage Business Integrations」を選択し、アプリの名前や目的を設定して作成します。

Facebook Ads APIの有効化

  1. アプリ作成後、アプリのダッシュボードで「アプリの製品」から「Marketing API」を追加します。
  2. 「マーケティングAPI」を追加したら、アプリ内でアクセストークンを取得する必要があります。

今回取得するトークンは短期有効のトークンのため、後ほど長期有効なトークンへ変更します。

Facebook Ads APIのアクセストークン取得

  1. アプリの設定から「ツール」に移動し、「アクセス トークンツール」を開きます。
  2. Facebook広告アカウントに対する権限を持つユーザーアクセストークンを生成します。
  3. 必要なパーミッション(例: ads_read)を設定し、トークンをコピーします。

GASの設定

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

  • Googleスプレッドシートを作成し、広告データを格納するシートを用意します。

Google Apps Scriptの設定

  1. Googleスプレッドシートのメニューから「拡張機能」 > 「Apps Script」を開きます。
  2. 新しいスクリプトプロジェクトを作成し、以下のようなコードを入力します。
  3. トークンは直接コードに記入せず、スプレッドシートに記入します。自動更新する際に便利なためです。
// スプレッドシートからアクセストークンを取得する関数
function facebook_getAccessToken() {
  var sheet = SpreadsheetApp.openById('スプレッドシートID').getSheetByName('トークン管理');
  return sheet.getRange(1, 1).getValue(); // 1行目1列目からトークンを取得
}

// 前日のデータを取得するために日付を取得
function facebook_getYesterdayDate() {
  var yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  var year = yesterday.getFullYear();
  var month = ('0' + (yesterday.getMonth() + 1)).slice(-2);  // 月を2桁に
  var day = ('0' + yesterday.getDate()).slice(-2);  // 日を2桁に
  return year + '-' + month + '-' + day;
}

// Facebook Ads APIからすべてのキャンペーンIDを取得する関数
function facebook_getCampaignIds() {
  var accessToken = facebook_getAccessToken();  // スプレッドシートからアクセストークンを取得
  var adAccountId = 'Facebook広告アカウントID';  // Facebook広告アカウントID
  var apiVersion = 'v21.0';  // 使用するAPIのバージョン

  var url = `https://graph.facebook.com/${apiVersion}/act_${adAccountId}/campaigns?fields=id,name&access_token=${accessToken}`;

  var response = UrlFetchApp.fetch(url);
  var jsonData = JSON.parse(response.getContentText());

  return jsonData.data;
}

// キャンペーンごとに広告データを取得する関数
function getFacebookAdsDataForCampaign(campaignId) {
  var accessToken = facebook_getAccessToken();  // スプレッドシートからアクセストークンを取得
  var apiVersion = 'v21.0';  // 使用するAPIのバージョン
  var yesterday = facebook_getYesterdayDate();  // 前日の日付を取得

  // 指定されたキャンペーンIDのデータを取得するURL
  var url = `https://graph.facebook.com/${apiVersion}/${campaignId}/insights?fields=campaign_name,clicks,spend,impressions,ctr,cpc,actions&time_range[since]=${yesterday}&time_range[until]=${yesterday}&access_token=${accessToken}`;
  
  var response = UrlFetchApp.fetch(url);
  var jsonData = JSON.parse(response.getContentText());

  return jsonData.data;
}

// 取得した広告データをスプレッドシートにキャンペーンごとに書き込む関数
function facebook_writeFacebookAdsDataToSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('facebook'); // '広告レポート' シートを指定
  var lastRow = sheet.getLastRow();  // 最終行を取得

  // ヘッダー行を設定(必要に応じてカスタマイズ)
  if (lastRow === 0) {
    sheet.getRange(1, 1).setValue('Day');
    sheet.getRange(1, 2).setValue('Campaign name');
    sheet.getRange(1, 3).setValue('Clicks (all)');
    sheet.getRange(1, 4).setValue('Results');
    sheet.getRange(1, 5).setValue('Amount spent');
    sheet.getRange(1, 6).setValue('Impressions');
    sheet.getRange(1, 7).setValue('CTR (all)');
    sheet.getRange(1, 8).setValue('CPC (All)');
    lastRow = 1;  // ヘッダーの次からデータを書き込む
  }

  // 全キャンペーンIDを取得
  var campaigns = facebook_getCampaignIds();

  // 各キャンペーンのデータを取得して書き込む
  for (var c = 0; c < campaigns.length; c++) {
    var campaignId = campaigns[c].id;
    var campaignName = campaigns[c].name;  // ここで campaignName を取得
    var adsData = getFacebookAdsDataForCampaign(campaignId);

    for (var i = 0; i < adsData.length; i++) {
      var clicks = adsData[i].clicks;
      var spend = adsData[i].spend;
      var impressions = adsData[i].impressions;
      var ctr = adsData[i].ctr;
      var cpc = adsData[i].cpc;
      var actions = adsData[i].actions || [];  // コンバージョンや結果データ
      var results = '';  // 結果が複数ある場合の処理

      // actions に複数の結果が含まれている場合、そのうちの"conversion"などを探す
      for (var j = 0; j < actions.length; j++) {
        if (actions[j].action_type === 'offsite_conversion') {
          results = actions[j].value;
          break;
        }
      }

      // 日付を取得
      var yesterday = facebook_getYesterdayDate();

      // 新しい行にデータを追加
      lastRow++;
      sheet.getRange(lastRow, 1).setValue(yesterday);  // 日付
      sheet.getRange(lastRow, 2).setValue(campaignName);  // キャンペーン名
      sheet.getRange(lastRow, 3).setValue(clicks);  // クリック数
      sheet.getRange(lastRow, 4).setValue(results);  // 結果(コンバージョンなど)
      sheet.getRange(lastRow, 5).setValue(spend);  // 費用
      sheet.getRange(lastRow, 6).setValue(impressions);  // インプレッション数
      sheet.getRange(lastRow, 7).setValue(ctr);  // CTR
      sheet.getRange(lastRow, 8).setValue(cpc);  // CPC
    }
  }
}

トリガー設定

上記のコードをトリガーで日時指定すれば完了です。

Facebookのアクセストークンには、短期トークン長期トークンがあり、長期トークンを取得することで、APIの呼び出しを長期的に利用できます。以下は、Facebookのアクセストークンを長期有効なトークンに更新するための手順です。

長期有効なアクセストークンの取得手順

  1. Facebook Developerアカウントでアプリ作成
    • まず、Facebook for Developersにアクセスし、必要なアプリを作成しておく必要があります。これは、既に設定している場合は省略できます。
  2. 短期アクセストークンの取得
    • 短期のアクセストークンは有効期限が短く(通常は1〜2時間)、これを使って長期トークンを取得するためのステップです。
    短期トークンの取得方法:
    1. Graph API Explorerにアクセスします。
    2. 使用するFacebookアプリを選択し、ads_readbusiness_managementなど、必要な権限を選択します。
    3. 「アクセストークンを取得」ボタンをクリックし、短期アクセストークンを生成します。
    4. 生成されたトークンをメモしておきます(後で使用)。
  3. 短期トークンを長期トークンに変換
    • 短期トークンを取得したら、それを長期トークンに変換します。長期トークンの有効期限は最大60日です。
    長期トークンに変換するためのURL(APIリクエスト):makefileコードをコピーする
  4. https://graph.facebook.com/v21.0/oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}& client_secret={app-secret}& fb_exchange_token={short-lived-token}
    • client_id: アプリのID(Facebook for Developersで確認可能)client_secret: アプリのシークレット(Facebook for Developersの「アプリ」 > 「設定」 > 「基本情報」で確認可能)fb_exchange_token: 取得した短期トークン
    https://graph.facebook.com/v21.0/oauth/access_token? grant_type=fb_exchange_token& client_id=123456789012345& client_secret=your_app_secret& fb_exchange_token=your_short_lived_token
    • このURLにアクセス(ブラウザまたはAPIツールを使用)すると、長期アクセストークンが返されます。返されるレスポンスには以下のような内容が含まれます。
    { "access_token": "your_long_lived_token", "token_type": "bearer", "expires_in": 5184000 }
    • access_tokenが新しい長期アクセストークンです。
  5. 長期アクセストークンの保存・管理
    • 長期アクセストークンは約60日間有効ですが、期限が切れる前に再取得する必要があります。自動化する場合は、このトークンを適切に管理し、トークンの更新をスクリプトで定期的に行うのが理想です。

トークンの更新方法(自動化)

トークンの有効期限が60日程度なので、スクリプトを自動化して、トークンの期限が切れる前に新しいトークンを取得する仕組みを作成することができます。たとえば、以下のようなフローで実現できます。

以下のコードのdailyCheckAndRefreshTokenを週1で確認することでトークンが14日前になると自動で更新されます。


function saveAccessToken(token) {
  var sheet = SpreadsheetApp.openById('スプレッドシートID').getSheetByName('トークン管理');
  sheet.getRange(1, 1).setValue(token); // 1行1列目にトークンを保存
}

function loadAccessToken() {
  var sheet = SpreadsheetApp.openById('スプレッドシートID').getSheetByName('トークン管理');
  return sheet.getRange(1, 1).getValue(); // 1行1列目からトークンを取得
}


function checkTokenExpiration(token) {
  var appId = 'アプリID';  // アプリIDを指定
  var appSecret = 'アプリシークレット';  // アプリシークレットを指定
  
  // アクセストークンの検証URL
  var url = `https://graph.facebook.com/debug_token?input_token=${token}&access_token=${appId}%7C${appSecret}`;

  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  
  var expirationTime = json.data.expires_at; // UNIXタイムスタンプで有効期限を取得
  var expirationDate = new Date(expirationTime * 1000); // 日付に変換
  
  Logger.log('トークンの有効期限: ' + expirationDate);
  return expirationDate;
}


function refreshAccessToken() {
  var clientId = 'アプリID';
  var clientSecret = 'アプリシークレット';
  var shortLivedToken = loadAccessToken(); // 現在のトークンを取得

  var url = `https://graph.facebook.com/v21.0/oauth/access_token?grant_type=fb_exchange_token&client_id=${clientId}&client_secret=${clientSecret}&fb_exchange_token=${shortLivedToken}`;

  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  
  var newToken = json.access_token; // 新しいトークン
  saveAccessToken(newToken); // 新しいトークンを保存
  Logger.log('新しいトークンを取得しました: ' + newToken);
}


function dailyCheckAndRefreshToken() {
  var token = loadAccessToken(); // 現在のトークンを取得
  var expirationDate = checkTokenExpiration(token); // トークンの有効期限を確認
  
  var now = new Date();
  var daysUntilExpiration = (expirationDate - now) / (1000 * 60 * 60 * 24); // 有効期限までの日数を計算
  
  if (daysUntilExpiration < 14) { // 14日未満ならトークンを更新
    Logger.log('トークンの有効期限が近づいています。トークンを更新します。');
    refreshAccessToken(); // トークンを更新
  } else {
    Logger.log('トークンはまだ有効です。');
  }
}

設定周りで悩んだら、お気軽にご相談ください。
問合せの際は「web担当者を見た」とお伝えください。

この記事を書いた人

デジタルマーケティングに16年間従事しているMITSUIです。Google AnalyticsとGoogle Tag Managerが大好きで、これらのツールを活用した情報提供を行っています。ブログではデジタルマーケティングに関する情報や最新のトレンド、ベストプラクティスを紹介しています。

コメント

コメントする

CAPTCHA


目次