Help us understand the problem. What is going on with this article?

GoogleAppScriptでGoogleAnalyticsの訪問数/PV数を取得自動化

More than 3 years have passed since last update.

この記事はSpeee Advent Calendar 2016 の7日目の記事です。

前日の記事は
@iida-hayatoTestable 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週間のデータを取得を行います。

trigger.PNG

結果

u30adu30e3u30d7u30c1u30e3.png
→後はコピーして、別のExcelのフォーマットにデータを貼り付けすれば完成。

その他

トリガーは毎週月曜日の朝に時限作動する仕組みにしてもよかったのですが、
そうするとなぜかうまくいかなかったので、やめました。
(getActiveSpreadsheet()とgetActiveSheet()が上手く動作しないから?)

仮に時限作動だとしても、データの確認のために結局spreadsheetを一度開かないといけないので、
それならばspreadsheet起動時にプログラムを実行するのでもいい、との判断で
起動時に実行させることにしました。

参考URL

http://www.find-job.net/startup/ga_spreadsheet_auto

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away