Data Studio のレポートを可視化する

デブサミ2018で話してきた一部を書きます。
無料のBIツール Google Data Studio の運用についてです。

Data Studioは データソースのキャッシュを自動で更新します。

なので、従量課金のデータソースをレポートにリンクしていると
閲覧していなくてもコストが発生します。

管理したいですが組織にどれだけのレポートがあって、
どのように使われているのかという把握は、Google Drive 上では難しいです。

誰も見ていないレポートは削除・改善をしたいので、
レポートの一覧をスプレッドシートに表示して
管理をする方法を書きたいと思います。

手順は下記の通りです。

  1. Data StudioのレポートにGoogle Analytics(以下GA)のトラッキングコードを設定

  2. Google Apps Script (以下GAS) から API へリクエストを可能にする

  3. スプレッドシートにレポートの一覧と閲覧状況を表示させる

Data Studio のレポートに GA のトラッキングコードを設定

[ファイル]→[レポート設定]でアナリティクスにトラッキングIDを設定。

google analyticsのtracking code

GAS から API にリクエストを可能にする

新しいスプレッドシートを開いて、スクリプトエディタを選択。
[リソース] → [Cloud Platform プロジェクト]を選択。

新しいプロジェクトという入力フォームが表示されるので
プロジェクト名を入力して作成。
※ GCPプロジェクトが作成されるわけではないので、ご安心ください。

次に作成したGASのプロジェクトとGCP本体のプロジェクトを紐付けます。
紐付けにはプロジェクト番号が必要。GCP Console([IAMと管理]→[設定])で確認。

[リソース]→[Googleの拡張サービス]でDrive API と Analytics APIを有効化。

Google Developer Console 側でもAPIを有効にする必要があります。
Google Drive API と Analytics API を検索して、有効にしてください。

スプレッドシートにレポートの一覧と閲覧状況を表示させる

あとはスクリプトエディタに下記のスクリプトを入力してください。

GA の View ID が必要なので、GA にログインして確認してください。

google analyticsのviewid

var timeZone = Session.getTimeZone();
var viewId = ; // GAのビューIDです
var sheetName = ''; // 一覧を表示するシート名です

// レポート一覧を取得する
function getReport() {  
  
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
 
  var time = ss.getRange(2, 5).getValue();
  // 指定された年月の月初日と月末日を取得する
  var targetDate = getTargetDate(time);
  
  // 表示されている情報を削除
  ss.getRange('B5:J100').clear();

  var headerRowNum = 4;  
  var bodyRowNum = 5;
 
  // 見出し
  ss.getRange(headerRowNum, 2).setValue('レポート名').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 3).setValue('PV').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 4).setValue('UU').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 5).setValue('作成日時').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 6).setValue('更新日時').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 7).setValue('オーナー名').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 8).setValue('メールアドレス(オーナー)').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 9).setValue('編集ユーザ').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  ss.getRange(headerRowNum, 10).setValue('閲覧ユーザ').setBorder(true,true,true,true,false,false).setBackground('#ffffe0');
  
  // Drive API でmime typeがレポートの一覧を取得する
  var files = DriveApp.searchFiles('mimeType = "application/vnd.google-analytics.rap.report"');

  while (files.hasNext()) {

    var file = files.next();
    
    var reportName = file.getName();
    var createdAt = Utilities.formatDate(file.getDateCreated(), timeZone, 'yyyy/MM/dd');
    var updatedAt = Utilities.formatDate(file.getLastUpdated(), timeZone, 'yyyy/MM/dd');
    var ownerName = file.getOwner().getName();
    var ownerMail = file.getOwner().getEmail();
    var editors = file.getEditors();
    var viewers = file.getViewers();
    
    var editors_str = '';
    for (var i = 0; i < editors.length; i++) {
      if (i == 0) {
        editors_str = editors[i].getEmail();
      } else {
        editors_str += ", " + editors[i].getEmail();
      }
    }

    var viewers_str = '';    
    for (var i = 0; i < viewers.length; i++) {      
      if (i == 0) {
        viewers_str = viewers[i].getEmail();
      } else {
        viewers_str += ", " + viewers[i].getEmail();
      }
    }
            
    var id = file.getId();
    var url = file.getUrl();
    
    // レポート名にリンクを貼る
    ss.getRange(bodyRowNum, 2).setValue('=HYPERLINK("' + url + '", "' + reportName + '")').setBorder(true,true,true,true,false,false);                                    
    ss.setColumnWidth(2, 270);
    
    // Analytics API にレポートのIDと、集計期間を渡す
    var result = getAccess(id, targetDate);

    var pv = result[0];
    ss.getRange(bodyRowNum, 3).setValue(pv).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(3, 50);

    var uu = result[1];
    ss.getRange(bodyRowNum, 4).setValue(uu).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(4, 50);  
        
    ss.getRange(bodyRowNum, 5).setValue(createdAt).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(5, 100);
 
    ss.getRange(bodyRowNum, 6).setValue(updatedAt).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(6, 100);
 
    ss.getRange(bodyRowNum, 7).setValue(ownerName).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(7, 120);
 
    ss.getRange(bodyRowNum, 8).setValue(ownerMail).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(8, 200);
 
    ss.getRange(bodyRowNum, 9).setValue(editors_str).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(9, 300);
 
    ss.getRange(bodyRowNum, 10).setValue(viewers_str).setBorder(true,true,true,true,false,false);
    ss.setColumnWidth(10, 300);  
    
    bodyRowNum++;
  }   
}

// Analytics API で PV と UU を取得
function getAccess(id, targetDate) {

  var tableId = 'ga:' + viewId;
  
  var startDate = targetDate[0];
  var endDate = targetDate[1];

  var args = {'filters': "ga:pagePath=~/" + id + "/"};
    
  var results = Analytics.Data.Ga.get(
    tableId,
    startDate,
    endDate,
    'ga:pageviews, ga:visitors',
    args
  );
  
  return results.rows[0];
}

// 指定した年月の月初日と月末日を取得する
function getTargetDate(time) {

  var date = new Date(time);
  date.setDate(1);
  startDate = Utilities.formatDate(date, timeZone, 'yyyy-MM-dd');
  date.setMonth(date.getMonth() + 1);
  date.setDate(0);
  endDate = Utilities.formatDate(date, timeZone, 'yyyy-MM-dd');
  
  return [startDate, endDate]
}
スクリプトの解説

Data Studio のレポートの mime type は
application/vnd.google-analytics.rap.report なので、
Drive API で mime type をフィルタリングして、
組織のレポート情報を取得ができます。

各レポート情報にはレポートのIDが含まれています。
Data Studio のURLにはレポートのIDが含まれているので、
Analytics API で レポートIDでフィルタリングして、
レポート毎のPVとUUが取得できます。

スクリプトを実行すると組織の全レポートを一覧化できて、
指定した年月のPV/UUを取得できます。

年月のリストはシート「参照」を参照しています。

年月の参照シート

下の画像がスクリプトを実行した結果です。

内容を見ると「無題のレポート」が無駄そうなので、
オーナーの higuchi@grasys.io に確認する必要があると思います。

重要なレポートがあまり見られてなかったりしたら、
注意喚起するなり、見られるようにレポートを改善するなど、
そんな管理も出来ると思います。

spreadsheetsにdatastudioのレポートを可視化