Ccmmutty logo
Commutty IT
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 を使ってください。
  • GA4 の場合は「Google Analytics Data API」

3.記録用シートの準備

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

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

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

Analytics Reporting API を使う場合の実装

UA はサポート終了します。GA4 対応の Google Analytics Data 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.date }
      ],
      // データ部分
      metrics: [
        { expression: GA_FIELDS.users },
        { expression: GA_FIELDS.sessions },
        { expression:GA_FIELDS.pageViews }
      ],
      // 何で整列するか
      orderBys: [
        { fieldName: GA_FIELDS.date }
      ]
    }]
  });
  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 = 'date';
  // 取得データ定義
  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: 'date'
  };
  // 日付範囲定義
  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: 'date' } ],
  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

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