非エンジニアがFacebook広告とGoogleスプレッドシートを連携してモニタリング業務を自動化する!
広告配信をしていると必ず必要になるのがモニタリング業務。自動で結果を吸い上げて統合してくれるBIツール的なものもいくつかありますが、どれもそこそこお値段がしますよね。(弊社もですが)結果的に、毎日運用担当者が管理画面からコピペしてきているのではないでしょうか?
今回はFacebook広告マネージャとGoogleスプレッドシートを自動連携して、モニタリング業務を自動化してみようと思います!
この記事はこんな人におすすめ!
・運用担当者が広告数値を毎日コピペするなど、無駄な工数を割いている
・人手で数値管理を行っているのでミスが起こってしまっている
・モニタリング頻度をあげたいのに面倒だからできない
・業務を自動化したいけど、コーディングなんてできない
1. どんな業務が楽になるのか
・毎日、管理画面にログインする
・毎日、配信結果をエクスポートする
・毎日、モニタリング用シートにコピペする、など
まずは出社したら朝一にこの作業を行うところからスタート。結構面倒な作業なんですよね。面倒なんで更新頻度をあまりあげられない。さらにコピペミスなどのヒューマンエラーで意思決定を誤る。
ということで、Facebook広告マネージャとスプレッドシートの自動連携を試みました。
いつもは、これらの数値を右上のレポートからCSVで抽出して
下記のフォーマットにペタペタ貼り付けていた作業を
毎朝自動で昨日分の結果を反映できるようにすることをゴールとします。
2. Google Apps Scriptで実装してみる
まずはいつも通り、"GAS"で頑張って実装してみます。
(コーディングできないので参考にならない!という方は、3. もっと簡単に、ノーコーディングで実装してみる!まで読み飛ばしてください!)
下記の記事を参考に作成しました。
2-1. Facebookの必要な情報を揃える
Facebook広告の情報を取得するために「キャンペーンID」と「Facebookアクセストークン」を用意する必要があります。
◆キャンペーンIDの取得
キャンペーンIDは広告マネージャから取得できます。
キャンペーンを選択して、右側の鉛筆のアイコンをクリック
キャンペーンの編集画面に遷移するので、右上のメニューから、IDをコピー
これでキャンペーンIDの取得は完了です。
◆Facebookアクセストークンの取得
下記を参考にアクセストークンを取得します。
アクセストークンの有効期限は60日のため、都度更新が必要です。(ちなみに後述のノンコーディングで設定する方法では不要です)
メンテナンスが必要なため、コード内に直接トークンを記入する方法ではなく、特定のGoogleスプレッドシートにアクセストークンを記載し、そこに取りに行くという方法にしました。(メンテのタイミングではそのスプレッドシートを更新する)
ファイル名を「Facebook_Access_Token」にして(ファイル名は後ほどGASで使います)A2セルに取得したアクセストークンを記載しております。
これで準備は完了です!
2-2. GASを書く!
モニタリング用のスプレッドシートの「ツール」メニューから「スクリプトディタ」を開く。
下記のコードをセット!
// アクセストークン
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 CAMPAIGN_ID = "ここにキャンペーンIDを入力";
// シート参照
var ss = SpreadsheetApp.getActiveSheet();
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 = ss.getRange(2, 1, 31, 1).getValues();// セルA2, A32取得
// 昨日の日付取得
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 < 31; 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;
}
}
// 広告のレポート取得
var response_ad = getReportByHttpRequest(yesterday, "spend,impressions,unique_clicks,ctr,cpc", CAMPAIGN_ID);
if(response_ad.getResponseCode() != 200) {
Logger.log("広告レポートを取得できませんでした");
}
var report_ad = getFacebookReport(response_ad);
if(report_ad["data"] != "") {
// サマリーシートに出力
ss.getRange("B" + target_row).setValue(report_ad["data"][0]["spend"]);
ss.getRange("C" + target_row).setValue(report_ad["data"][0]["impressions"]);
ss.getRange("D" + target_row).setValue(report_ad["data"][0]["unique_clicks"]);
ss.getRange("E" + target_row).setValue(report_ad["data"][0]["ctr"]);
ss.getRange("F" + target_row).setValue(report_ad["data"][0]["cpc"]);
} else {
Logger.log("広告レポートの値がありません");
}
}
広告マネージャから取得したい値の設定は、下記のパラメーターとフィールドを参照して設定しました。
トリガー設定から、イベントを「時間主導型」「日付ベース」にして実行するよう設定すれば完了!
3. もっと簡単に、ノンコーディングで実装してみる!
GASだと結構時間がかかりました。アクセストークンを定期的に更新しないといけないというのもなかなかヘビー。
と、いうことで、ここからが本番。弊社で開発したツールを使って、ノンコーディングでアプリケーションの連携+業務自動化を実現してみます。
おまけでSlackへの通知も行えるようにしてみました!
◆シートの準備
すでにモニタリングシートに記載されている日付を特定するのではなく、広告マネージャから日付ごと引っ張ってくる仕様にするため、スプレッドシート上の日付を消しました。
※GASで作成したスクリプトは赤枠に記載された日付をみて、反映する行を特定していました。
◆ 連携したいアプリケーションを選択する
Facebook広告とスプレッドシート、Slackを選択
◆ アクションの選択を行う
今回はFacebook広告の数値を毎朝取得するため
・アクション:データを取得する
を選択する。(トリガーは時間実行のため追って設定)
◆ キャンペーン選択まで完了したら抽出項目の選択を行う
Facebook広告から取得したい項目(=スプレッドシートに反映させたい項目)を選択する。
※この中には写りきっていませんが、「日付」も選択しています。
モニタリングするKPIが変更しても、ここの項目を設定し直すだけでOK!
これでFacebook広告の設定は完了!
◆ スプレッドシートのアクションを設定する
Facebook広告で取得したデータをスプレッドシートに反映するため、「セルに追加する」を選択。
◆ 反映するシートの選択まで完了したら行の指定を行う
カラム名が入っている行(1)から、反映を完了する行までを選択します。
今回は4月分反映するとして、31行目までを選択しました。
◆セルの選択をする
Facebook広告から取得した値をどのセル(カラム)に反映するかを選択します。1つ前の作業で範囲の指定を行ったことで、開始行(1行目)の項目ごとに設定できるようになっています。
この項目に、先ほどFacebook広告から取得した値をセットしていきます。
これでスプレッドシートの設定も完了です!
◆ Slackを設定する
Slackの設定は以前の記事と同様なので下記を参照ください。
◆ 実行時間を設定する
最後に本フローの実行時間を設定します。
頻度:毎日
時間:5:00(複数の時間を選択して1日に複数回実行することも可能)
以上で完了です!
およそ5分で簡単に設定完了!モニタリングするKPIを変更しても、「取得するデータ」「セルの選択」を少し編集すれば対応可能!
今回のケース以外にも、
・salesforceとマネーフォワードの連携
・スプレッドシートとクラウドサインの連携
・GmailとGoogle Driveの連携
などが簡単に実現できます!
「興味がある!」「使ってみたい!」という方、「こんなアプリケーション同士の連携はできないのか?」「こういうアプリケーションを使っているんだけど、どう連携したら業務が楽になるか?」といったご相談がある方、是非下記のページからお問い合わせください!
お問い合わせはこちらから!
自動化のお困りごとを解決するためのツール進化に活用させていただきます!