GoogleAppsScriptでGoogleAnalyticsのAPIを利用

# 事前準備
## AnalyticsAPIの有効化 

![01.png](https://qiita-image-store.s3.amazonaws.com/0/64819/7fa5096d-7bf3-4d74-4f0d-9f81ae359bc5.png)

- スクリプトエディタ上部メニューの「リソース」→「Googleの拡張サービス」を選択

![02.png](https://qiita-image-store.s3.amazonaws.com/0/64819/51f4c184-d059-dd57-b2a3-5aaf17295f9d.png)

- GoogleAnalyticsAPI（とDriveAPIもどうせ使うので）を有効化

![03.png](https://qiita-image-store.s3.amazonaws.com/0/64819/55107435-9456-45a5-fd28-878d3bd54a1b.png)

- GoogleディベロッパーコンソールでGoogleAnalyticsAPI（とDriveAPIもどうせ使うので）を有効化

# Core Reporting API の利用
## 参考
- [Analytics Service - Google Apps Script — Google Developers
](https://developers.google.com/apps-script/advanced/analytics)
- [Core Reporting API - Reference Guide - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/reporting/core/v3/reference)
- [Automated Access to Google Analytics Data in Google Sheets - Google Analytics — Google Developers](https://developers.google.com/analytics/solutions/articles/reporting-apps-script)

## 注意

- 開発する場合には、事前に[QueryExplorer](https://ga-dev-tools.appspot.com/explorer/)を使って諸条件を確認しておくのがよい

## サンプルスクリプト

```js
try{
  var gaNums = Analytics.Data.Ga.get(
    'ga:99999', // ビューID
    '2015-01-01', // 開始日
    '2015-01-31', // 終了日日
    "ga:pageviews", // 指標
    {
      'dimensions': 'ga:yearMonth,ga:pageTitle',
      'filters' : 'ga:pagePath=~/test/',
      "sort": "-ga:pageviews",
      'samplingLevel': 'HIGHER_PRECISION'
    }
  );
}catch(e){
   Logger.log("GAのデータ取得に失敗しました：" + e.message);
}
```

# 非サンプリングレポートの要求

- Google アナリティクスプレミアムのみ対応
- リクエストの結果はGAレポート画面の「カスタム」「非サンプリングレポート」で確認できる。

## 参考
- [Unsampled Reports - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/unsampledReports)
- [Unsampled Reports: insert - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/unsampledReports/insert)

## サンプルスクリプト
```js
try{

  var api_result = Analytics.Management.UnsampledReports.insert(
    {
      'title':      "ファイル名",
      'start-date': "2015-01-01",
      'end-date':   "2015-01-01",
      'metrics':    "ga:pageviews",
      'dimensions': "ga:pagePath",
      'filters':    "ga:pagePath=~/test/",
    },
    "99999999",      // アカウントID
    "UA-54300733-1", // プロパティID
    "91666585"       // ビューID（"ga:"は不要）
  );
} catch(e){
  Logger.log( "失敗しました：" + e.message );
}
```
# カスタムディメンションを大量に追加

## 参考
 - [Custom Dimensions: insert - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/customDimensions/insert)

## 注意
 - APIのQuotaに注意、ユーザあたりの秒間リクエスト数を10まで上げておく

## 使い方
次のようなシートを用意して「CD一覧」と名付け、プルダウンメニューの「カスタムディメンション」→「追加」を指定

| | A| B| C|D|E|F|
|:---:|:----:|:-----:|:------:|:------:|:------:|:------:|
| 1 | name | scope | active | | プロパティID | UA-XXXXX-XX |
| 2 | 名称 | HIT | TRUE | | | |
- 1行目のアルファベット・1列目の連番はスプレッドシートのアドレスを示す
- A列にカスタムディメンションの名称
- B列にスコープ（USRE, SESSION, HIT）を指定
- C列にアクティブ（TRUE,FALSE）を指定
- F1セルにプロパティIDを指定
- 作成したい数だけ行を追加
 - ただし作成できるカスタムディメンション数は標準で20、プレミアム版で200まで

## スクリプトの内容
```js:addCustomDimensions.js

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('カスタムディメンション')
    .addItem('追加', 'insertCustomeDimensions')
    .addToUi();
  ;
}

function insertCustomeDimensions() {
  
  // アカウントID/プロパディIDを取得
  var ids = getIds_();
  if( ! ids ){
    return;
  }
  
  // シートにあるカスタムディメンションの一覧を取得
  var cds = getCds_();
  
  // カスタムディメンションの追加
  for( var i = 0; i < cds.length; i++ ){
    
    try{
      var api_result = Analytics.Management.CustomDimensions.insert(
        {
          "name":   cds[i]["name"],
          "scope":  cds[i]["scope"],
          "active": cds[i]["active"]
        },
        ids.account,
        ids.property
      );
      Logger.log( JSON.stringify(api_result,null,2) );
      Utilities.sleep(500);
    } catch(e){
      Logger.log(e);
    }
  }
}

/*
* properties
*/

var config_ = {
  "property_id": "F1",
  "sheetname": "CD一覧",
  "cd_list" : "A1:C201"
}

var ss_ = SpreadsheetApp.getActiveSpreadsheet();
var sheet_ = ss_.getSheetByName(config_["sheetname"]);

/*
* private: カスタムディメンションの一覧を取得
*/

function getCds_(){

  // プロパティIDとアカウントIDを取得
  var values = sheet_.getRange( config_["cd_list"] ).getValues();
  
  // 連想配列に組み直し
  var fields;
  var cds = [];
  for ( var i = 0; i < values.length; i++ ){
    // ヘッダ行
    if( ! fields ){
      fields = values[i];
      continue;
    }
    // 値を確認
    if( values[i][0] == "" || values[i][1] == "" || values[i][2] == "" ){
      continue ;
    }
    // 値を転記
    var row = {};
    for( var j = 0; j < fields.length; j++ ){
      row[ fields[j] ] = values[i][j];
    }
    cds.push(row);
  }

  // 結果を返す
  return cds;
  
}

/*
* private: アカウントIDとプロパティIDの取得
*/

function getIds_(){

  // プロパティIDとアカウントIDを取得
  var property_id = sheet_.getRange( config_["property_id"] ).getValue();
  var match = property_id.match(/UA-(\d+)-\d+$/);
  if( ! match ){
    return;
  }
  var account_id = match[1];
  return { property : property_id, account : account_id };
  
}
```
# Google アナリティクスのユーザ追加

試したことはないが、Google グループで見つけたので転記しておく。
https://groups.google.com/forum/#!topic/google-apps-api-japan/WapBGUv7l3U

```js:addUsers.js
function myFunction() {
  var eul = Analytics.newEntityUserLink();
  
  eul.permissions = Analytics.newEntityUserLinkPermissions();
  eul.permissions.local = ["EDIT","MANAGE_USERS"];
  
  eul.userRef = Analytics.newUserRef();
  eul.userRef.email = "exa...@example.com"; //変えないと動かないです
  
  Analytics.Management.AccountUserLinks.insert(eul, "your account id");
}
```