47
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Facebook広告APIによるKPI計測の自動化

Last updated at Posted at 2017-01-30

対象

  • Facebook広告(Facebook広告マネージャ)を利用し、KPIを計測している
  • Googleスプレッドシートに、KPIを手入力もしくは広告マネージャからエキスポートしたデータをコピペしている

目標

  • デイリーで、GoogleスプレッドシートにKPIを自動的に計測する

前提

  • 前日(00:00~23:59)のKPIが対象
  • 1日1度のみ自動的に計測(例:出社前の時間など)
  • KPI取得のため利用するFacebook広告APIのバージョンは現時点での最新であるv2.8とする

おおまかな手順

  1. Facebookアクセストークンの取得
  2. Facebook広告キャンペーンIDの確認
  3. GAS(Google Apps Script)とFacebook広告APIを利用して、Facebook広告KPIをサマリーシートに出力
  4. GASの実行をスケジュール化

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

  1. Facebookアクセストークンを取得します。Facebookアクセストークン取得手順の詳細は、Facebook公式サイトを参照ください。私はこちらの日本語サイトがわかりやすかったので参考にさせていただきました。
    なお指定するパーミッション(scope)は、ads_managementを指定します。パーミッション一覧はこちらを参考ください。
  2. 「Facebook_Access_Token」Googleスプレッドシートを作成します。カラムは以下の通りです。
A B
1 Access Token
2 取得したFacebookアクセストークン
... ...

なおアクセストークンには有効期限があるため定期的な更新が必要です。有効期限の確認は、Facebook公式のデバッグツールから確認可能です。

Facebook広告キャンペーンIDの確認

  1. Facebook広告マネージャにログインします。

  2. 「メニュー→パワーエディタ」を選択します。
    sc_facebook_manager.png

  3. ページ右側の鉛筆アイコンを選択します。

  4. キャンペーンIDを確認することができます。そのIDをメモします。
    sc_facebook_manager_cpid.png

GAS(Google Apps Script)とFacebook広告APIを利用して、Facebook広告KPIをサマリーシートに出力

「Daily_Facebook_Like_KPI_2017」、「Daily_Facebook_Install_KPI_2017」Googleスプレッドシートを作成します。カラムは以下の通りです。

Daily_Facebook_Like_KPI_2017シート

A B C E E F G H I J K L M
1 Facebook Page Like KPI
2 Date date_start date_stop campaign_id campaign_name like reach spend clicks unique_clicks ctr cpm Cost / Results
3 2017/01/01 =H3/F3
4 2017/01/02 =H4/F4
5 2017/01/03 =H5/F5
... ...
367 2017/12/31 =H367/F367

Daily_Facebook_Install_KPI_2017シート

A B C E E F G H I J K L M
1 Facebook App Install KPI
2 Date date_start date_stop campaign_id campaign_name install reach spend clicks unique_clicks ctr cpm Cost / Results
3 2017/01/01 =H3/F3
4 2017/01/02 =H4/F4
5 2017/01/03 =H5/F5
... ...
367 2017/12/31 =H367/F367

次にGASを作成します。
メニュー「ツール>スクリプト エディタ...」を選択します。

以下、サマリーシートに、KPIを出力するためのGASコードです。なお具体的なGASの記法などはリファレンスやググれば色々参考となるサイトが見つかるので、そちらを参照ください。

Code.gs
// Facebook Access Token
var ACCESS_TOKEN = "";

function getReportByHttpRequest(today, fields, campaign_id){
  var payload =
      {
        "time_range" : "{'since':'" + today + "','until':'" + today + "'}",
        "fields" : fields,
        "access_token" : ACCESS_TOKEN
      };
  
  var options =
      {
        "method" : "POST",
        "payload" : payload
      };
  
  return UrlFetchApp.fetch("https://graph.facebook.com/v2.8/" + campaign_id + "/insights", options);
}

function getProgressByHttpRequest(report_run_id){
  var url = "https://graph.facebook.com/v2.8/" + report_run_id + "?access_token=" + ACCESS_TOKEN;
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response);
  return json["async_percent_completion"];
}

function getFacebookReport(response) {
  var json = JSON.parse(response);
  var report_run_id = json["report_run_id"];
  Logger.log(report_run_id);

  // 広告APIの取得結果は非同期なため進行状況を定期的に確認する
  var progress_percentage = getProgressByHttpRequest(report_run_id);
  Logger.log(progress_percentage);
  // 進行状況が100%未満の場合は、10秒スリープし、再度進行状況を確認する
  while (progress_percentage < 100) {
    Utilities.sleep(10000);
    progress_percentage = getProgressByHttpRequest(report_run_id);
    Logger.log(progress_percentage);
  }
  
  var url = "https://graph.facebook.com/v2.8/" + report_run_id + "/insights?access_token=" + ACCESS_TOKEN;
  var response = UrlFetchApp.fetch(url);
  json = JSON.parse(response);
  return json;
}

function kpiFunction() {
  // キャンペーンID
  var APP_INSTALL_CAMPAIGN_ID = "";
  var PAGE_LIKE_CAMPAIGN_ID = "";
  // シート参照
  var sheet_Daily_facebook_install_KPI_2017 = SpreadsheetApp.getActive().getSheetByName('Daily_Facebook_Install_KPI_2017');
  var sheet_Daily_facebook_like_KPI_2017 = SpreadsheetApp.getActive().getSheetByName('Daily_Facebook_Like_KPI_2017');
  var sheet_Facebook_Access_Token = SpreadsheetApp.getActive().getSheetByName('Facebook_Access_Token');
  // シート上のFacebookアクセストークンと日付を取得
  ACCESS_TOKEN = sheet_Facebook_Access_Token.getRange("A2").getValue();
  var value_total_date = sheet_Daily_facebook_install_KPI_2017.getRange(3, 1, 365, 1).getValues();// セルA3, A368取得
  // 昨日の日付取得
  var yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  yesterday = Utilities.formatDate(new Date(yesterday), "JST", "yyyy-MM-dd");
  
  // サマリーデータの出力対象となる行を取得
  var target_row = 0;
  var date;
  for(i = 0; i < 365; i++){
    date = Utilities.formatDate(new Date(value_total_date[i]), "JST", "yyyy/MM/dd");
    if(yesterday == date){// KPI計測対象日は昨日の日付
      // KPIデータ出力対象となる行:+1(ヘッダ分-1:昨日の日付)
      target_row = i + 1;
      break;
    }
  }
  
  // Facebook App Install広告のレポート取得
  var response_install = getReportByHttpRequest(yesterday, "date_start,date_stop,campaign_id,campaign_name,reach,spend,clicks,unique_clicks,ctr,cpm,actions", APP_INSTALL_CAMPAIGN_ID);
  if(response_install.getResponseCode() != 200) {
    Logger.log("Facebook App Install広告レポートを取得できませんでした");
  }
  var report_install = getFacebookReport(response_install);
  
  // Facebook Like広告のレポート取得
  var response_like = getReportByHttpRequest(yesterday, "date_start,date_stop,campaign_id,campaign_name,reach,spend,clicks,unique_clicks,ctr,cpm,actions", PAGE_LIKE_CAMPAIGN_ID);
  if(response_like.getResponseCode() != 200) {
    Logger.log("Facebook Like広告レポートを取得できませんでした");
  }
  var report_like = getFacebookReport(response_like);
    
  if(report_install["data"] != "") {
    // App Install KPIをサマリーシートに出力
    sheet_Daily_facebook_install_KPI_2017.getRange("B" + target_row).setValue(report_install["data"][0]["date_start"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("C" + target_row).setValue(report_install["data"][0]["date_stop"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("D" + target_row).setValue(report_install["data"][0]["campaign_id"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("E" + target_row).setValue(report_install["data"][0]["campaign_name"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("F" + target_row).setValue(report_install["data"][0]["actions"][4]["value"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("G" + target_row).setValue(report_install["data"][0]["reach"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("H" + target_row).setValue(report_install["data"][0]["spend"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("I" + target_row).setValue(report_install["data"][0]["clicks"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("J" + target_row).setValue(report_install["data"][0]["unique_clicks"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("K" + target_row).setValue(report_install["data"][0]["ctr"]);
    sheet_Daily_facebook_install_KPI_2017.getRange("L" + target_row).setValue(report_install["data"][0]["cpm"]);
  } else {
    Logger.log("Facebook App Install広告レポートの値がありません");
  }
  
  if(report_like["data"] != "") {
    // Page Like KPIをサマリーシートに出力
    sheet_Daily_facebook_like_KPI_2017.getRange("B" + target_row).setValue(report_like["data"][0]["date_start"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("C" + target_row).setValue(report_like["data"][0]["date_stop"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("D" + target_row).setValue(report_like["data"][0]["campaign_id"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("E" + target_row).setValue(report_like["data"][0]["campaign_name"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("F" + target_row).setValue(report_like["data"][0]["actions"][4]["value"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("G" + target_row).setValue(report_like["data"][0]["reach"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("H" + target_row).setValue(report_like["data"][0]["spend"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("I" + target_row).setValue(report_like["data"][0]["clicks"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("J" + target_row).setValue(report_like["data"][0]["unique_clicks"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("K" + target_row).setValue(report_like["data"][0]["ctr"]);
    sheet_Daily_facebook_like_KPI_2017.getRange("L" + target_row).setValue(report_like["data"][0]["cpm"]);
  } else {
    Logger.log("Facebook Like広告レポートの値がありません");
  }
}

以下キャンペーンIDは、広告マネージャで確認したIDを指定してください。

  // キャンペーンID
  var APP_INSTALL_CAMPAIGN_ID = "";
  var PAGE_LIKE_CAMPAIGN_ID = "";

指定するAPIのパラメータ(parameters)に関する詳細情報は、こちらのFacebook公式リファレンスを参考ください。

  var payload =
      {
        "time_range" : "{'since':'" + today + "','until':'" + today + "'}",
        "fields" : fields,
        "access_token" : ACCESS_TOKEN
      };

指定するAPIのフィールド(fields)に関する詳細情報は、こちらのFacebook公式リファレンスを参考ください。

// Facebook App Install広告のレポート取得
  var response_install = getReportByHttpRequest(yesterday, "date_start,date_stop,campaign_id,campaign_name,reach,spend,clicks,unique_clicks,ctr,cpm,actions", APP_INSTALL_CAMPAIGN_ID);
// Facebook Like広告のレポート取得
  var response_like = getReportByHttpRequest(yesterday, "date_start,date_stop,campaign_id,campaign_name,reach,spend,clicks,unique_clicks,ctr,cpm,actions", PAGE_LIKE_CAMPAIGN_ID);

KPIレポートの作成は、非同期でFacebook側で行われるため定期的に進行状況を問い合わせ、進行状況を確認する必要があります。そして、レポートの作成が完了後に、そのレポートIDを指定し、広告KPIを取得します。
詳細情報は、こちらのFacebook公式リファレンスを参考ください。

// 広告APIの取得結果は非同期なため進行状況を定期的に確認する
  var progress_percentage = getProgressByHttpRequest(report_run_id);
  Logger.log(progress_percentage);
  // 進行状況が100%未満の場合は、10秒スリープし、再度進行状況を確認する
  while (progress_percentage < 100) {
    Utilities.sleep(10000);
    progress_percentage = getProgressByHttpRequest(report_run_id);
    Logger.log(progress_percentage);
  }

なおもし該当のキャンペーンを実施していない場合はKPIは出力されません。

GASの実行をスケジュール化

GASのスケジュール化は、以前記事にしているのでこちらを参照ください。

47
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?