GASでGoogle Analyticsのデータを取得する

# 経緯
- GAでパラメータ付きのURLを合算して集計したかった
- 除外パラメータは設定前の遡及ができないため過去データを集計するために作成した
- [v4の公式ドキュメント](https://developers.google.com/analytics/devguides/reporting/core/v4/?hl=ja)が微妙＆日本語の情報が少なかったので備忘録として残す
- 自分用には [Query Explorer](https://ga-dev-tools.appspot.com/query-explorer/) で事足りるが事業部メンバー用に作成した

# 準備
こんな感じで設定シートを用意する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54083/8362f32a-ef2e-53aa-908f-25892c8e2f13.png)

スクリプトエディタを起動し、`リソース` > `Google の拡張サービス` を開く。
`Analytics Reporting API v4` を有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54083/b540979e-1644-8076-f8e6-005da110c8df.png)

# コード
```javascript:main.gs
var setting = SpreadsheetApp.getActive().getSheetByName('設定');
var viewId = setting.getRange(3, 3).getValue();
var startDate = Utilities.formatDate(setting.getRange(4, 3).getValue(), 'Asia/Tokyo', 'yyyy-MM-dd');
var endDate = Utilities.formatDate(setting.getRange(5, 3).getValue(), 'Asia/Tokyo', 'yyyy-MM-dd');
var filter = setting.getRange(6, 3).getValue();

function doGet() {
  getData(displayResults);
}

function getData(displayResults) {
  var data = AnalyticsReporting.Reports.batchGet({
    reportRequests: [{
      viewId: viewId,
      dateRanges: [{
        startDate: startDate,
        endDate: endDate
      }],
      metrics: [{
        expression: 'ga:pageviews',
      }],
      dimensions: [{name: 'ga:pagePath'}],
      filtersExpression: filter,
      orderBys: [{
        fieldName: 'ga:pagePath',
        sortOrder: 'ASCENDING'
      }],
      samplingLevel: 'LARGE',
//      pageToken: '100000',
      pageSize: '100000'
    }]
  });
  displayResults(data);
}

function displayResults(response) {
  if(!response.code) {
    var json = JSON.parse(response);
    var data = json.reports[0].data;
    Logger.log(json);
    
    // シート追加
    var sheetName = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMddHHmmss');
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);

    // ヘッダ
    sheet.getRange(1, 1).setValue('ページ');
    sheet.getRange(1, 2).setValue('PV');
    
    // データ作成
    var dataset = [];
    var begin = 2;
    var r = begin;
    data.rows.forEach(function(row) {
      var url = row.dimensions[0].replace(/\?.*$/g, '');
      var value = row.metrics[0].values[0];

      // 2行目以降かどうか
      if(r>begin) {
        // 前の行と同じURLの場合は合算する
        var prevRow = dataset[dataset.length-1];
        var regUrl = url.replace(/\?.*$/g, '');
        var prevUrl = prevRow[0];
        if(prevUrl === regUrl) {
          r--;
          prevRow[1] = Number(prevRow[1]) + Number(value);
        } else {
          dataset.push([url, value]);
        }
      } else {
          dataset.push([url, value]);
      }
      r++;
    });
    // データ出力
    sheet.getRange(begin, 1, dataset.length, 2).setValues(dataset);
    
  } else {
    Logger.log('エラーが発生しました', response.message);
  }
}
```

# スクリプトを割り当てる
設定シートのボタンにスクリプトを割り当てる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54083/6f935d15-715b-a5f1-a28c-b405dabd5736.png)

# 仕様
- 設定した条件に従いページ毎のPVを集計
- パラメータ付きのURLは合算する
- 抽出できる最大件数は10万件
- ページの昇順にソートして出力する
- 実行ボタン押下でデータ抽出＆集計シート挿入が行われる

# その他
[Reporting API v4](https://developers.google.com/analytics/devguides/reporting/core/v4/?hl=ja) にはページング機能があり、それを使えば10万件以上も取得可能。
今回は対象データの件数が少ないため実装していない。


以上