シャープ記号(#)付きのURLをGoogleアナリティクスで測定する

URL内のシャープ記号以降の部分の情報をGoogleアナリティクスで計測する方法

URLのハッシュ部分のデータ（#以降の部分、フラグメントとも呼ぶ）はGoogleアナリティクスに送信されないため、[Ajaxのshebang(#!)](#shebang%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E5%88%86%E3%81%8B%E3%82%8B%E3%83%AA%E3%83%B3%E3%82%AF)などで、ハッシュに大事な情報があったとしてもそれを計測することができません。
また、ハッシュ部分が変わることによりページ内容が変わる場合であっても実際のページビューイベントが発生してい場合、GTMの「ページビュー」トリガーを利用することができません。

この記事では、

- Googleアナリティクスに送られる情報をGTM（Google Tag Maneger）上で上書きする
- ハッシュ部分の変更に対応するトリガー設定を作成する

ことにより、通常では計測できないハッシュ部分の情報を計測する方法を紹介します。

##手順
<!--
:warning: 以下の手順はGoogleアナリティクスに送信する情報そのものを書き換えてしまうものなので、今使っているプロパティとは別に、

①新しいGoogleアナリティクスのプロパティを作成し、
②GTM内に新規のユニバーサルアナリティクスタグを作成した上で、
作業を進めることをオススメします。
-->

###1.変数の作成
まずは、これから作成するトリガー設定とタグ設定に必要な変数設定を作成します。

####組み込み変数「**New History Fragment**」「**Old History Fragment**」の有効化
変数ページの「組み込み変数」の「設定」ボタンから、
**New History Fragment**、**Old History Fragment**にチェックを入れ、この2つの変数を有効化します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/10bf76f5-cd65-5166-431c-9b5b24c5db26.png)
これらの変数の意味は以下のとおりです。
> **New History Fragment:**
>履歴変更トリガーの成立時に、dataLayer の「gtm.newUrlFragment」キーを取得します。値は、履歴変更イベント後のページ URL の一部分（ハッシュ）の文字列になります。
>
>**Old History Fragment:**
>履歴変更トリガーの成立時に、dataLayer の「gtm.oldUrlFragment」キーを取得します。値は、履歴変更イベント前のページ URL の一部分（ハッシュ）の文字列になります。
> [ウェブサイト用コンテナの組み込み変数 - タグマネージャ ヘルプ](https://support.google.com/tagmanager/answer/7182738?hl=ja)



####ユーザー定義変数：「**PagePath include hash**」の作成
次に、Googleアナリティクスに送るページ情報を上書きするための変数
ユーザー定義変数「**PagePath include hash**」を**カスタムJavaScript変数**として以下の要領で作成します。

変数ページの「ユーザー定義変数」の「新規」ボタンから新しいユーザー定義変数を作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/0c59c3c1-c7a7-6813-df9d-e2da840d8562.png)

変数名を「**PagePath include hash**」と設定し、「**カスタムJavaScript**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/49185c56-398c-bda3-4260-ea877f719878.png)

「カスタムJavaScript」部分に以下のハッシュ入りのURL情報を出力するためのコードを入力。

```js:カスタムJavaScript部分のコード
function(){
  return location.pathname + location.search + location.hash;
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/99dee526-c8ce-891e-6e64-96986df666ac.png)

#####動作例）
ページURLが`https://hoge.com/content/index.html?q=aa&c=bb#hagehage`のときの出力

```
/content/index.html?q=aa&c=bb#hagehage
```
- パス部分 `location.pathname`:`/content/index.html`
- GETパラメータ `location.search` : `?q=aa&c=bb`
- ハッシュ部分 `location.hash` : `#hagehage`



####ユーザー定義変数「**has changed hash**」の作成

**PagePath include hash**でユーザー定義変数を作成したのと同じ要領で、
URLのハッシュ部分が変更になったか検証するためのカスタムJavaScript変数「**has changed hash**」を作成します。

```js:カスタムJavaScript部分のコード
function(){
  return !!{{New History Fragment}} && {{New History Fragment}} !== {{Old History Fragment}};
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/adbb3eba-7a8d-743d-f687-a1afe31c4582.png)


*************************

###2.トリガーの作成
URLのハッシュ部分のみが変化することによりWebページの内容が書き換わるときには実際のページビューイベントが発生しないため、タグの発火設定に通常の「ページビュー」トリガーが利用できません。

これに対応するため、次の手順でハッシュの変更を検知するためのトリガーを作成します。

####トリガー「**Detect new hash**」の作成

トリガーページの「新規」ボタンから新しいトリガーを作成。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/2d783e2a-ed4f-1111-025e-9054531ff591.png)

トリガー名を「**Detect new hash**」と設定し、「**履歴の変更**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/51cb8d5e-a8e1-bd23-d8fd-0f65e6b0ce2c.png)

対象は**has changed hash**（先ほど作成した変数設定）を選択し、条件は「**等しい**」を指定。一番右のフォームに`true`と入力。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/8c71b57f-3b6e-b10c-8543-df13555f5610.png)



*************************

###3.ユニバーサルアナリティクスタグへの変数組み込み

最後に、「タグ」ページから目的のユニバーサルアナリティクスタグの画面を開いた上で、以下の設定を行います。

####URLの上書き設定
「**詳細設定**」の「**設定するフィールド**」部分を設定する
フィールド名**page**を選択し、値に先ほど作成したユーザー定義変数「**PagePath include hash**」を設定することにより、Googleアナリティクスに送信するURL情報を上書き。

※値部分を入力するとき、フォーム右にあるレゴブロックのようなボタンをクリックすれば選択肢が現れるので、手打ちせずにココから選ぶと楽です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/c33a3237-2355-cc9f-0441-22bfaf63ac1c.png)

####URLのハッシュ部分変更時の発火設定
**URLのハッシュ部分が変更したときにも**ユニバーサルアナリティクスタグを発火させるため、
通常しているページビューのトリガー設定とは別に、先ほど作成したトリガー**Detect new hash**をタグの発火条件に追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/a1805cb2-468a-f1ef-4bb7-bf418732e320.png)


以上で作業終了。
最後にGTMのコンテナのプレビュー/公開を行うことを忘れずに。


これらの設定により、Googleアナリティクスでハッシュ付きのURLを測定できるようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/a28b0a36-0775-2ead-aecf-e6a9f039518c.png)


##参考

###今回のGTM/GAのトラッキングに関係する情報

- [Googleタグマネージャ事例：GTMで仮想ページビューの実装 - カグア！](http://www.kagua.biz/tagmanager/gtm-virtualpageview.html)
- [ABテストで使える！？仮想ページビューとは - Qiita](http://qiita.com/ryo_hisano/items/6e5a3fdfb1fe5b9d93c9)
- [javascript - How should I handle tracking fragment page views in Google Analytics? - Stack Overflow](https://stackoverflow.com/questions/7982454/how-should-i-handle-tracking-fragment-page-views-in-google-analytics)
- [#GTMtips: Track URL Fragments As Pageviews - Simo Ahava's blog](https://www.simoahava.com/gtm-tips/track-url-fragments-as-pageviews/)

###shebangについて分かるリンク
「#!」の読み方について、シバング、シバン、シェバン、ハッシュバング、とかなり豊富なバリエーションがある様子

- [URL に付く「#!」って何だったの？ ～ Hashbang の復習 ～ - Corredor](http://neos21.hatenablog.com/entry/2016/06/14/000000)
- [「#!」 shebang – シャープとびっくりマークってどういう意味？ at softelメモ](https://www.softel.co.jp/blogs/tech/archives/2911)
- [なぜWebサイトのURLに”#!”を付けるのか？クローラーはインデックス可能なのか？について。 | ohsexybabyのWebログ](http://ohsexybaby.com/web/843/)
- [さらなる「#!」URL批判 - karasuyamatenguの日記](http://d.hatena.ne.jp/karasuyamatengu/20110212/1297465199)
- [XMLの第一人者Tim Bray氏「URLに#!入れるな」：濃縮還元オレンジニュース｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/clip/01/orangenews/vol62/0005)

shebangについて様々な批判はありますが、一部の検索エンジン対応で使わざるを得ない状況も残っているようです。Google向けには既に必要ない状態となっています。

- [SEOが重要なら #（ハッシュ）を URL に含めてはいけない | 海外SEO情報ブログ](https://www.suzukikenichi.com/blog/do-not-use-hash-in-urls/)
- [Indexing AJAX sites - Webmaster. Help](https://yandex.com/support/webmaster/robot-workings/ajax-indexing.html)

##おまけ


QiitaをやっていてGoogleアナリティクスで測定も行っている貴方には、次の記事もオススメです
→ [QiitaのGoogle Analyticsを見やすくする（URLを記事名で上書き）](http://qiita.com/AQRiL_1132/items/3b979e0a5476c33f2261)