Google Apps Script(GAS)を使ってFacebook広告の費用などをGoogleスプレッドシートに自動転記する手順について、詳細に解説します。以下は、GASでFacebook Ads APIとGoogle Sheets APIを利用する流れです。
目次
Facebook Ads APIのセットアップ
Facebook Developerアカウントの作成
- Facebook for Developersにアクセスして、開発者アカウントを作成します(未作成の場合)。
アプリの作成
- Facebook for Developersのダッシュボードで「Create App」(アプリを作成)をクリック。
- 「Manage Business Integrations」を選択し、アプリの名前や目的を設定して作成します。
Facebook Ads APIの有効化
- アプリ作成後、アプリのダッシュボードで「アプリの製品」から「Marketing API」を追加します。
- 「マーケティングAPI」を追加したら、アプリ内でアクセストークンを取得する必要があります。
今回取得するトークンは短期有効のトークンのため、後ほど長期有効なトークンへ変更します。
Facebook Ads APIのアクセストークン取得
- アプリの設定から「ツール」に移動し、「アクセス トークンツール」を開きます。
- Facebook広告アカウントに対する権限を持つユーザーアクセストークンを生成します。
- 必要なパーミッション(例:
ads_read
)を設定し、トークンをコピーします。
GASの設定
Googleスプレッドシートの準備
- Googleスプレッドシートを作成し、広告データを格納するシートを用意します。
Google Apps Scriptの設定
- Googleスプレッドシートのメニューから「拡張機能」 > 「Apps Script」を開きます。
- 新しいスクリプトプロジェクトを作成し、以下のようなコードを入力します。
- トークンは直接コードに記入せず、スプレッドシートに記入します。自動更新する際に便利なためです。
// スプレッドシートからアクセストークンを取得する関数
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のアクセストークンを長期有効なトークンに更新するための手順です。
長期有効なアクセストークンの取得手順
- Facebook Developerアカウントでアプリ作成
- まず、Facebook for Developersにアクセスし、必要なアプリを作成しておく必要があります。これは、既に設定している場合は省略できます。
- 短期アクセストークンの取得
- 短期のアクセストークンは有効期限が短く(通常は1〜2時間)、これを使って長期トークンを取得するためのステップです。
- Graph API Explorerにアクセスします。
- 使用するFacebookアプリを選択し、
ads_read
やbusiness_management
など、必要な権限を選択します。 - 「アクセストークンを取得」ボタンをクリックし、短期アクセストークンを生成します。
- 生成されたトークンをメモしておきます(後で使用)。
- 短期トークンを長期トークンに変換
- 短期トークンを取得したら、それを長期トークンに変換します。長期トークンの有効期限は最大60日です。
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
が新しい長期アクセストークンです。
- 長期アクセストークンの保存・管理
- 長期アクセストークンは約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('トークンはまだ有効です。');
}
}
コメント