【MEO担当者必見】Googleビジネスプロフィールのレポート作成をAPIで自動化する方法【GASサンプルコード付】

MEO対策(ローカルSEO)において、日々のデータ集計にどれだけの時間を費やしていますか?

「毎日管理画面を開き、インサイトの数字をExcelに手入力する」

「クライアントへの報告用に、月末に慌ててグラフを作る」

もしあなたがこうした「作業」に追われているなら、それはMEOの本質的な施策を行う時間を失っているのと同じです。

Googleが公式に提供している Google Business Profile API と、無料のプログラミング環境 Google Apps Script (GAS) を組み合わせれば、これらのデータ集計は100%自動化できます。

本記事では、エンジニアである筆者が、GBPの日次データをスプレッドシートに自動蓄積するシステムの構築方法を解説します。

※なお、本記事で紹介するのは「基礎的な日次データ取得」のコードです。検索キーワードの詳細分析や、過去データの復元(バックフィル)、Looker Studioによる高度なダッシュボード構築については、記事末尾のご案内をご覧ください。

なぜ手動レポートは限界なのか

Googleビジネスプロフィールの管理画面(パフォーマンス)は、視覚的に分かりやすい反面、実務においてはいくつかの「致命的な弱点」があります。

  • データの保存期間: 過去のデータを長期間遡って比較するのが難しい。
  • 外部データとの統合不可: Google広告やGoogleアナリティクスのデータと横並びで比較できない。
  • CSVダウンロードの手間: 店舗数が多い場合、1店舗ずつダウンロードして加工するのは現実的ではない。

API連携を行えば、スプレッドシートにデータが「データベース」として蓄積されます。一度仕組みを作れば、あとは完全に放置でOKです。


【Step 1】Google Cloud Platform (GCP) のプロジェクト設定

APIを利用するためには、Googleのクラウド基盤であるGCPでの設定が必須です。エンジニアでない方には少しハードルが高いかもしれませんが、手順通りに進めれば大丈夫です。

1. プロジェクトの作成

  1. Google Cloud Console にアクセスします。
  2. GBPを管理しているGoogleアカウントでログインしてください。
  3. 画面左上のプロジェクト選択プルダウンから「新しいプロジェクト」をクリックします。
  4. プロジェクト名(例: GBP-Auto-Report)を入力し、「作成」を押します。

2. APIの有効化

GBPのAPIは機能ごとに細分化されています。レポート作成には以下のAPIを有効化する必要があります。

  1. 左メニュー「APIとサービス」>「ライブラリ」を選択。
  2. 検索窓で以下の名称を検索し、それぞれ「有効にする」をクリックします。
  • Google My Business Account Management API
    • (店舗のアカウント情報を取得するために必要)
  • Google My Business Business Information API
    • (店舗の住所やID情報を取得するために必要)
  • Google Business Profile Performance API
    • (閲覧数やアクション数などのインサイトデータを取得するために必要)

【プロの視点】

以前は Google My Business API という一つのAPIでしたが、現在は廃止され、上記のように機能が分割されています。ネット上の古い記事のままだと動かないケースが多いため注意が必要です。


【Step 2】OAuth同意画面と「審査」の壁

APIを使って店舗データにアクセスするには、セキュリティ認証(OAuth)の設定が必要です。

1. 同意画面の設定

  1. 左メニュー「APIとサービス」>「OAuth同意画面」をクリック。
  2. User Type で 「外部(External)」 を選択し「作成」。
    • ※Google Workspaceをご利用で、社内のみで使う場合は「内部」でも可。
  3. アプリ情報を入力します。
    • アプリ名: GBP Report Tool など
    • ユーザーサポートメール: ご自身のアドレス
    • デベロッパーの連絡先: ご自身のアドレス
  4. 「保存して次へ」進みます。

2. スコープの設定

「スコープを追加または削除」をクリックし、フィルタで「business」と検索。以下の権限にチェックを入れます。

  • https://www.googleapis.com/auth/business.manage

3. テストユーザーの登録(重要テクニック)

ここが最大のポイントです。通常、APIを外部公開するにはGoogleの厳しい審査(英語での申請やデモ動画の提出)が必要です。

しかし、自社や特定のクライアントのためだけに使う場合は、「テストユーザー」として登録したGoogleアカウントのみが使える状態 にすることで、審査を回避して即時利用が可能になります。

  1. 「テストユーザー」の画面で「+ ADD USERS」をクリック。
  2. このツールを利用する(GBP権限を持つ)Googleアカウントのメールアドレスを登録します。

【Step 3】認証情報(クライアントID)の発行

  1. 左メニュー「認証情報」をクリック。
  2. 「+ 認証情報を作成」>「OAuthクライアントID」を選択。
  3. アプリケーションの種類:「ウェブ アプリケーション」。
  4. 名前:任意の名前(例: GAS Client)。
  5. 「承認済みのリダイレクト URI」 は、一旦空欄のままで「作成」をクリックします。
    • ※後ほどGAS側で発行されるURLをここに戻ってきて貼り付ける必要があります。
  6. ポップアップで表示される 「クライアントID」「クライアントシークレット」 を必ずメモしておいてください。

【Step 4】GoogleスプレッドシートとGASの準備

  1. 新規スプレッドシートを作成します。
  2. シート名を 「Daily_Metrics」 に変更します。
  3. メニューの「拡張機能」>「Apps Script」をクリックしてエディタを開きます。

OAuth2ライブラリの導入

API認証を簡単にするためのライブラリを導入します。

  1. エディタ左側の「ライブラリ」の「+」をクリック。
  2. スクリプトID欄に以下を入力して検索・追加します。1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMkdKE1qtjZOpPLrS2385

【Step 5】自動化スクリプトの実装(サンプルコード)

以下のコードをコピーして、GASのエディタに貼り付けてください。

このコードは、「前日の閲覧数・検索数・アクション数」を取得してスプレッドシートに追記する 基本的な機能を持っています。

※コード内の CLIENT_IDCLIENT_SECRET は、Step3で取得したものに書き換えてください。

JavaScript
/**
 * GBP日次レポート自動化スクリプト(Basic版)
 * 機能: 店舗の日次インサイトデータ(検索数・アクション数)の取得
 */

// ==========================================
// 1. 設定エリア
// ==========================================
// Step3で取得したIDとシークレットをここに貼り付けてください
const CLIENT_ID = 'ここにクライアントIDを貼り付け';
const CLIENT_SECRET = 'ここにクライアントシークレットを貼り付け';

// データ保存先のシート名
const SHEET_NAME_METRICS = 'Daily_Metrics';

// ==========================================
// 2. メニュー作成
// ==========================================
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('⚡️ GBP管理')
    .addItem('日次データを手動更新', 'updateDaily')
    .addToUi();
}

/**
 * メイン処理:前日のデータを取得してシートに保存
 */
function updateDaily() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  prepareSheet(ss); // シート準備

  // 取得対象日:前日(Googleの集計ラグを考慮する場合は2-3日前推奨)
  const targetDate = new Date();
  targetDate.setDate(targetDate.getDate() - 3); // 確実性を重視して3日前に設定

  console.log(`🔄 データ取得開始: 対象日 ${formatDate(targetDate)}`);

  const service = getService();
  if (!service.hasAccess()) {
    showAuthAlert(service);
    return;
  }

  // アカウント・店舗情報の取得
  const accounts = fetchAccounts(service);
  if (!accounts) return;

  accounts.forEach(account => {
    const locations = fetchLocations(service, account.name);
    if (locations) {
      locations.forEach(location => {
        fetchAndSaveMetrics(service, location, targetDate);
      });
    }
  });
  
  SpreadsheetApp.getActiveSpreadsheet().toast('更新が完了しました', '完了');
}

// ==========================================
// 3. データ取得ロジック
// ==========================================
function fetchAndSaveMetrics(service, location, date) {
  // 期間指定(1日分)
  const range = `dailyRange.startDate.year=${date.getFullYear()}&dailyRange.startDate.month=${date.getMonth() + 1}&dailyRange.startDate.day=${date.getDate()}&dailyRange.endDate.year=${date.getFullYear()}&dailyRange.endDate.month=${date.getMonth() + 1}&dailyRange.endDate.day=${date.getDate()}`;
  
  // 取得する指標(PC/スマホの地図・検索表示回数、アクション数)
  const metrics = [
    'BUSINESS_IMPRESSIONS_DESKTOP_MAPS', 'BUSINESS_IMPRESSIONS_DESKTOP_SEARCH',
    'BUSINESS_IMPRESSIONS_MOBILE_MAPS', 'BUSINESS_IMPRESSIONS_MOBILE_SEARCH',
    'WEBSITE_CLICKS', 'CALL_CLICKS', 'BUSINESS_DIRECTION_REQUESTS'
  ];
  
  let rowData = {
    date: formatDate(date),
    location: location.title,
    id: location.name
  };
  
  // 各指標をAPIで取得
  metrics.forEach(metric => {
    const url = `https://businessprofileperformance.googleapis.com/v1/${location.name}:fetchMultiDailyMetricsTimeSeries?${range}&dailyMetrics=${metric}`;
    try {
      const response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + service.getAccessToken() }, muteHttpExceptions: true });
      if (response.getResponseCode() === 200) {
        const json = JSON.parse(response.getContentText());
        // レスポンスの解析
        let value = 0;
        if (json.multiDailyMetricTimeSeries) {
          json.multiDailyMetricTimeSeries.forEach(m => {
            if (m.dailyMetricTimeSeries) {
              m.dailyMetricTimeSeries.forEach(s => {
                if (s.timeSeries && s.timeSeries.datedValues) {
                  s.timeSeries.datedValues.forEach(v => {
                    value = parseInt(v.value || 0);
                  });
                }
              });
            }
          });
        }
        rowData[metric] = value;
      }
    } catch (e) {
      console.error(e);
      rowData[metric] = 0;
    }
  });

  // シートへの書き込み
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME_METRICS);
  sheet.appendRow([
    rowData.date, rowData.location, rowData.id,
    rowData.BUSINESS_IMPRESSIONS_DESKTOP_MAPS, rowData.BUSINESS_IMPRESSIONS_DESKTOP_SEARCH,
    rowData.BUSINESS_IMPRESSIONS_MOBILE_MAPS, rowData.BUSINESS_IMPRESSIONS_MOBILE_SEARCH,
    rowData.WEBSITE_CLICKS, rowData.CALL_CLICKS, rowData.BUSINESS_DIRECTION_REQUESTS
  ]);
}

// ==========================================
// 4. 共通関数・認証設定
// ==========================================
function fetchAccounts(service) {
  const url = 'https://mybusinessaccountmanagement.googleapis.com/v1/accounts';
  const response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + service.getAccessToken() }, muteHttpExceptions: true });
  return JSON.parse(response.getContentText()).accounts;
}

function fetchLocations(service, accountName) {
  const url = `https://mybusinessbusinessinformation.googleapis.com/v1/${accountName}/locations?readMask=name,title,storeCode`;
  const response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + service.getAccessToken() }, muteHttpExceptions: true });
  return JSON.parse(response.getContentText()).locations;
}

function prepareSheet(ss) {
  let sheet = ss.getSheetByName(SHEET_NAME_METRICS);
  if (!sheet) sheet = ss.insertSheet(SHEET_NAME_METRICS);
  if (sheet.getLastRow() === 0) {
    sheet.appendRow([
      '日付', '店舗名', '店舗ID', 
      'PC地図表示', 'PC検索表示', 'スマホ地図表示', 'スマホ検索表示', 
      'ウェブサイト', '通話', 'ルート検索'
    ]);
    sheet.setFrozenRows(1);
  }
}

function getService() {
  return OAuth2.createService('GBP')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://oauth2.googleapis.com/token')
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('https://www.googleapis.com/auth/business.manage');
}

function authCallback(request) {
  const service = getService();
  const authorized = service.handleCallback(request);
  return HtmlService.createHtmlOutput(authorized ? '認証成功!' : '認証失敗');
}

function showAuthAlert(service) {
  const html = HtmlService.createHtmlOutput(`<a href="${service.getAuthorizationUrl()}" target="_blank">👉 認証する</a>`).setWidth(300).setHeight(100);
  SpreadsheetApp.getUi().showModalDialog(html, '認証が必要です');
}

function formatDate(date) { return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`; }
JavaScript

リダイレクトURIの仕上げ

  1. GASエディタ右上の「デプロイ」>「新しいデプロイ」を選択。
  2. 種類「ウェブアプリ」、アクセス「自分のみ」でデプロイ。
  3. ウェブアプリURLではなく、エディタのURLにある スクリプトID をコピーします。
    • https://script.google.com/home/projects/{ここの文字列}/edit
  4. GCPのコンソール(Step3の画面)に戻り、「承認済みのリダイレクトURI」に以下を設定して保存します。
    • https://script.google.com/macros/d/{スクリプトID}/usercallback

【Step 6】自動更新トリガーの設定

最後に、このスクリプトが毎日自動で動くように設定します。

  1. GASエディタ左メニューの「トリガー(時計マーク)」をクリック。
  2. 「+ トリガーを追加」。
  3. 実行する関数:updateDaily、イベントのソース:時間主導型、タイプ:日付ベース、時刻:午前 6時〜7時

これで設定は完了です!毎日自動的にデータが蓄積されていきます。


さらに高度な分析を目指す方へ(ここからが本番です)

今回ご紹介したコードは、あくまで「日々の基本データを取得する」ための基礎的なものです。

MEO対策を本格的に行い、競合に差をつけるためには、さらに以下のようなデータと分析基盤が必要になります。

① 検索キーワードの詳細分析(APIの壁)

Googleマップで「どんな言葉で検索されたか」を知ることは極めて重要ですが、APIでキーワードを取得するには非常に複雑な実装が必要です。

  • Googleのプライバシー基準(足切りライン)の回避ロジック
  • 特殊なAPIエンドポイントの使用とパラメータ調整

② 口コミデータのスコアリング

単に口コミを見るだけでなく、「平均評点の推移」や「新規口コミ数のアラート」を自動化するには、別のAPI(My Business Reviews API)との連携が必要です。

③ 過去データの完全復元(バックフィル)

今回のコードは「導入した翌日」からのデータしか溜まりません。「過去1年分のデータを取り込んで分析したい」という場合、API制限(Quota)を考慮した特殊なバッチ処理プログラムが必要になります。

④ Looker Studioによる「Google広告」との統合レポート

スプレッドシートに溜めたGBPデータと、Google広告のデータを1枚のレポートに統合し、「Web集客全体のCPA(顧客獲得単価)」を可視化するダッシュボード構築も可能です。


まとめ:自動化の先にあるもの

GBPのレポート自動化は、技術的には可能ですが、APIの仕様変更への対応やエラー処理など、維持管理には専門的な知識が求められます。

もし、

「設定が難しそうで不安だ」

「検索キーワードや口コミも含めた完全版のレポートが欲しい」

「Google広告と連携した統合ダッシュボードを作ってほしい」

このようにお考えの方は、ぜひ一度お問い合わせください。

弊社では、過去データの復元からLooker Studioでのダッシュボード構築までを含めた「MEOレポート完全自動化パッケージ」 を提供しております。

煩雑なデータ集計はシステムに任せ、貴社のビジネスを加速させるための「分析と施策」に時間を使いませんか?

(MEOレポート自動化について、とお書き添えください)

 


作業の手順がわからない、WEB関連の課題をひとまとめに解決したいという方へ

動画制作・ホームページ制作・広告運用代行など、WEBの課題を一本化しませんか?

弊社サービス「IPPONka(一本化)」を是非ご利用ください。

一本化(IPPONka)の詳細はこちら

一本化(IPPONka)すると、話が早い。WEBの課題を一本化。