デブサミ2018で話してきた一部を書きます。
無料のBIツール Google Data Studio の運用についてです。
Data Studioは データソースのキャッシュを自動で更新します。
なので、従量課金のデータソースをレポートにリンクしていると
閲覧していなくてもコストが発生します。
管理したいですが組織にどれだけのレポートがあって、
どのように使われているのかという把握は、Google Drive 上では難しいです。
誰も見ていないレポートは削除・改善をしたいので、
レポートの一覧をスプレッドシートに表示して
管理をする方法を書きたいと思います。
手順は下記の通りです。
- Data StudioのレポートにGoogle Analytics(以下GA)のトラッキングコードを設定
- Google Apps Script (以下GAS) から API へリクエストを可能にする
- スプレッドシートにレポートの一覧と閲覧状況を表示させる
Data Studio のレポートに GA のトラッキングコードを設定
[ファイル]→[レポート設定]でアナリティクスにトラッキングIDを設定。
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 にログインして確認してください。
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 に確認する必要があると思います。
重要なレポートがあまり見られてなかったりしたら、
注意喚起するなり、見られるようにレポートを改善するなど、
そんな管理も出来ると思います。
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。