Magicode logo
Magicode
9 min read

GAS でアクセス数集計(Google Analytics 編)

https://cdn.magicode.io/media/notebox/aac2fa82-6ad2-4544-a17e-cfe4ca2a5b80.jpeg
ウェブサービスを行っていると、アクセス数の集計などで表計算が活躍すると思います。 今回は Google Spreadsheet を使って、アクセス数を取得するようにしましょう。

Google Analytics について

Google Analytics は実際のアクセス数を測定するツールです。 クライアントスクリプトを仕込んで、ブラウザ側から、ここのサイトにアクセスしましたよと記録をつけます。 (環境、ブラウザ、設定によっては記録してくれない場合があります) これにより、ページビュー、クリック、購入を記録することができます。

Google Analytics の集計

集計を行う場合、表形式のレポートを出して、右上のエクスポートボタンから、出力形式を選ぶと、ダウンロードが始まります。 これをコピー貼り付け、インポート、何なりと行うわけですが、日常行うには大変手間です。 そこで、Google Spreadsheet の GAS を使って、API 経由でインポートできるようにしたいと思います。

スクリプト環境の準備

1.Google Spreadsheet の準備

2.使っている Analytics が何なのか把握

ユニバーサル以前と GA4 で変わってきます。
  • ユニバーサル以前の場合は「Analytics Reporting API」
  • GA4 の場合は「Google Analytics Data API」

3.記録用シートの準備

ここでは空のシート「Analytics Reporting API」「Google Analytics Data API」を作成しておきます。 プログラムで名前指定して使います。

4.Google Spreadsheet で Apps Script を起動する

「拡張機能」メニューに「Apps Script」がありますね。

Analytics Reporting API を使う場合の実装

1. ビュー ID の調査

Analytics のビュー ID を調べておきます。画面左上のアカウント、プロパティ、ビューの選択画面にありますね。

2. Analytics Reporting API ライブラリの選択

Apps Script から「サービス」右の+ボタンを押し、「Analytics Reporting API」を選択します。

3. Analytics Reporting API 実行コードの実装

Apps Script に移動し、コードを書きます。 最初の関数はテスト実行用関数にすることを推奨します。 この画面が最初に表示されたときに、デフォルトで選択されるのは、最初に認識された関数になります。 これが実行ショートカット「Ctrl+R」で実行される関数です。 不意に実行されても良いように、テスト関数を先に書いておきます。
function testAnalyticsResportingAPI() {
  // Analytics Reporting API を呼び出す。引数はビュー ID
  // 実行結果はログに記述
  console.log(getAnalyticsReportingAPI('123456789'))
}
function getAnalyticsReportingAPI(_viewID) {
  // 使いそうな値を定義しておく
  const DATA_RANGE = {
    sevenDaysAgo: '7DaysAgo',
    yesterday: 'yesterday'
  };
  const GA_FIELDS = {
    oneDayUsers: 'ga:1dayUsers',
    city: 'ga:city',
    clientId: 'ga:clientId',
    date: 'ga:date',
    dateHour: 'ga:dateHour',
    newUsers: 'ga:newUsers',
    users: 'ga:users',
    pageViews: 'ga:pageviews',
    screenViews: 'ga:screenViews',
    sessions: 'ga:sessions'
  };
  // 実行部分
  const res = AnalyticsReporting.Reports.batchGet({
    reportRequests: [{
      viewId: _viewID,
      // 日付範囲
      dateRanges: [{
        startDate: DATA_RANGE.sevenDaysAgo,
        endDate: DATA_RANGE.yesterday
      }],
      // まとめる項目
      dimensions: [
        { name: GA_FIELDS.dateHour }
      ],
      // データ部分
      metrics: [
        { expression: GA_FIELDS.users },
        { expression: GA_FIELDS.sessions },
        { expression:GA_FIELDS.pageViews }
      ],
      // 何で整列するか
      orderBys: [
        { fieldName: GA_FIELDS.dateHour }
      ]
    }]
  });
  return res.reports;
}
上記でざっと出ると思います。戻りはオブジェクト形式なので、結果を確認してテスト関数を書き換えます。
10:19:31	情報	[ { data: 
     { totals: [Object],
       rows: [Object],
       minimums: [Object],
       rowCount: 23,
       maximums: [Object] },
    columnHeader: { metricHeader: [Object], dimensions: [Object] } } ]
function test_AnalyticsReporting() {
  const sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Google Analytics Reporting API');
  // 引数はビュー ID
  const res = getAnalyticsReportingAPI('123456789');
  // 戻りのオブジェクトを配列に変換
  const ret = res[0].data.rows.map(function (_row) {
    return [].concat(_row.dimensions, _row.metrics[0].values);
  });
  // 整形後確認
  //console.log(ret);
  // 反映範囲確認
  //console.log(sht.getRange(1, 1, ret.length, ret[0].length).getA1Notation());
  sht.getRange(1, 1, ret.length, ret[0].length).setValues(ret);
}
また、初回実行時に権限確認が出てきます。こちらは連携するように画面を進めてください。 本当に大丈夫?のダイアログ。メールアドレスと Apps Script 名が合っていれば問題ありません。 「詳細」リンクから先に進めます。

Google Analytics Data API を使う場合の実装

1. プロパティ ID の調査

GA4 にはビュー ID の概念がありません。画面左上のアカウント、プロパティ、ビューの選択画面からプロパティ ID を調べておきます。

2. Google Analytics Data API ライブラリの選択

Apps Script から「サービス」右の+ボタンを押し、「Google Analytics Data API」を選択します。

3. Google Analytics Data API 実行コードの実装

Apps Script に移動し、コードを書きます。 同じことを書きますが、最初の関数はテスト実行用関数にすることを推奨します。 この画面が最初に表示されたときに、デフォルトで選択されるのは、最初に認識された関数になります。 これが実行ショートカット「Ctrl+R」で実行される関数です。 不意に実行されても良いように、テスト関数を先に書いておきます。
function testGoogleAnalyticsDataAPI() {
  // 引数はプロパティ ID
  const res = getGoogleAnalyticsDataAPI('123456789');
  // 結果をログに記述
  console.log(res);
}
function getGoogleAnalyticsDataAPI(_propertyID) {
  // GA4 のデータ取得
  // まとめる項目定義
  const dim = AnalyticsData.newDimension();
  dim.name = 'dateHour';
  // 取得データ定義
  const met1 = AnalyticsData.newMetric();
  met1.name = 'totalUsers';
  const met2 = AnalyticsData.newMetric();
  met2.name = 'sessions';
  const met3 = AnalyticsData.newMetric();
  met3.name = 'screenPageViews';
  // 整列順定義
  const ord = AnalyticsData.newOrderBy();
  ord.dimension = {
    dimensionName: 'dateHour'
  };
  // 日付範囲定義
  const rng = AnalyticsData.newDateRange();
  rng.startDate = '7daysAgo';
  rng.endDate = 'yesterday';
  // リクエストオブジェクト作成
  const req = AnalyticsData.newRunReportRequest();
  req.dimensions = [dim];
  req.metrics = [met1, met2, met3];
  req.dateRanges = rng;
  req.orderBys = [ord];
  // 実行
  return AnalyticsData.Properties.runReport(req, 'properties/{property}'.replace('{property}', _propertyID));
}
こちらも結果を確認しながらプロパティを調整し、テスト関数を変更します。
11:03:40	情報	Logging output too large. Truncating output. { metadata: { currencyCode: 'JPY', timeZone: 'Asia/Tokyo' },
  metricHeaders: 
   [ { name: 'totalUsers', type: 'TYPE_INTEGER' },
     { name: 'sessions', type: 'TYPE_INTEGER' },
     { name: 'screenPageViews', type: 'TYPE_INTEGER' } ],
  kind: 'analyticsData#runReport',
  rowCount: 167,
  dimensionHeaders: [ { name: 'dateHour' } ],
  rows: 
   [ { dimensionValues: [Object], metricValues: [Object] },
     { metricValues: [Object], dimensionValues: [Object] },
function testGoogleAnalyticsDataAPI() {
  const sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Google Analytics Data API');
  // 引数はプロパティ ID
  const res = getGoogleAnalyticsDataAPI('123456789');
  // データ確認
  console.log(res);
  // 戻りのオブジェクトを配列に変換
  const ret = res.rows.map(function (_row) {
    const ret = _row.dimensionValues;
    return ret.concat(_row.metricValues).map(function (_column) {
      return _column.value;
    }).join('\t');
  }).join('\n');
  // 整形後確認
  console.log(ret);
  // 反映範囲確認
  console.log(sht.getRange(1, 1, ret.length, ret[0].length).getA1Notation());
  sht.getRange(1, 1, ret.length, ret[0].length).setValues(ret);
}

Discussion

コメントにはログインが必要です。