Google Apps Script でアナリティクスのデータを自動取得してみた

アクセス解析でお馴染みのGoogle Analytics。
さまざまな形式でダウンロードできるため、活用している方も多いと思います。

週間、月間、その他、測定期間にあわせて手動でデータダウンロード、
その後加工などを行ってレポートを作成する作業って地味に時間かかりますよね。

元となるデータをセットする際に、余計なデータを省いたり、関数を組み込んで計算させたり。
単純作業に組み込まれるこの過程で分析担当者が分析に注力できていない状況に陥ってしまい、
分析の質が下がってしまう・・・

Googleデータポータルの普及でレポート作成という業務自体は減りつつあると聞きましたが、
加工作業はまだまだ残っているのではないでしょうか?

今回はGoogle Analyticsから
「必要なデータのみ自動的に取得」
「スプレッドシートにインポート」
という一連の自動化作業を「GAS」を使って実現します。
元データが加工しやすいシンプルな形式であれば、データポータルとの連携時もスムーズです。

1.スプレッドシートを作る

空のスプレッドシートを作り、スプレッドシートには「GAデータ取得」、一枚目のシートには「GAデータ」という名前をつけて保存します。
※名前は自由に設定してもOK

02_SpreadSheet_a02
アナリティクスからデータを取得するためのユーザーデータや条件などを書いておく欄を作ります。

03_SpreadSheet_a03

項目名 説明
View ID GAの「ビュー」のIDを入力します。 ga:123456789
Start Date データを取得する開始日を指定します。
※3
2019年4月1日:2019/04/01
End Date データを取得する終了日を指定します。
※3
2019年4月1日:2019/04/01
Metrics 取得する指標を指定します。
※1 ※4
訪問数:ga:sessions
ページビュー数:ga:paveviews
Dimensions 「セカンダリディメンション」と
呼ばれるものを指定します。
※1 ※4
URL:ga:pagePath
ブラウザ:ga:browser
Order データのソート方法を指定します。
先頭に「-」を入れると「降順」
入れないと「昇順」になります。
空欄でも構いません。
PVで昇順:ga:pageviews
PVで降順:ga:-pageviews
Filters 取得するデータのフィルタリングを指定します。
ページビュー数が100以上などの
限定した情報だけ受け取りたい場合に使用します。
空欄でも構いません。
PVが10以上:ga:pageviews>=10
Segments 特定のトラフィックに絞りたい場合に指定します。
GA上で設定したIDを記述してください。
空欄でも構いません。 ※2
すべてのトラフィック:gaid::-1
Limit データの最大取得件数を指定します。
空欄でも構いませんが、データ量が多いと
タイムアウトしてしまうかもれないので
指定しておくことをおすすめします。
3000
SamplingLevel 「速度優先」「精度優先」「バランス」の
三つのうちのどれかを指定します。
バランス
1:使用できるMetricsやDimensionsの確認
→ https://developers.google.com/analytics/devguides/reporting/core/dimsmets
※2:segmentsのIDを確認
→ https://ga-dev-tools.appspot.com/query-explorer/
※3:日付の入力形式は「yyyy/MM/dd」で統一してください。
※4:複数指定の場合は「,(カンマ)」で区切ってください。

 !注意!
・順番を変えたり、行の挿入、削除などを行わないでください。
GASで読み込んだ時に間違ったデータになってしまい、エラーになってしまいます。
どうしても変更したい場合はコードも一緒に変更してください。

必ず指定しないといけない項目は「View ID」「Start Date」「End Date」「Metrics」「Dimensions」の五つです。表には色を付けています。

値をセットします

04_SpreadSheet_a04

今回は、

設定項目 ユーザーデータ
Start Date 2017/12/01
End Date 2019/03/24
Metrics ga:users(UU)
ga:pageviews(PV)
Dimensions ga:yearmonth(年月)
Limit 3000

と、設定しました。
ga:monthだけでは年をまたぐデータが少し特殊になってしまうので、ga:yearmonthにしています。

続いて、取得したデータを記述しておくシートを作ります。

06_SpreadSheet_a06

データが出力される表はこのように設定します。それぞれの列には、

ヘッダー名 データの内容
A列 Date 取得したデータの日付
B列 Users 取得したUU数
C列 Pageviews 取得したPV数
D列 PV/UU 同じ行のPV(C列)÷UU(B列)の値
E列 Time プログラムを実行して、記述した時間

が記述されます。

H3は、プログラムを動かしたけれどデータが取得できなかった時、「取得できませんでした」とセットされるセルになっています。

2.Google Apps Scriptを開いてプログラムを書く

スクリプトエディタを開きます。

07_SpreadSheet_a07

メニューバーの「ツール」から「スクリプトエディタ」を選ぶと、別ウィンドウでスクリプトエディタが開きます。

最初に開いた時にはこんな感じです。

08_GoogleAppsScript_a01

名前をつけて保存します。
Google Apps Scriptはスプレッドシートと違って自動保存はしてくれませんので注意してください。
保存後、コードを書いていきます。デフォルトで表示されているコードは消しても構いません。

コードは以下のものです。書いたら保存してください。

      
      function FirstGet() {

      var ss       = SpreadsheetApp.getActive();  // スプレッドシートを取得する
      var sheets   = ss.getSheets();              // すべてのシートを取得する
      var GASheet  = sheets[0];                   // 一枚目のシートを取得する

      // 各パラメータを取得する
      var viewID     = GASheet.getRange('B2').getValue();            // View ID
      var start      = new Date(GASheet.getRange('B3').getValue());  // Start Date
      var end        = new Date(GASheet.getRange('B4').getValue());  // End Date
      var metrics    = GASheet.getRange('B5').getValue();            // Metrics
      var dimensions = GASheet.getRange('B6').getValue();            // Dimensions
      var sort       = GASheet.getRange('B7').getValue();            // Order
      var filters    = GASheet.getRange('B8').getValue();            // Filters
      var segment    = GASheet.getRange('B9').getValue();            // Segments
      var limit      = GASheet.getRange('B10').getValue();           // Limit
      switch(GASheet.getRange('B11').getValue()){                    // SamplingLevel
      case '速度優先':
        var samplingLevel = 'FASTER';
        break;
      case 'バランス':
        var samplingLevel = 'DEFAULT';
        break;
      case '精度優先':
        var samplingLevel ='HIGHER_PRECISION';
        break;
      default:
        var samplingLevel = 'DEFAULT';
        break; 
      }

      // 日付をフォーマットする
      var timeZone   = Session.getScriptTimeZone();  // タイムゾーンを取得
      var startDate  = Utilities.formatDate(start, timeZone, 'yyyy-MM-dd');
      var endDate    = Utilities.formatDate(end, timeZone, 'yyyy-MM-dd');

      var User = {  // ユーザーデータまとめて次の関数に渡しやすくする

      viewID        : viewID,
      startDate     : startDate,
      endDate       : endDate,
      metrics       : metrics,
      dimensions    : dimensions,
      sort          : sort,
      filters       : filters,
      segment       : segment,
      limit         : limit,
      samplingLevel : samplingLevel
      }

      for(var i = 1; i = 1){  // データが一つ以上取れていたら
      Sheet.getRange(2, 1, Sheet.getLastRow() - 1, 5).clearContent();  // 範囲の値を削除しておく

      for(var i = 0; i < gaData.length; i++) {
        
        // 書き込み用の日付を作る
        var year = gaData[i][0].substr(0, 4);
        var month = gaData[i][0].substr(4, 2);
        var date = year + '/' + ('0' + month).slice(-2);
        
        var formula = 'C'+ (i + 2) + '/B' + (i + 2);
        Sheet.getRange(i + 2, 1).setValue(date);
        Sheet.getRange(i + 2, 2).setValue(gaData[i][1]);
        Sheet.getRange(i + 2, 3).setValue(gaData[i][2]);
        Sheet.getRange(i + 2, 4).setFormula(formula);
        Sheet.getRange(i + 2, 5).setValue(new Date());
        
      }
        Sheet.getRange(2, 8).setValue('');
      }else {  // データが取得できなかった時のメッセージをセットする
        Sheet.getRange(2, 8).setValue('データが取得できませんでした。');
      }

      }
      

3.APIを取得し、Cloud Platformで有効化する

コードを書いても、そのままでは動きません。命令式を正しく理解させるためにAnalyticsのAPIを取得する必要があります。
少々長いので、別記事にて説明する予定です。

4.初回実行

APIも有効化したら、コードが動くか試してみましょう。

24_GoogleAppsScript_b01

赤枠で囲まれている三角マークが実行ボタンです。
押してから少しするとポップアップが現れます。

25_GoogleAppsScript_b02

「許可を確認」を選択してください。
続いてウィンドウが開きます。

26_GoogleAppsScript_b03

コードを動かしたいアカウントを選択して進んでください。
次のウィンドウに移ります。

※この時に、次のような表示になるときがあります。

27_GoogleAppsScript_b04-02

詳細を確認します。

27_GoogleAppsScript_b04-03

ここで「安全なページに戻る」を選択すると、コードを実行できません。
赤枠に囲まれた部分を選択すると、次に進むことができます。

27_GoogleAppsScript_b04

これは「このスクリプトでこんな動作をするけれど大丈夫ですか」という確認画面です。
今回はスプレッドシートへの変更、アナリティクスデータの表示の許可をもとめています。
問題ないので、このまま「許可」を押しましょう。
するとウィンドウが閉じて、画面上部にこんな表示が出ます。

28_GoogleAppsScript_b05

この表示が消えたら実行完了です。

スプレッドシートを見てみましょう。

29_SpreadSheet_b01

無事取得できました。
あとはデータポータルで取得したデータを参照元として利用するだけ!

「まとめ」

このように自動可することでアナリストは分析に集中することができますね。
記述を書き換えると、毎月決まった日の決まった時間にデータを取得し蓄積していく、という風に使うこともできます。
興味がある方はぜひ試してみてください。皆さんの仕事が少しでも楽になれば幸いです。

この仕事は、社内とはいえ初めて受けた仕事でした。
聞いたこともないような用語ばかりで戸惑いましたが、Analyticsはそれほどとっつきにくいツールではなかったように思います。
機会があればセグメントやサンプリングなども適応して取得してみたいと思います。

ーー
沖縄オフィスではフロントエンドエンジニアとwebアナリストを募集しています。
webの開発や解析に興味のある方、一緒に働きたい方はご連絡ください!
フロントエンドエンジニア:https://www.wantedly.com/projects/323885
アナリスト:https://www.wantedly.com/projects/267288
ーー

■参考にさせていただいたサイト様

Google Apps Scriptを使ってGoogle Analyticsのデータを取り込んでみる
http://tech.innovation.co.jp/2016/04/16/google-analytics-with-google-apps-script.html

Googleアナリティクスを開くのも面倒な人向け GAアドオンでデータをスプレッドシートに抜き出す方法
https://web-generalist.com/ga-api-spreadsheet/

Dimensions & Metrics Explorer
https://developers.google.com/analytics/devguides/reporting/core/dimsmets

Query Explorer
https://ga-dev-tools.appspot.com/query-explorer/

Core Reporting API – 概要
https://developers.google.com/analytics/devguides/reporting/core/v3/?hl=ja