本記事は、Google AdsスクリプトとSlack APIを連携させ、前日分のキャンペーンデータを自動取得し、Slackへ通知するシステムの構築方法を解説する。コードはコピペするだけで利用可能な設計となっており、初心者でも簡単に設定できる点が魅力である。
キーワード:Google Adsスクリプト、Slack API、自動レポート、初心者向け、コピペ
はじめに
オンライン広告の運用において、タイムリーなレポートの作成は非常に重要である。広告キャンペーンのパフォーマンスを素早く把握し、改善に役立てるために、手動ではなく自動でレポートを取得し、Slackなどのチャットツールに通知できる仕組みを導入することが望ましい。
本記事では、コードをそのままコピペして必要な情報(Slack Botトークン、チャンネル名、Google Adsのクエリ条件など)を埋めるだけで利用できる仕組みを紹介する。
システムの全体像
本システムは以下の3つの主要な関数で構成される。
- main() 関数
・SlackのBotトークン、送信先チャンネル、タイムゾーンなどの基本設定を行い、前日分のキャンペーンデータを取得する。
・取得したデータを整形し、Slackに送信するためのメッセージを作成する。 - getGoogleAdsData() 関数
・Google Adsのキャンペーンパフォーマンスレポートから、前日の有効なキャンペーンデータ(Cost > 0)を抽出する。
・取得したCostは、カンマ除去後に数値変換を行い、各キャンペーン名とともに配列に格納する。 - sendMessageToSlack() 関数
・Slack APIのchat.postMessageエンドポイントを利用し、整形済みのメッセージを指定したチャンネルへ送信する。
・try-catch構文により、通信エラー発生時もログに記録される仕組みとなっている。
コード例
以下は、実際に利用可能なコード例である。必要な箇所(Slack Botトークン、チャンネルID、Google Adsのクエリ条件など)をコピペして編集するだけで、すぐに利用可能となっている。

function main() {
// SlackのBotトークンと送信先チャンネル(名前またはチャンネルID)を指定する
const slackBotToken = "xxxxxxxxxxxxx";
const slackChannel = "xxxxxxxxxxxx";
// タイムゾーンを大阪(日本標準時)に設定する
const timezone = "Asia/Tokyo";
// 現在日時を取得し、実行日の前日1日分のデータとする
const now = new Date();
const yesterday = new Date(now.getTime() - (24 * 60 * 60 * 1000)); // 昨日
const dateString = Utilities.formatDate(yesterday, timezone, "yyyy/MM/dd");
// キャンペーンデータを取得する(クエリは「DURING YESTERDAY」として昨日のみのデータを取得する)
const campaignData = getGoogleAdsData();
// 各キャンペーンのメッセージ行を作成する(Math.roundで四捨五入し、toLocaleStringで千位区切りのカンマを付加する)
const campaignMessages = campaignData
.map(campaign => `${campaign.name}:${Math.round(campaign.cost).toLocaleString("ja-JP")}円`)
.join("\n---\n");
// Slackへ送信するメッセージを作成する
const message = `${dateString}\n---\n${campaignMessages}\n---\n`;
// メッセージをSlackへ送信する
sendMessageToSlack(slackBotToken, slackChannel, message);
}
function getGoogleAdsData() {
// 昨日分のデータを取得するクエリ。Costはすでに円単位で出力される前提である
const query = [
"SELECT CampaignId, CampaignName, Cost",
"FROM CAMPAIGN_PERFORMANCE_REPORT",
"WHERE CampaignStatus = 'ENABLED'",
"AND Cost > 0",
"DURING YESTERDAY"
].join(" ");
const report = AdsApp.report(query);
const rows = report.rows();
const campaigns = [];
while (rows.hasNext()) {
const row = rows.next();
// 取得したCost文字列からカンマを除去してから数値に変換する
campaigns.push({
name: row["CampaignName"],
cost: parseFloat(row["Cost"].replace(/,/g, ""))
});
}
return campaigns;
}
/**
* SlackのチャンネルへBotを用いてメッセージを送信する関数である
* @param {string} token - Slack Botトークン
* @param {string} channel - Slackチャンネル名またはID
* @param {string} text - 送信するメッセージテキスト
*/
function sendMessageToSlack(token, channel, text) {
const url = "https://slack.com/api/chat.postMessage";
const payload = {
channel: channel,
text: text
};
const options = {
method: "post",
contentType: "application/json; charset=utf-8",
headers: {
"Authorization": "Bearer " + token
},
payload: JSON.stringify(payload)
};
try {
const response = UrlFetchApp.fetch(url, options);
Logger.log(response.getContentText());
} catch (error) {
Logger.log("Slackへのメッセージ送信に失敗した: " + error);
}
}