[GAS] GAデータをスプレッドシートに出力 | 1日毎 10万行以上にも対応 サンプリング回避

⚠️ あくまで個人の見解ですのでご参考までに。活用される際は自己責任でお願いいたします。

前提

・Google Analytics 無償版で出来るだけサンプリングを回避するため、1日毎にデータを抽出する仕様
・結果が10万行以上の場合にも対応
・あらかじめ決まったディメンションと指標を抽出する仕様
・都度シート名を指定してシートを新規作成する仕様(上書き不可)
・GAS初心者が書いたスクリプトのため色々なってない部分があると思いますが、ご了承ください🙇‍♀️
・あくまで個人の備忘録として捉えていただければ幸いです

スプレッドシートの設定

スクリーンショット 2020-05-26 21.44.40

・上記のような設定シートを作成する。(セルの位置とシート名さえ気をつければOK)
・実行ボタンも作成しておく。
※サンプルのためフィルタやセグメントはでたらめです。

スクリプト作成

・スプレッドシートの [ツール] > [スクリプトエディタ] からエディタを開く。
・エディタの [リソース] > [Googleの拡張サービス] を開き、[Analytics Reporting API v4] をONにする。

スクリーンショット 2020-05-26 21.27.32

下記のスクリプトをエディタに貼り付け、保存する。
※取得したいデータによって、ヘッダー / リクエスト文の条件などカスタム必要です。

// 設定シートから情報取得
var setting = SpreadsheetApp.getActive().getSheetByName('設定');
var viewId = 'ga:' + setting.getRange(3, 3).getValue();
var startDate = new Date(setting.getRange(4, 3).getValue());
var endDate = new Date(setting.getRange(5, 3).getValue());
var filter = setting.getRange(6, 3).getValue();
var segment = setting.getRange(7, 3).getValue();

// 出力シート名設定
var sheetName = setting.getRange(8, 3).getValue();

function doGet() {

 // 実行確認メッセージ表示
 var result = Browser.msgBox("実行しますか?", Browser.Buttons.OK_CANCEL);

 if (result == "ok"){

   // 出力用シート追加
   var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);     
  
   // ヘッダ追加
   sheet.getRange(1, 1).setValue('date');
   sheet.getRange(1, 2).setValue('landingPage');
   sheet.getRange(1, 3).setValue('sessions');
  
   // 1日毎に繰り返す
   while(startDate <= endDate) {
     var formattedDate = Utilities.formatDate(startDate, 'Asia/Tokyo', 'yyyy-MM-dd');  
    
     response = request(formattedDate);
     nextPageToken = dataWrite(response);
    
     // nextPageTokenがあったら繰り返す
     while(nextPageToken != null) {
       response = request(formattedDate,nextPageToken);
       nextPageToken = dataWrite(response);
    }
    startDate.setDate(startDate.getDate() +1);
  }
 Browser.msgBox("データ抽出が完了しました", Browser.Buttons.OK);
 }
}

function request(formattedDate,nextPageToken) {
 var response = AnalyticsReporting.Reports.batchGet({
   'reportRequests': [{
     'viewId': viewId,
     'dateRanges': [{
       'startDate': formattedDate,
       'endDate': formattedDate
     }],
     'metrics': [{
       'expression': 'ga:sessions',
     }],
     'dimensions': [{'name': 'ga:date'},
                    {'name': 'ga:landingPagePath'},
                    {'name': 'ga:segment'}  // セグメントなしの場合はコメントアウト                  
                   ],
     'filtersExpression': filter, // フィルタなしの場合はコメントアウト
     'segments': [{
       'segmentId': segment  // セグメントなしの場合はコメントアウト
     }],
     'orderBys': [{
       'fieldName': 'ga:sessions',
       'sortOrder': 'DESCENDING'
     }],
     'samplingLevel': 'LARGE',
     'pageToken': nextPageToken,
     'pageSize': '100000'
   }]
 });
 return response;
}

function dataWrite(response) {  
 if(!response.code) {
   var json = JSON.parse(response);
   var data = json.reports[0].data;
   var nextPageToken = json.reports[0].nextPageToken;
   var dataset = [];
   
   // データ作成
   data.rows.forEach(function(row) {
     var date = row.dimensions[0];
     var landingPagePath = row.dimensions[1];
     var sessions = row.metrics[0].values[0];

   dataset.push([date, landingPagePath, sessions]);
   });
   
   // スプレッドシートに書き込む
   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
   sheet.getRange(sheet.getLastRow()+1, 1, dataset.length, 3).setValues(dataset); // カラム数によって変更
   
 } else {
   Browser.msgBox("エラーが発生しました", Browser.Buttons.OK);
 }  
 return nextPageToken;
}

スクリプトの割り当て

スクリーンショット 2020-05-26 21.37.57

スプレッドシート に戻り、作成しておいた実行ボタンに doGet を割り当てます。

スクリーンショット 2020-05-26 21.39.36

以上で完了です。

この記事が気に入ったらサポートをしてみませんか?