Google広告の日別の広告費をSlackに自動で投稿するスクリプト【コピペ可】

この記事の内容について、業務や開発でお困りの場合は個別に対応できます。

本記事は、Google AdsスクリプトとSlack APIを連携させ、前日分のキャンペーンデータを自動取得し、Slackへ通知するシステムの構築方法を解説する。コードはコピペするだけで利用可能な設計となっており、初心者でも簡単に設定できる点が魅力である。
キーワード:Google Adsスクリプト、Slack API、自動レポート、初心者向け、コピペ


はじめに

オンライン広告の運用において、タイムリーなレポートの作成は非常に重要である。広告キャンペーンのパフォーマンスを素早く把握し、改善に役立てるために、手動ではなく自動でレポートを取得し、Slackなどのチャットツールに通知できる仕組みを導入することが望ましい。
本記事では、コードをそのままコピペして必要な情報(Slack Botトークン、チャンネル名、Google Adsのクエリ条件など)を埋めるだけで利用できる仕組みを紹介する。


システムの全体像

本システムは以下の3つの主要な関数で構成される。

  1. main() 関数
    ・SlackのBotトークン、送信先チャンネル、タイムゾーンなどの基本設定を行い、前日分のキャンペーンデータを取得する。
    ・取得したデータを整形し、Slackに送信するためのメッセージを作成する。
  2. getGoogleAdsData() 関数
    ・Google Adsのキャンペーンパフォーマンスレポートから、前日の有効なキャンペーンデータ(Cost > 0)を抽出する。
    ・取得したCostは、カンマ除去後に数値変換を行い、各キャンペーン名とともに配列に格納する。
  3. 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);
  }
}

ZIDOOKA!

この記事の内容について、対応できます

この記事に関連する技術トラブルや開発上の問題について個別対応を行っています。

個別対応は3,000円〜 内容・工数により事前にお見積りします
最後までお読みいただきありがとうございました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AI活用に関するポリシー

当サイトでは、記事の執筆補助にAIを活用する場合がありますが、全面的な委任は行いません。