MENU

毎朝の広告数値転記をゼロにする。GASでスプレッドシート自動記録+Slack通知を3ステップで実装する方法

「ちょっと聞いてみたい」だけでもOK! ツールや業務効率化についての相談をすべて1対1で丁寧にお答えします。 まずはお気軽にメッセージをどうぞ!LINE公式アカウントはこちら!

毎朝、Google広告やMeta広告の管理画面を開いてインプレッション・クリック数・コンバージョンをスプレッドシートに転記している、という方はいませんか。その作業、1日15〜30分かかっているとしたら、月間で5〜10時間が「数値の書き写し」に消えている計算になります。

運用担当者がそこに時間を使う必要はありません。Google Apps Script(以下GAS)を使えば、数値の取得・記録・Slack通知をすべて自動化できます。

  • 毎朝の数値転記に10〜30分取られている
  • 転記ミスや報告漏れが月に何度かある
  • Slackに数値が届いたほうが上司やクライアントに伝えやすい

本記事では、GASで広告数値をスプレッドシートに自動記録してSlackに通知する仕組みを、コード例つきで3ステップに分けて解説します。地道ラボでは中小企業の現場にこうした自動化の土台を届けることを得意としており、「コードを書いたことがない」という方にも読み進めていただける内容を目指しています。


目次

GASとGoogle Ads Scriptsの違いを最初に整理する

実装の前に、混同しやすい2つのツールを整理しておきます。

「GAS(Google Apps Script)」はGoogleドキュメント・スプレッドシート・Gmailなどと連携して動くスクリプト環境です。 一方、「Google Ads Scripts」はGoogle広告の管理画面(ads.google.com)から動かすスクリプト環境で、広告キャンペーンのデータに直接アクセスできます。

比較軸GASGoogle Ads Scripts 動かす場所Googleスプレッドシート等の「拡張機能」メニューGoogle広告管理画面の「スクリプト」メニュー 得意なことGmail解析・スプレッドシート操作・Slack通知キャンペーン・入札戦略の自動操作 外部APIとの連携`UrlFetchApp`でSlack・LINE・Webhookに投げられる広告データの読み書きが中心 利用開始の敷居Googleアカウントがあれば即起動Google広告アカウントが必要

本記事で扱うのはGASです。「広告管理画面を開かずに数値をスプレッドシートへ記録してSlackへ送る」という用途であれば、GASが最も手軽に実現できます。

広告数値の取得方法には大きく2つのルートがあります。①Google Ads APIを直接叩く方法と、②広告媒体から届くレポートメールをGmailで受信してGASが解析する方法です。①は認証設定が複雑なため、本記事ではハードルが低い②のメール解析ルートを中心に解説します。

Google Ads APIを直接使う場合はOAuth 2.0の設定とAPI有効化が必要です。「Developer Token」の取得申請にも数日かかることがあるため、まず②のメール解析ルートで動かしてみるのがおすすめです。


Slackに通知するためのIncoming Webhookを先に用意する

コードを書き始める前に、Slack側の受け口を作っておきます。Incoming Webhookとは、外部のプログラムからSlackのチャンネルにメッセージを投げ込むためのURLのことです。

Slack AppでIncoming WebhookのURLを取得する手順

  1. https://api.slack.com/apps を開いて「Create New App」をクリックします
  2. 「From scratch」を選び、アプリ名(例:`AdReport`)とワークスペースを設定して作成します
  3. 左メニューの「Incoming Webhooks」を開き、「Activate Incoming Webhooks」をオンにします
  4. ページ下部の「Add New Webhook to Workspace」をクリックし、通知を送りたいチャンネルを選択します
  5. 表示されたWebhook URL(`https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ` の形式)をコピーして控えておきます

この作業は5〜10分で完了します。URLは他人に見せないよう注意してください。このURLを知っている人なら誰でもそのチャンネルに投稿できるからです。

Webhook URLはSlackチャンネルへの投稿権限と同じです。GitHubのパブリックリポジトリやスプレッドシートの閲覧共有には絶対に貼らないでください。GASのスクリプトプロパティ(後述)に保存するのが安全な管理方法です。


ステップ1:GASエディタでスクリプトを作成する

スプレッドシートを新規作成し、「拡張機能」→「Apps Script」を開きます。エディタ画面が起動したら、デフォルトで入っている`myFunction`を削除して、以下のコードを貼り付けます。


// 定数:スプレッドシートのシート名とSlack Webhook URL
const SHEET_NAME = '広告数値';
const WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');

function recordAdMetrics() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  if (!sheet) {
    Logger.log('シートが見つかりません:' + SHEET_NAME);
    return;
  }

  // Gmailからレポートメールを取得する
  const metrics = getMetricsFromMail();
  if (!metrics) {
    Logger.log('レポートメールが見つかりませんでした');
    return;
  }

  // スプレッドシートに追記する
  sheet.appendRow([
    new Date(),          // 記録日時
    metrics.impressions, // インプレッション
    metrics.clicks,      // クリック数
    metrics.conversions, // コンバージョン数
    metrics.cost         // 費用
  ]);

  // Slackに通知する
  sendToSlack(metrics);
}

function getMetricsFromMail() {
  // 当日分のレポートメールを件名で検索する(件名は媒体のレポート設定に合わせて変更してください)
  const query = 'subject:"Google広告レポート" newer_than:1d';
  const threads = GmailApp.search(query, 0, 1);
  if (threads.length === 0) return null;

  const body = threads[0].getMessages()[0].getPlainBody();

  // 正規表現で数値を抽出する(Google広告の標準レポートメール形式を想定)
  const impressionsMatch = body.match(/インプレッション[^\d]*([\d,]+)/);
  const clicksMatch      = body.match(/クリック数[^\d]*([\d,]+)/);
  const conversionsMatch = body.match(/コンバージョン[^\d]*([\d.]+)/);
  const costMatch        = body.match(/費用[^\d]*([\d,]+)/);

  if (!impressionsMatch) return null;

  return {
    impressions:  impressionsMatch[1].replace(/,/g, ''),
    clicks:       clicksMatch ? clicksMatch[1].replace(/,/g, '') : '0',
    conversions:  conversionsMatch ? conversionsMatch[1] : '0',
    cost:         costMatch ? costMatch[1].replace(/,/g, '') : '0'
  };
}

function sendToSlack(metrics) {
  const message = [
    '📊 *本日の広告数値*',
    `IMP: ${Number(metrics.impressions).toLocaleString()}`,
    `CT:  ${Number(metrics.clicks).toLocaleString()}`,
    `CV:  ${metrics.conversions}`,
    `費用: ¥${Number(metrics.cost).toLocaleString()}`
  ].join('\n');

  const payload = JSON.stringify({ text: message });
  UrlFetchApp.fetch(WEBHOOK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: payload
  });
}
GAS広告数値自動化の全体フロー図:媒体→GAS→スプレッドシート→Slack

コードを貼り付けたら、左上の「プロジェクト名」を「広告数値レポート」などに変更しておくと管理しやすくなります。

Webhook URLをスクリプトプロパティに保存する

セキュリティの観点から、Webhook URLはコードに直書きせず「スクリプトプロパティ」に保存します。

  1. GASエディタの左メニューから「プロジェクトの設定」(歯車アイコン)を開きます
  2. 「スクリプト プロパティ」の「プロパティを追加」をクリックします
  3. プロパティ名を `SLACK_WEBHOOK_URL`、値にSlackのWebhook URLを貼り付けて保存します

これで`PropertiesService.getScriptProperties().getProperty(‘SLACK_WEBHOOK_URL’)`の部分が安全に値を取得できるようになります。

スクリプトプロパティはGASのプロジェクトに紐づいた設定ストレージです。閲覧共有されたスプレッドシートからは見えないため、APIキーやWebhook URLの保存場所として適しています。


ステップ2:メール解析の正規表現を媒体に合わせてカスタマイズする

Google広告・Meta広告・Yahoo!広告など、媒体によってレポートメールの文面は異なります。正規表現の部分を自分の環境に合わせて調整することが、自動化を本番運用するうえで最も重要な作業です。

実際のメール本文から正規表現を作る手順

まず、普段届いているレポートメールをGmailで開き、「メッセージのソースを表示」でプレーンテキストを確認します。次に、数値の前後にどんな文字列があるかを確認して正規表現を作ります。

GASエディタでコードを入力する画面のイメージ

Meta広告のレポートメールで「リーチ数:12,345件」という形式が含まれているなら、正規表現は以下のようになります。


const reachMatch = body.match(/リーチ数[::\s]*([\d,]+)件/);

正規表現が意図通りに動いているか確認するには、GASエディタの「実行」→「関数を実行」から`getMetricsFromMail`だけを単独で呼び出し、`Logger.log`の出力を確認する方法が効率的です。


function testMailParsing() {
  const metrics = getMetricsFromMail();
  Logger.log(JSON.stringify(metrics, null, 2));
}

件名の検索クエリを媒体別に設定する

GmailApp.searchで使えるクエリは、Gmailの検索窓と同じ構文です。

媒体クエリ例 Google広告`subject:”Google広告” subject:”パフォーマンス” newer_than:1d` Meta広告`from:noreply@facebookmail.com subject:”広告レポート” newer_than:1d` Yahoo!広告`from:noreply@yahoo.com subject:”配信レポート” newer_than:1d` 複数媒体まとめて`subject:”広告レポート” newer_than:1d`

`newer_than:1d`で当日届いたメールに絞り込むことで、古いレポートを誤って重複取得するリスクを防げます。複数の媒体を扱っている場合は、`recordAdMetrics`関数を媒体ごとにコピーして、それぞれ別行にappendRowするか、別シートに分けて記録するのがおすすめです。

正規表現は「一致するパターンを探す」道具なので、メール本文の文言が媒体のアップデートで変わると動かなくなります。月に1回程度、テスト実行で取得できているか確認する習慣をつけておきましょう。


ステップ3:時間駆動トリガーで毎朝自動実行する

コードが完成したら、毎朝決まった時間に自動実行するトリガーを設定します。

トリガーの設定手順

  1. GASエディタの左メニューで「トリガー」(時計アイコン)をクリックします
  2. 右下の「トリガーを追加」ボタンをクリックします
  3. 設定項目を以下のように指定します
設定項目値 実行する関数を選択`recordAdMetrics` イベントのソースを選択時間主導型 時間ベースのトリガーのタイプを選択日タイマー 時刻を選択午前7時〜8時

レポートメールが届く時刻よりも後にトリガーを設定してください。 広告媒体のレポートメールは一般的に早朝4〜6時頃に届きますが、媒体や設定によって異なります。念のため午前8〜9時に設定しておくと安全です。

  1. 「保存」を押すと確認ダイアログが表示されるので、Googleアカウントのアクセスを許可します

許可画面で「このアプリはGoogleが確認していません」と表示されることがありますが、自分でコードを書いたスクリプトの場合は「詳細」→「安全ではないページに移動」から進めて問題ありません。

Slackチャンネルに届いた広告数値通知のイメージ

トリガーは1つのGoogleアカウントに紐づくため、担当者が退職・異動したときに止まります。チームのGoogleアカウント(共有アカウント)か、引き継ぎ者のアカウントに権限を移しておくことを推奨します。


よくある失敗パターンとエラー対処

自動化を本番稼働させる前に、よく起きるエラーを把握しておきましょう。

タイムアウトエラー(Exceeded maximum execution time)

GASの1回の実行時間は最大6分という制限があります。 メールの検索や複数媒体の処理が重なると超過することがあります。対処法は、処理を関数に分割して1回の実行で行う処理量を減らすこと、またはGmailの検索条件をより絞り込んでヒット件数を減らすことです。


// newer_than:1d だとタイムアウトするなら after: で日付を絞り込む
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const query = `subject:"広告レポート" after:${today}`;

認証エラー(Authorization required)

スクリプトプロパティへのアクセスやGmailへのアクセスが初回実行時に拒否されることがあります。GASエディタから手動で一度`recordAdMetrics`を実行して、権限許可のダイアログを通しておくと解消します。トリガー経由の自動実行は、この権限許可が完了していないと動きません。

Slack通知が届かない(エラーなしで失敗)

UrlFetchApp.fetchが成功したかどうかを確認するには、戻り値のステータスコードをログに出力します。


const response = UrlFetchApp.fetch(WEBHOOK_URL, options);
Logger.log('Slackレスポンス: ' + response.getResponseCode());
// 200が返れば成功

Webhook URLを無効化・再発行した場合は、スクリプトプロパティの値も更新が必要です。

GmailApp.searchで0件が返る

`newer_than:1d`は「24時間以内」の意味です。レポートメールが前日夜に届く場合、翌朝の実行では取得できないことがあります。`newer_than:2d`に変更するか、`after:` で日付を明示する方法に切り替えると確実に取得できます。

GASのメール検索はGmailの検索インデックスを使います。受信直後のメールはインデックス登録に数分かかることがあるため、レポートメールが届いてから30分以上の間隔を空けてトリガーを設定するのが安全です。


スプレッドシートに蓄積されたデータをLooker Studioに繋ぐ

毎朝のappendRowで数値が蓄積されてきたら、次のステップとしてLooker Studioでダッシュボード化する選択肢があります。Looker Studioは無料で使えるGoogleのBIツールで、スプレッドシートをデータソースとして接続するだけで、折れ線グラフや棒グラフのダッシュボードを作れます。

接続手順は「データを追加」→「Googleスプレッドシート」→ 対象のスプレッドシートを選ぶだけです。日付列を「ディメンション」に、インプレッション・クリック数を「指標」に設定すると、時系列グラフが自動で描画されます。

クライアントへの定期報告がある場合、Looker Studioの「レポートをスケジュール設定」機能を使えばPDFを自動でメール送信することもできます。転記→集計→報告の全工程を自動化できれば、担当者が作業に費やしていた時間を提案や分析に充てられます。

Looker Studioは「データポータル」という名称から2022年に改称されました。古い資料では「Googleデータポータル」と書かれている場合がありますが、同じサービスです。


実際の削減効果:1日15〜30分の回収が現実的な水準

転記作業に1日15分かかっているとすれば、月間で約5時間、年間では60時間相当の工数が自動化できる計算です。 これは広告運用担当者が分析・施策立案に使える時間に変わります。

人材・採用支援のDMP活用事例として、Googleが公開しているCustomer Storiesでは、マーケティング担当チームが手作業のデータ集計から解放されたことで、キャンペーンの改善サイクルが加速した事例が複数紹介されています。数値の転記と集計はツールに任せ、判断と改善に集中する、という考え方はどの規模の組織でも応用できます。

中小企業の広告運用では担当が1〜2名であることが多く、「転記に追われる→分析が後回し→改善が遅れる」というサイクルに陥りやすい環境です。GASによる自動化はその入口として、コスト0・準備1〜2時間で実装できる選択肢です。


まとめ:まずGASエディタを開いてみることから始めてください

広告数値のスプレッドシート転記は、GASで確実に自動化できます。本記事で紹介した実装は以下の3ステップです。

① Slack AppでIncoming Webhook URLを取得する

② GASエディタにスクリプトを貼り付け、スクリプトプロパティにWebhook URLを保存する

③ 時間駆動トリガーで毎朝自動実行するよう設定する

「GASを書いたことがない」という方でも、コードをコピーして正規表現の部分だけ自分のメール形式に合わせるところから始められます。まず一度、GASエディタを開いてコードを貼り付けてみてください。それだけで仕組みがどう動くかが見えてきます。


地道ラボに「広告数値 自動化」「GAS相談」と送ってください

毎朝の転記を止めてみたいと思った方は、ぜひ一歩踏み出してみてください。

「ちょっと聞いてみたい」だけでもOK! ツールや業務効率化についての相談をすべて1対1で丁寧にお答えします。 まずはお気軽にメッセージをどうぞ!LINE公式アカウントはこちら!

地道ラボでは、GASを使った業務自動化の無料相談をLINEで実施しています。「どこから手をつけるか」「自社の環境に合うか」を聞いたうえで、次の具体的なアクションをお伝えします。

申し込みはLINEで「広告数値 自動化」または「GAS相談」とメッセージを送るだけです。フォーム入力もメールも不要です。

大げさなコンサルティングではなく、明日から試せる具体的な一歩をお伝えするのが私たちのスタイルです。

転記ゼロの朝を、今日ここから踏み出しませんか。

次の一歩として、まずは「今使っているレポートメールの件名」を一つ教えてください。その件名から、GASの検索クエリと正規表現を具体的に提案します。


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次