2015年7月9日木曜日

Google AnalyticsのデータをGoogle Apps Scriptを使ってSpreadsheetに出力する(自動化対応・条件追加等)

こんにちは、井下です。

前回はGoogle Apps Scriptを利用して、Google AnalyticsのデータをSpreadsheetに出力してみました。

これで画面上からは見られなかった、3つ以上のディメンションで絞り込んだデータを見られるようになりましたが、前回のサンプルコードのままだと少し不便なところがあります。

例えば…
  • データ取得範囲を決める開始日・終了日が固定値なので、自動で実行しても意味がない
  • 出力先が常に同じシートなので、実行するたびに上書きされてしまう
  • ヘッダーがないので、ぱっと見てどの行が何のデータなのか分かりづらい
  • 検索キーワードが"not set"になっているデータなど、不要なデータは出力させないようにしたい

今回は上記の4点について、修正を行ったサンプルを書いていきます。


ちなみに、前回書いたサンプルコードはこちらです。
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };
  var startDate = "2015-06-01";
  var endDate = "2015-06-29";

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  var sheet = SpreadsheetApp.getActiveSheet();

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}
※赤字部分は変更必須、青字部分は任意の値に変更する前提です


修正1 開始日・終了日を可変にする

Google AnalyticsとGoogle Apps Scriptの連携させる意義として、定期実行における自動化ができることを前回挙げています。
そのためにはデータの取得範囲の開始日・終了日を実行日に応じて可変にすることと、Google Apps Scriptのトリガー機能の設定が必要になります。

まず、下記のサンプルコードによって、開始日・終了日を実行日に応じて可変にします。
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  var sheet = SpreadsheetApp.getActiveSheet();

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}
サンプルコードでは、「1週間分のデータを抽出」する例としています。

なお、データの日付範囲を変更したい場合は、"START_DATE_OFFSET"および"END_DATE_OFFSET"の値を変更してください。
"START_DATE_OFFSET"は日付範囲の開始日が実行日の何日前か、"END_DATE_OFFSET"は日付範囲の終了日が実行日の何日前かを決めています。

修正2 実行タイミングの自動化

次にトリガー機能の設定です。
Google Apps Scriptには定期実行や、特定の動作がされたときのみ実行するトリガー機能が用意されています。

トリガー機能の設定はGoogle Apps Scriptの[リソース]>[現状のプロジェクトのトリガー]から行います。


最初は何も設定されていないので、ダイアログに表示されているリンクをクリックして設定画面を開きます。



新規作成時には自動で1時間ごとに起動するような設定になっているので、適切な起動タイミングに変更します。
設定可能な起動タイミングとしては、特定の日時、分ごと、時ごと、日ごと、週ごと、月ごとが用意されています。今回は毎週月曜日の0~1時の間に実行されるように設定しました。



開始日・終了日の可変設定と併せて、過去1週間分のGoogle Apps Scriptのデータが自動で出力されるようになります。


修正3 出力先を変更する

実行のたびの上書きを避けるために、出力先を変更します。
ただし、"出力先の変更"と言っても、以下に挙げる3つのケースがあると考えています。
  1. 出力先Spreadsheetは、Google Apps Scriptの作成元Spreadsheeで、実行するごとに新しいシートにデータを出力する

  2. 出力先Spreadsheetは、別途用意したSpreadsheetで、実行するごとに新しいシートにデータを出力する

  3. 出力先Spreadsheetは、実行するたびに新規作成するSpredsheetで、実行するごとに新しいシートにデータを出力する

※"Spreadsheet"と"シート"の扱いに混乱するかもしれませんが、"Spreadsheet"はファイル、"シート"はSpreadsheetの中における区切りを指します。Excelに置き換えるなら"Spreadsheet"はexcelファイルそのもの、"シート"はそのままシートです。

サンプルコードはそれぞれ下記の通りです。

1.出力先Spreadsheetは、Google Apps Scriptの作成元Spreadsheeで、実行するごとに新しいシートにデータを出力する
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("result_" + startDate + "_" + endDate,0);

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

2.出力先Spreadsheetは、別途用意したSpreadsheetで、実行するごとに新しいシートにデータを出力する
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var SSHEET_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  var sheet = SpreadsheetApp.openById(SSHEET_ID).insertSheet("result_" + startDate + "_" + endDate,0);

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

3.出力先Spreadsheetは、実行するたびに新規作成するSpredsheetで、実行するごとに新しいシートにデータを出力する
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  var sheet = SpreadsheetApp.create("result_" + startDate + "_" + endDate).insertSheet("result_" + startDate + "_" + endDate,0);

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

それぞれ独自の差分となる箇所を緑字にしています。
なお、作成するシート名はどのサンプルも共通で"result_開始日_終了日"となっています。

2のサンプルは、"SSHEET_ID"の値を出力先のSpreadsheetのIDにあわせて変更する必要があります。
SpreadsheetのIDはSpreadsheetのURLの"spreadsheets/d/"と"/"で囲まれている部分です。
例えば"spreadsheets/d/XXXXXXXXXXXXXXXXX/"となっていれば、SpreadsheetのIDは"XXXXXXXXXXXXXXXXX"となります。


3のサンプルは、実行するたびにファイル名が"result_開始日_終了日"となっているSpreadsheetを作成します。

修正4 ヘッダーを付与する

Spreadsheetへの出力は、Google Analyticsのデータがそのままむき出しになっているので、ヘッダーをつけて見やすくします。

今回は例として、A列から順に"検索キーワード"、"地域"、"ドメイン"、"セッション数"、"新規セッション率"、"新規ユーザ数"がヘッダーとして表示されるようにしてみます。
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var header = ["検索キーワード","地域","ドメイン","セッション数","新規セッション率","新規ユーザ数"];

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  ga.unshift(header);

  var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("result_" + startDate + "_" + endDate,0);

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

"header"にヘッダーとなる文字を格納しています。表示するヘッダーを変えたい場合は、任意の文字に置き換えてください。

注意点として、"ヘッダーで指定する要素の数"と、"メトリクスとディメンションを足した数"は必ず同じ数になるようにしてください。過不足があった場合、正しく出力されません。

修正5 データにフィルタをかける

出力されるデータにフィルタをかけ、不要なデータは出力しないようにします。

今回は例として、"検索キーワード"が"(not provided)"か"(not set)"になっているデータを出力しないようにフィルタをかけてみます。
function analytics() {
  var PROFILE_ID = "ga:zzzzzzzz";
  var START_DATE_OFFSET = 8;
  var END_DATE_OFFSET = 1;

  var metrics = "ga:sessions, ga:percentNewSessions, ga:newVisits";
  var optArgs = {
    'dimensions': 'ga:keyword, ga:region, ga:networkDomain',
    'filters': 'ga:keyword!=(not provided);ga:keyword!=(not set)'
  };

  var nowDate = new Date();
  var startDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - START_DATE_OFFSET));
  var endDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - END_DATE_OFFSET));

  var header = ["検索キーワード","地域","ドメイン","セッション数","新規セッション率","新規ユーザ数"];

  var ga = Analytics.Data.Ga.get(PROFILE_ID, startDate, endDate, metrics, optArgs).rows;
  ga.unshift(header);

  var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("result_" + startDate + "_" + endDate,0);

  sheet.getRange(1, 1, ga.length, ga[0].length).setValues(ga);
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

新しく"filters"が追加されていますが、ここにフィルターの内容を定義します。
フィルターをどのように書けばいいかは、下記のサイトが参考になりますので、適宜書き換えてください。
http://celtislab.net/archives/20130906/個別記事のアナリティクスデータ取得はフィルタ/


前回と今回の内容を併せると、下記のことができるようになりました。

  • 3つ以上のディメンションで細分化したGoogle Analyticsのデータを出力する
  • 定期的に一定期間のGoogle Analyticsデータを出力する
  • 任意のフィルタで絞り込んだGoogle Analyticsのデータを出力する
自動化で、作業負荷や作業ミス防止による作業品質の向上にお役立てください。

0 件のコメント:

コメントを投稿