【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. プロジェクトの作成
- Google Cloud Console にアクセスします。
- GBPを管理しているGoogleアカウントでログインしてください。
- 画面左上のプロジェクト選択プルダウンから「新しいプロジェクト」をクリックします。
- プロジェクト名(例:
GBP-Auto-Report)を入力し、「作成」を押します。
2. APIの有効化
GBPのAPIは機能ごとに細分化されています。レポート作成には以下のAPIを有効化する必要があります。
- 左メニュー「APIとサービス」>「ライブラリ」を選択。
- 検索窓で以下の名称を検索し、それぞれ「有効にする」をクリックします。
- 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. 同意画面の設定
- 左メニュー「APIとサービス」>「OAuth同意画面」をクリック。
- User Type で 「外部(External)」 を選択し「作成」。
- ※Google Workspaceをご利用で、社内のみで使う場合は「内部」でも可。
- アプリ情報を入力します。
- アプリ名:
GBP Report Toolなど - ユーザーサポートメール: ご自身のアドレス
- デベロッパーの連絡先: ご自身のアドレス
- アプリ名:
- 「保存して次へ」進みます。
2. スコープの設定
「スコープを追加または削除」をクリックし、フィルタで「business」と検索。以下の権限にチェックを入れます。
https://www.googleapis.com/auth/business.manage
3. テストユーザーの登録(重要テクニック)
ここが最大のポイントです。通常、APIを外部公開するにはGoogleの厳しい審査(英語での申請やデモ動画の提出)が必要です。
しかし、自社や特定のクライアントのためだけに使う場合は、「テストユーザー」として登録したGoogleアカウントのみが使える状態 にすることで、審査を回避して即時利用が可能になります。
- 「テストユーザー」の画面で「+ ADD USERS」をクリック。
- このツールを利用する(GBP権限を持つ)Googleアカウントのメールアドレスを登録します。
【Step 3】認証情報(クライアントID)の発行
- 左メニュー「認証情報」をクリック。
- 「+ 認証情報を作成」>「OAuthクライアントID」を選択。
- アプリケーションの種類:「ウェブ アプリケーション」。
- 名前:任意の名前(例:
GAS Client)。 - 「承認済みのリダイレクト URI」 は、一旦空欄のままで「作成」をクリックします。
- ※後ほどGAS側で発行されるURLをここに戻ってきて貼り付ける必要があります。
- ポップアップで表示される 「クライアントID」 と 「クライアントシークレット」 を必ずメモしておいてください。
【Step 4】GoogleスプレッドシートとGASの準備
- 新規スプレッドシートを作成します。
- シート名を 「Daily_Metrics」 に変更します。
- メニューの「拡張機能」>「Apps Script」をクリックしてエディタを開きます。
OAuth2ライブラリの導入
API認証を簡単にするためのライブラリを導入します。
- エディタ左側の「ライブラリ」の「+」をクリック。
- スクリプトID欄に以下を入力して検索・追加します。
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMkdKE1qtjZOpPLrS2385
【Step 5】自動化スクリプトの実装(サンプルコード)
以下のコードをコピーして、GASのエディタに貼り付けてください。
このコードは、「前日の閲覧数・検索数・アクション数」を取得してスプレッドシートに追記する 基本的な機能を持っています。
※コード内の CLIENT_ID と CLIENT_SECRET は、Step3で取得したものに書き換えてください。
/**
* 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の仕上げ
- GASエディタ右上の「デプロイ」>「新しいデプロイ」を選択。
- 種類「ウェブアプリ」、アクセス「自分のみ」でデプロイ。
- ウェブアプリURLではなく、エディタのURLにある スクリプトID をコピーします。
https://script.google.com/home/projects/{ここの文字列}/edit
- GCPのコンソール(Step3の画面)に戻り、「承認済みのリダイレクトURI」に以下を設定して保存します。
https://script.google.com/macros/d/{スクリプトID}/usercallback
【Step 6】自動更新トリガーの設定
最後に、このスクリプトが毎日自動で動くように設定します。
- GASエディタ左メニューの「トリガー(時計マーク)」をクリック。
- 「+ トリガーを追加」。
- 実行する関数:
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(一本化)」を是非ご利用ください。



