site-analytics

GitHub Pagesで公開している複数サイトの日別PV/UUを、自分専用のダッシュボードで見るための 自作アクセス解析システムです。

構成: tracker.js(計測)→ collector.gs(受信)→ スプレッドシート(raw/daily) → dashboard.gs + dashboard.html(集計・表示)。collector と dashboard は アクセスできるユーザーの設定が異なる(前者は全員、後者は自分のみ)ため、あえて別々の GASプロジェクトに分けている。

セットアップ手順

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

  1. Googleドライブ(drive.google.com)を開き、「新規」→「Google スプレッドシート」を作成する。
  2. 名前を「site-analytics-data」などに変更する。
  3. アドレスバーのURLから https://docs.google.com/spreadsheets/d/【ここがID】/edit の 【ここがID】部分(英数字とハイフンの文字列)をコピーしてメモしておく。 これが以降 SPREADSHEET_ID として使う値です。

2. collector プロジェクト(受信用)を作成する

  1. script.google.com を開き、「新しいプロジェクト」をクリックする。
  2. プロジェクト名を「site-analytics-collector」などに変更する。
  3. エディタ内の コード.gs の中身を全て削除し、このリポジトリの collector.gs の内容を 貼り付ける。
  4. 1行目付近の SPREADSHEET_ID の値を、手順1でメモしたスプレッドシートIDに書き換える。
  5. ALLOWED_SITE_IDS の配列に、計測したいサイトのsiteId(自分で決める識別子、例: 'portfolio', 'keiba-simulator')を追加する。
  6. 保存する(Ctrl+S)。
  7. 右上の「デプロイ」→「新しいデプロイ」をクリックする。
  8. 歯車アイコン(種類の選択)から「ウェブアプリ」を選ぶ。
  9. 「次のユーザーとして実行」は「自分」のままにする。
  10. 「アクセスできるユーザー」は 「全員」 を選ぶ(サイト訪問者からの送信を受け付けるため)。
  11. 「デプロイ」をクリックする。初回はGoogleアカウントでの確認画面が表示されるので、 自分のアカウントで許可する。

    このとき、「このアプリは Google で確認されていません」(英語表示では “Google hasn’t verified this app”)という警告画面が出ることがある。これは 自分で作成した個人のスクリプト(Googleによる審査を受けていないアプリ)では 必ず表示されるもので、異常ではない。画面左下の「詳細」をクリックし、 「(プロジェクト名)(安全ではないページ)に移動」といったリンクをクリックすると、 通常のGoogleアカウント権限確認画面に進める。これは自分自身が作成したスクリプトが 自分のスプレッドシートにアクセスする許可を求めているだけなので、そのまま許可して 進めて問題ない。

  12. 表示された「ウェブアプリ」のURL(https://script.google.com/macros/s/.../exec の形式)を コピーしてメモしておく。これが tracker.js の送信先エンドポイントです。

3. dashboard プロジェクト(表示用)を作成する

  1. script.google.com を開き、「新しいプロジェクト」をクリックする(collectorとは別の 新規プロジェクトにすること)。
  2. プロジェクト名を「site-analytics-dashboard」などに変更する。
  3. コード.gs の中身を全て削除し、このリポジトリの dashboard.gs の内容を貼り付ける。
  4. SPREADSHEET_ID の値を、手順1でメモしたスプレッドシートIDに書き換える (collector.gsと同じ値)。
  5. 左側のファイル一覧の「+」→「HTML」をクリックし、ファイル名を dashboard (拡張子は自動で.htmlになる)にする。
  6. 作成された dashboard.html の中身を全て削除し、このリポジトリの dashboard.html の 内容を貼り付ける。
  7. 保存する(Ctrl+S)。
  8. 関数選択のドロップダウン(ツールバー中央の「実行する関数を選択」)から setup を選び、 「実行」ボタン(▷)をクリックする。初回は権限の許可を求められるので、自分のGoogle アカウントで許可する(初回のみ、ここでも手順2-11と同じ「Google で確認されていません」 という確認画面が出ます。上記の手順と同様に、詳細→安全ではないページに移動、と進んで 許可してください)。
  9. スプレッドシートを開き、raw と daily の2つのシートが作られ、ヘッダー行が入って いることを確認する。なお setup はdate列(A列)をプレインテキスト書式にも自動設定する ため(日付文字列がGoogleスプレッドシートによって日付型に勝手に変換されるのを防ぐ目的)、 手動で書式を設定する必要はありません。
  10. 関数選択を createDailyTrigger に変え、実行する。これで毎日決まった時刻に aggregateDaily が自動実行されるようになる(トリガーは「トリガー」画面 (時計アイコン)から確認できる)。
  11. 「デプロイ」→「新しいデプロイ」→種類「ウェブアプリ」を選ぶ。
  12. 「次のユーザーとして実行」は「自分」のまま。
  13. 「アクセスできるユーザー」は 「自分のみ」 を選ぶ(これで自分のGoogleアカウントで ログインしている時だけダッシュボードが見られるようになる)。
  14. 「デプロイ」をクリックし、表示されたURLがダッシュボードのURL。ブックマークしておく。

デプロイ後に dashboard.gs や dashboard.html を編集した場合も、変更をダッシュボードURLに 反映するには再デプロイ(「デプロイ」→「デプロイを管理」→ 既存デプロイの編集アイコン→ バージョン「新バージョン」→デプロイ)が必要なので忘れないこと。

4. tracker.js を GitHub Pages で公開する

  1. このリポジトリをGitHubにpushし、リポジトリの Settings → Pages で公開設定を行う (Branch: main / フォルダ: /(root))。
  2. tracker.js の1行目付近の ENDPOINT の値を、手順2-12でメモした collector の ウェブアプリURLに書き換えてコミット・pushする。
  3. 数分後、https://<あなたのGitHubユーザー名>.github.io/site-analytics/tracker.js?v=1 でファイルが表示されることを確認する。

5. 計測したい各サイトに埋め込む

各サイトのHTMLの </body> 直前などに以下を1行追加する(data-site-id は collector.gs の ALLOWED_SITE_IDS に登録した値と一致させる):

<script src="https://<あなたのGitHubユーザー名>.github.io/site-analytics/tracker.js?v=1" data-site-id="portfolio"></script>

新しいサイトを追加するときは、collector.gs の ALLOWED_SITE_IDS にそのsiteIdを追加して 再デプロイ(「デプロイ」→「デプロイを管理」→ 既存デプロイの編集アイコン→ バージョン「新バージョン」→デプロイ)することを忘れないこと。

tracker.js を更新したときのバージョンアップ手順

tracker.js の中身を変更した場合、ブラウザやCDNにキャッシュされた古い版が使われ続けることが あるため、以下の手順でキャッシュを回避する。

  1. tracker.js を修正してGitHubにpushする。
  2. 全ての埋め込みサイトのscriptタグのクエリを次の番号に上げる(例: tracker.js?v=1 → tracker.js?v=2)。
  3. 各サイトを再デプロイ・再公開する。

動作確認手順

以下の手順でエラーが出た場合は、まず collector.gs と dashboard.gs の両方で SPREADSHEET_ID を実際のスプレッドシートIDに書き換えているか確認してください。

  1. 計測対象ページをブラウザで開き、DevToolsのNetworkタブで collector の .../exec へのPOSTリクエストが飛んでいることを確認する。
  2. スプレッドシートの raw シートに1行追記されていることを確認する。
  3. dashboard プロジェクトのGASエディタで aggregateDaily を手動実行し、daily シートに 前日分の集計行ができていること、90日より前の raw 行が削除されていることを確認する。
  4. getTodayStats は引数 siteId を取る関数のため、関数選択のドロップダウンから 直接実行することはできない。確認する場合は、dashboard プロジェクトのGASエディタに function testGetTodayStats() { Logger.log(getTodayStats('portfolio')); } のような 一時的な関数を追加してこちらを実行する。実行後に自動で開く「実行ログ」欄に {pv: ..., uu: ...} の形で当日のPV/UUが表示されることを確認する。確認できたら このテスト用関数は削除してよい。
  5. 手順3のダッシュボードURLを開き(自分のGoogleアカウントでログインした状態で)、 サイト切り替えプルダウン・テーブル・折れ線グラフが表示されることを確認する。

既知の制約