Google Apps Script (GAS) で Google Analytics API を使ってみた

## GAS から Analytics の API が叩けるらしい。
まずは[ドキュメント](https://developers.google.com/apps-script/advanced/analytics)を確認する。
`Management API` と `Reporting APIs` が GAS から利用可能らしい。
早速使ってみる。

## Management API
まずは `Management API` のサンプルコードを動かしてみる。
コピペして動かす前にはサービスに `Google Analytics API` を追加しておくことが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190942/378be717-55f4-2481-f6b1-93d053b09b16.png)


```
/**
 * Lists Analytics accounts.
 */
function listAccounts() {
  var accounts = Analytics.Management.Accounts.list();
  if (accounts.items && accounts.items.length) {
    for (var i = 0; i < accounts.items.length; i++) {
      var account = accounts.items[i];
      Logger.log('Account: name "%s", id "%s".', account.name, account.id);

      // List web properties in the account.
      listWebProperties(account.id);
    }
  } else {
    Logger.log('No accounts found.');
  }
}

/**
 * Lists web properites for an Analytics account.
 * @param  {string} accountId The account ID.
 */
function listWebProperties(accountId) {
  var webProperties = Analytics.Management.Webproperties.list(accountId);
  if (webProperties.items && webProperties.items.length) {
    for (var i = 0; i < webProperties.items.length; i++) {
      var webProperty = webProperties.items[i];
      Logger.log('\tWeb Property: name "%s", id "%s".', webProperty.name,
          webProperty.id);

      // List profiles in the web property.
      listProfiles(accountId, webProperty.id);
      }
  } else {
    Logger.log('\tNo web properties found.');
  }
}

/**
 * Logs a list of Analytics accounts profiles.
 * @param  {string} accountId     The Analytics account ID
 * @param  {string} webPropertyId The web property ID
 */
function listProfiles(accountId, webPropertyId) {
  // Note: If you experience "Quota Error: User Rate Limit Exceeded" errors
  // due to the number of accounts or profiles you have, you may be able to
  // avoid it by adding a Utilities.sleep(1000) statement here.

  var profiles = Analytics.Management.Profiles.list(accountId,
      webPropertyId);
  if (profiles.items && profiles.items.length) {
    for (var i = 0; i < profiles.items.length; i++) {
      var profile = profiles.items[i];
      Logger.log('\t\tProfile: name "%s", id "%s".', profile.name,
          profile.id);
    }
  } else {
    Logger.log('\t\tNo web properties found.');
  }
}
```

`listAccounts()` を実行するとそのまま動いてくれる。
デバッグでブレークさせて中身と [Analytics のドキュメント](https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/accounts/list#javascript)を照らし合わせてみた。
やはり、`GAS` サービスで API をラップして使いやすくしているだけで中身は同じようだ。
プロパティの名前は Analytics のドキュメントを確認すれば困らなそう。

## Reporting APIs
つづいて Reporting のほう。
どっちかというとこっちがメインかも。
AppsScript で Spreadsheet とか Site を組み合わせてお手軽データまとめサイトが作れそう。
上のコードに引っ付けてこんな感じにして、`listAccounts()` を実行すると、自分のアカウントに紐ついてるページの情報を新しい Spreadsheet に書き出してくれる。
サンプルでは直近１週間を取得していたが面白みがないので３ヶ月にしてみた。

```
/**
 * Lists Analytics accounts.
 */
function listAccounts() {
  var accounts = Analytics.Management.Accounts.list();
  if (accounts.items && accounts.items.length) {
    for (var i = 0; i < accounts.items.length; i++) {
      var account = accounts.items[i];
      Logger.log('Account: name "%s", id "%s".', account.name, account.id);

      // List web properties in the account.
      listWebProperties(account.id);
    }
  } else {
    Logger.log('No accounts found.');
  }
}

/**
 * Lists web properites for an Analytics account.
 * @param  {string} accountId The account ID.
 */
function listWebProperties(accountId) {
  var webProperties = Analytics.Management.Webproperties.list(accountId);
  if (webProperties.items && webProperties.items.length) {
    for (var i = 0; i < webProperties.items.length; i++) {
      var webProperty = webProperties.items[i];
      Logger.log('\tWeb Property: name "%s", id "%s".', webProperty.name,
          webProperty.id);

      // List profiles in the web property.
      listProfiles(accountId, webProperty.id);
      }
  } else {
    Logger.log('\tNo web properties found.');
  }
}

/**
 * Logs a list of Analytics accounts profiles.
 * @param  {string} accountId     The Analytics account ID
 * @param  {string} webPropertyId The web property ID
 */
function listProfiles(accountId, webPropertyId) {
  // Note: If you experience "Quota Error: User Rate Limit Exceeded" errors
  // due to the number of accounts or profiles you have, you may be able to
  // avoid it by adding a Utilities.sleep(1000) statement here.

  var profiles = Analytics.Management.Profiles.list(accountId,
      webPropertyId);
  if (profiles.items && profiles.items.length) {
    for (var i = 0; i < profiles.items.length; i++) {
      var profile = profiles.items[i];
      Logger.log('\t\tProfile: name "%s", id "%s".', profile.name,
          profile.id);
      runReport(profile.id);  // Add
    }
  } else {
    Logger.log('\t\tNo web properties found.');
  }
}


/**
 * Runs a report of an Analytics profile ID. Creates a sheet with the report.
 * @param  {string} profileId The profile ID.
 */
function runReport(profileId) {
  var today = new Date();
  //var oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
  var oneWeekAgo = new Date(today.getTime() - 90 * 24 * 60 * 60 * 1000);

  var startDate = Utilities.formatDate(oneWeekAgo, Session.getScriptTimeZone(),
      'yyyy-MM-dd');
  var endDate = Utilities.formatDate(today, Session.getScriptTimeZone(),
      'yyyy-MM-dd');

  var tableId = 'ga:' + profileId;
  var metric = 'ga:visits';
  var options = {
    'dimensions': 'ga:source,ga:keyword',
    'sort': '-ga:visits,ga:source',
    'filters': 'ga:medium==organic',
    'max-results': 25
  };
  var report = Analytics.Data.Ga.get(tableId, startDate, endDate, metric,
      options);

  if (report.rows) {
    var spreadsheet = SpreadsheetApp.create('Google Analytics Report');
    var sheet = spreadsheet.getActiveSheet();

    // Append the headers.
    var headers = report.columnHeaders.map(function(columnHeader) {
      return columnHeader.name;
    });
    sheet.appendRow(headers);

    // Append the results.
    sheet.getRange(2, 1, report.rows.length, headers.length)
        .setValues(report.rows);

    Logger.log('Report spreadsheet created: %s',
        spreadsheet.getUrl());
  } else {
    Logger.log('No rows returned.');
  }
}
```
なにも考えず実行してみたら全部にスプレッドシートを作ってしまったので動かす際は注意。
ドライブがえげつないことになりましたｗ

metrix を変えることでいろんな情報が取れるらしい。
dimension, metrix の有効なパラメータは以下のページに載っている。
[UA Dimensions & Metrics Explorer](https://ga-dev-tools.web.app/dimensions-metrics-explorer/)
欲しい情報が得られるパラメータを逆引きで探せるので非常に便利。
これは有効活用しよう。

## まとめ
今回は AppsScript で Google Analytics の API を利用できることを確認した。
非常に簡単で便利なので今後有効活用していく。
Google Site とか SpreadSheet を組み合わせたウェブアプリやページ作りにも挑戦してみたい。

## Links
* [Analytics Service Document](https://developers.google.com/apps-script/advanced/analytics)
* [UA Dimensions & Metrics Explorer](https://ga-dev-tools.web.app/dimensions-metrics-explorer/)