この記事はSpeee Advent Calendar 2016 の7日目の記事です。
前日の記事は
@iida-hayatoのTestable Swift、あるいは僕らがテストを書かない理由 - Qiita
です。
ディレクターの@cultivaです。
普段の仕事では海外向けのサービスのプロダクトマネジメントをしています。
経緯と概要
僕達のチームでは毎週月曜日に訪問数とPVを報告しています。
そのためのデータを毎回GoogleAnalyticsの画面から手動でダウンロードするのが面倒なので、
GoogleSpreadSheetとGoogleAppScriptを用いて自動化しました。
事前準備
GoogleSpreadsheetのスクリプトエディターを展開
ツール>スクリプトエディター>新しいプロジェクトを作成Googleアナリティクスからの連携承認
リソース>GoogleAPIを使用」からGoogle Analytics APIを有効
Google APIs ConsoleでGoogle Analytics APIを [ON] に設定
ツール>スクリプトギャラリー>Google Analytics Data Fetch Functionsをインストールして連携承認ビュー(プロファイル)IDの確認
「アナリティクス管理画面>アナリティクス設定>ビュー設定」から確認可能な8桁の数字
GoogleAppScriptのコード
下記の通り。
(参考URLを少し改変しただけですが。。。)
//スプレッドシート立ち上げ時に自動的に"処理メニュー"を追加
function onOpen(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menu = [
{name: "週次処理", functionName: "runDemo"}
];
ss.addMenu("処理メニュー", menu);
}
//GoogleAnalyticsからデータ取得
function runDemo() {
var profileId = 'secret'; //ビューID
var tableId = 'ga:' + profileId;
var startDate = getLastNdays(7); // 1週間前(7日間)
var endDate = getLastNdays(1);
var optArgs = {
'dimensions': 'ga:date',
};
var results = Analytics.Data.Ga.get(
tableId, // Table id (format ga:xxxxxx).
startDate, // Start-date (format yyyy-MM-dd).
endDate, // End-date (format yyyy-MM-dd).
'ga:visits,ga:pageviews', // Comma seperated list of metrics.
optArgs);
outputToSpreadsheet(results);
}
function getLastNdays(nDaysAgo) {
var today = new Date();
var before = new Date();
before.setDate(today.getDate() - nDaysAgo);
return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd');
}
//スプレッドシートへの出力
function outputToSpreadsheet(results) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// ヘッダー出力
var headerNames = [];
for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) {
headerNames.push(header.getName());
}
sheet.getRange(1, 1, 1, headerNames.length)
.setValues([headerNames]);
// データの各行を出力
sheet.getRange(2, 1, results.getRows().length, headerNames.length)
.setValues(results.getRows());
}
トリガーの設定
この設定でスプレッドシート起動時に
上記のコードを実行し、
直近1週間のデータを取得を行います。
結果
→後はコピーして、別のExcelのフォーマットにデータを貼り付けすれば完成。
その他
トリガーは毎週月曜日の朝に時限作動する仕組みにしてもよかったのですが、
そうするとなぜかうまくいかなかったので、やめました。
(getActiveSpreadsheet()とgetActiveSheet()が上手く動作しないから?)
仮に時限作動だとしても、データの確認のために結局spreadsheetを一度開かないといけないので、
それならばspreadsheet起動時にプログラムを実行するのでもいい、との判断で
起動時に実行させることにしました。