Google AnalyticsデータをGoogle Spreadsheetで取得して集計する 【2013年α版script】無料でデータを取得したい!

1ヶ月ほど前から、今までの方法でGoogle SpreadsheetからAnalyticsのデータを取得することが出来なくなっています。
完全にOAuth2認証が必須になっているようです。

海外無料ツールも最近有料になったりして、自分で何とか作れないものかと思い、まだ酷い状態ですが、簡単にScriptを作ってみました。

■Scriptを見る
※閲覧はGoogleアカウントが必要なようです。

エラー処理が中途半端だったり、色んな制約が発生しています。
改善の余地がありまくる無駄なScriptですが、少しずつ改良出来ればと思っています。

■使い方

1.Google Spreadsheetを新規に作成して、「tool」から「Script editor」を開く

2.Scriptを貼る



3.適当な名前を付けてScriptを保存した後に、「File」から「Upgrade authorization experience」を選択する。
※イケてなさすぎる点!!

4.「Yes」を選択。
要するに、Scriptを実行する人ごとに認証が求められるということ。。。これ、イケてない。。。
※一応、Googleのヘルプを見ている限り、この操作無くAPI Keyを保存しておけばイケるはずなんですが、色々試しても解決出来なかったので・・・


5.「Resources」から「Use Google APIs」を選択


6.Google APIs Servicesの中からAnalyticsをon!

7.「on」になったことを確認したら、フッターの「Google APIs Console」のリンクをクリック
※本当はauthorization experienceを同意していない場合、ここでAPI Keyを入力する必要がある。


8.飛んだ先のページでAnalytics APIを「on」に。



9.再びScriptの画面に戻って、一度ScriptをRunする。


10.ここで認証が求められるので、「Authorize」を選択。


11.「アクセスを許可」で認証通過!



■使い方
数式として使います。

式の形式は
getData(profileId, metrics, startDate, endDate, filters, dimensions, segment, sort, startindex,
maxresults)

赤字は必須項目です。

それ以外は一応、必須じゃないので省略して構わないのですが、式を動かしてみた際、色々とエラーが発生したので、裏側ではダミーで値をもたせていたりします。

項目の説明はGoogleのヘルプページが一番詳しいです。

ちなみにprofileIdはAnalyticsのURLからも分かりますが、ツールまたはScriptを組んで調べたほうが早いかもしれません。

URLの場合は「~/visitors-overview/a[account ID]w[web property ID]p[profile ID]/」こんな構造になっていますので、「profile ID」を拾ってしまえばOKです。

ツールやScriptに関しては私は有料ツールの無料1ヶ月期間に取得してしまいました。


■残りの項目説明
【metrics/dimensions】
Googleのこのページに書かれている左側がdimension、右側がmetricsです。

Metricsは結果として欲しいデータ、dimensionは切り口みたいなものです。
例えば、先週一週間の日次セッション数を出力したい場合、metricsに「visits」(セッション数)、dimensionに「date」(日次)を指定すれば完了です。

【startDate、endDate】
解析期間のはじめと終わり

【filters】
dimensionまたはmetricsのフィルタです。
filterで使える表現については、Googleのヘルプを参照してください。

【segment】
Advanced Segmentです。「すべて」は「-1」だったり、自分で作ったカスタムセグメントは数字の桁数が多いIDをそれぞれ持っています。

【sort】
単純なソートです。
複数のkeyを入れられますが、先頭から順に第1ソートキー、第2ソートキーとなるようです。

※Spreadsheetで集計していていつも思う不満が、ウェブで出来る「加重」ソートが出来ない事です。ウェブサイトのURL的には「smart」とか付いていたような気がしますが、このAPIを使ったソートでも実装して欲しいなぁ。。。

【startindex/maxresults】
開始位置と表示件数ですが、気にすべきは表示件数の方かもしれません。
ただ、Spreadsheetと連携させたデータ取得では、あまりデータ数を取得することが出来ないと考えておいたほうがいいです。


■制約事項
色々ありますが、、、最大の制約事項は「認証」をするため、そのSpreadsheetのアカウントに解析したいAnalyticsのユーザー権限または管理者権限が付与されていなければならない事でしょう。

一応gmailアカウントだけでなく、企業が使うAppsでも利用できましたので、その辺りでの差別はありません。


■最後に!!
言い訳ですがw
僕、エンジニアじゃないんでソースの中途半端感は許して!w

でも、色々とご指摘いただけると嬉しかったりします。

【読了】良いウェブサービスを支える「利用規約」の作り方

良いウェブサービスを支える「利用規約」の作り方

「ウェブサービスという武器を磨くのと同時に、利用規約という防具も常に新しいものにしなければならない」

サービスを展開する上で準備する必要のある「利用規約」。もちろん「利用規約」で免責事項などを記載していたとしても、その規約自体が法律に照らして違法であるならば、面積とならない事は重々承知していたけれども、具体的に何の法令と照らしあわせて違法になるかなど、細かい部分の知識は全くありませんでした。

本書は細かく業種別に適用される可能性のある法律や過去事例、そして権利義務関係だけでなく「利用規約」や「プライバシーポリシー」、「特定商取引法に基づく表示」の雛形の提示と、その雛形の項目1つ1つの説明まであり、固くない内容に噛み砕かれ、しかも薄めの本にもかかわらず内容の充実と即利用、即見直しという実行動に結びつく構成になっている点は本当に脱帽です。

そして、「当社は、ユーザーが本サービスを利用して生じた損害に関し、一切の責任を負いません」という文章は消費者契約法によって無効にされる条項の代表例として紹介されつつも、「利用規約」それ自体はユーザー対応を簡易化する防具でもあるため、雛形のなかにも一部利用されています。

ECを主体として行なっている企業にとっては、「特定商取引法」が表示を求めている11項目や、通信販売における表示事項のルールがとても参考になるでしょう。表示項目のルールは販売価格や送料などの消費者負担金額を全て表示した場合、代金等の支払い時期などの表示を省略できるか、省略することが出来ないのかが表になったものです。

日本の法律が既存のウェブサービスに追いついていないなどと言って法律を破ってしまうと、最悪事業をたたまなければならなくなったりするわけなので、そのためにもちゃんと適用される可能性のある法律に関しては多少の知識があったほうが良いわけですが、本書の雛形には英語版も付いているので、ぜひ内容を把握した上で活用して、新しいサービスを立ちあげていただきたいと思います。

さて、私は自社の規約でも再度見直しましょうかね・・・w

(以下、自分が知らなかったメモ)
・個人情報収集に関する利用目的として「事業活動に用いるため」や「提供するサービスの向上のため」という書き方では利用目的を具体的に特定できていないと判断されないため不可。

・ウェブで海外向けに動産売買を行う場合「ウィーン売買条約」が適用される可能性がある。

・商標権に関しては、他人が商標登録をする前から使用していた場合、常に他人の商標権に対抗できると思いがちだが、一部を除き、後から他人が取得した商標権に対抗することはできない。

・著作者には「著作者人格権」と「著作財産権」という2種類の権利が自動的に付与される。

・サーバにアップされた著作物を利用規約上無制限・無償で利用できるような書き方をしていた場合でも、あくまで「著作者からライセンスしてもらっている」という立場になる。そのため、そのコンテンツを独占的に利用してビジネスを展開することまでは出来ない。
著作権も譲渡してもらうためには「著作権法第27条及び28条に定める権利を含め」て、無償譲渡を宣言することと、さらに「著作者人格権」に配慮し、著作者人格権の不行使条項を入れる必要がある。

・「利用規約」上では例えば、ユーザー情報の保管、管理に責任を負わないと記載していても、営業資料などで「責任を負う」ような記載があった場合は、利用規約の内容が上書かれる可能性がある。

Google Tag Manager(GTM)を利用してAjaxのページャーからのページ遷移を仮想ページビューとして計測する

Google Tag Manager(GTM)がリリースされてから、徐々に事例が出てきておりますが、今回はAjaxのページャーを仮想ページビューを利用して計測する方法をご紹介します。

今までのAnalyticsであればonclickとして、trackPageviewを発行してあげればいい訳です。

「 onclick="_gaq.push(['_trackPageview', '/services/']);" 」

GTMの場合は、dataLayerを利用しますが、onclickの場合は「dataLayer.push」ですね。
企業側のサイトにはこれから反映させて行く予定ですが、個人環境でテストを実施した内容で一度ご説明いたします。

企業サイトは既にこんな状況でして・・・、ちゃんと整理しないといけない状況に陥っていたりしますが・・・








dataLayerとは・・・

Google側で予め用意しているグローバルオブジェクトなのですが、GTMのコードよりも前に配置
します。

<script>
  dataLayer = [{
    'event': 'transaction'
  }];
</script>
 
使い方としては様々なものが考えられますが、現在私の方で使っているものを少しご紹介します。


1.AnalyticsのEventを利用して、http statusで404や500を計測する。

例えば、こんなdataLayerを404ページに仕掛けておき、404ページに来る手前のページとアクセスした先のページURLをデータで取得できます。

<script>
dataLayer = [{
'event': 'error',
'eventaction' : 'Errorevent',
'eventlabel' : '404.html?page=' + document.location.pathname + document.location.search + '&from=' + document.referrer
}];  </script>
 
この場合、事前に「eventaction」 「eventlabel」をdataLayerタイプとしてマクロに登録しておく必要があります。
GMT側の設定はこんな感じですね。


トラッキングタイプを「イベント」にして、イベントトラッキングのパラメータを指定してあげる。
この部分はマクロでセットした変数を入れてあげればOKです。

2.仮想ページビューをセットする

 Analyticsでよく利用される仮想ページビューの計測もdataLayerを用いて行えます。
ちょっと寂しいのですが、仮想ページビューを発生させたいページには、こんなものを埋め込みます。

<script>
   dataLayer = [{
    'pageUrl': '/service/',
    }];
</script>
 
もちろん、GTM側で「pageUrl」をdataLayer変数としてマクロ設定しておく必要があります。
で、GTM側の設定ですが、


 こんな感じですね。
通常のAnalyticsのトラッキング設定に「基本設定」項目で指定しましょう。

 dataLayer.pushとは・・・

では、dataLayer.pushとは何でしょうか?
今まで説明してきたdataLayerはGTMで発行されたタグよりも前に置くということは説明しましたが、eventトラッキングにしても、仮想ページビューにしても、ページが読み込まれたと同時に発火するのです。

つまり、ページ内でのクリック計測など、今までonclickイベントで取得していた部分が実現出来ないわけです。そこで、dataLayer.pushが登場するわけです!

dataLayer.pushはjavascriptのevent listenerであるとGoogleの説明がありますが、要するにGTMのタグの後に置いて、onclickなどで発火させる事ができるものです。

Googleのサイトの例で言うと、こういう書き方になります。

<a href="#" name="button1" onclick="dataLayer.push({'event': 'button1-click'});" >Button 1</a>
 
onclickでdataLayer.pushを呼び出すわけです。

クリックイベントの計測であれば、例えば、こういう設定です。

<a href="#" name="button1" onclick="dataLayer.push({'event': 'variable1' , 'eventaction' : 'variable2' , 'eventlabel' : 'variable3'});">Button 1</a>


<ここでハマったポイント>
「dataLayer.push」は、「dataLayer」の付属のように紹介されますが、何度もdataLayer.push設定をしてもデータが取得出来ない時がありました。

eコマースなどのtransactionデータを計測する時もそうなのですが、「dataLayer」を利用したデータ取得を再度考えてみると、「dataLayer」の中に識別させるフラグを1つ用意して、

  <script>
  dataLayer = [{
    'event': 'transaction',
    'transactionId' : '●●●●●●●●●',
    'transactionDate' : 'yyyy/MM/dd', ・・・

で、配信ルールとしては、その値をトリガーとする訳です。
例えば・・・



これはdataLayerの変数名「event」が、「transaction」と等しい時に発火!
という事です。

dataLayer.pushも考え方は同様

先程の例で言うと・・・

<a href="#" name="button1" onclick="dataLayer.push({'event': 
'variable1' , 'eventaction' : 'variable2' , 'eventlabel' : 
'variable3'});" >Button 1</a>
 
dataLayerの変数「event」 が「variable1」の時に、イベントトラッキングを発動させるのです。

では、本題!GTMを利用してAjaxのページャーをクリックし、仮想ページビューとしてカウントする方法は?

今までの応用編なだけで、特別な事はありませんが2日間くらい悩んでしまいました。

ページャー。即ちこういうものですが、


Ajaxだと、この部分をクリックしてもページ自体がリフレッシュせずに、ページの内容だけ変わる場合があります。その部分を仮想ページビューを利用してPVとしてカウントしていきます。

また、今回も仮想ページビュー発動条件としてdataLayerの変数「event」を利用すると、例えばonclickにこんな仕掛けをしておけばOKです。

onclick="dataLayer.push({'event':'ajaxpager' , 'pageUrl': '/service2/'});"
 
で、GTM管理画面で通常のAnalyticsのトラッキングタイプ「ページビュー」の配信ルールに

 {{event}} 等しい ajaxpager
 
という設定を追加しておけばOKです。

即ち、発火したら仮想ページビューとして計測されるべきdataLayer変数「pageUrl」の値が入るという仕組みです。

考えてみれば、至極簡単なのですがdataLayerとdataLayer.pushを全く同じものという考えが頭に浮かばなかった事と、未だにjavascriptの動きをちゃんと検証していないということもあって、だいぶ時間を潰してしまいました。

ちなみに!
別にdataLayer.pushを無理に使わなくても、現在は今までの「_trackEvent」を普通に利用してもデータが取得出来るようで、おそらくそれは今後も問題なく利用出来るのではないかと思われます。

Google Analyticsの同期版と非同期版が共存出来ないのと同じように、Google Tag Managerを利用したAnalytics計測と通常の非同期版Analyticsタグは共存できません!



Google Tag Managerの導入について、僕の失敗談を共有します。
コマース系でdataLayerが動いていたので、リリースは上手く行った!と思いきや、いくつか問題が発覚しました。

【問題点】
1.AdwordsとAnalyticsを連結していた場合、Adwordsではコンバージョンが計上されているのにも関わらず、Analytics側でコンバージョンが計測されていない。(常に売上0円)
2.Analyticsの「すべてのページ」で「ページ価値」がほぼ全て0円として表示されている。


2に関連して、ページを種別ごとに区切って計測した場合も全て0円となってしまいました。
この2つを見れば明らかにセッション断が発生しているということが分かるのですが、最初に気づいたのが1だけだったので、何度も個人環境で注文のテストを実施したりしていました。


2つ目の事象が見えてきてからは、何度も混在パターンでAnalyticsへどう計上されるのかをチェックしました。
今回のチェックでセッションが切れている、切れていないというのは「リアルタイム」の「サマリー」を見るだけでも分かる事がわかりました(苦笑


例えば、ページ1からページ2へ画面遷移する場合・・・

■ケース1
ページ1(非同期GA) ⇒ ページ2(GTM)
「上位のアクティブページ」にページ1とページ2の2つがアクティブなページとして見える。


■ケース2
ページ1(GTM) ⇒ ページ2(GTM)
「上位のアクティブページ」にページ2だけがアクティブなページとして見える。


ケース1の場合はセッション断が発生。ケース2が正しい表示となります。


(追記)
まだ私が対応しきれていないのは、eventのdataLayer.pushを使ったデータ送信です。
今のところtrackEventを使って、普通にデータが送信できているので、時間がある時に対応する予定・・・

【メモ】Googleショッピング広告モデル開始に関してGoogle担当者から聞いた内容のメモ

Googleショッピングが商品リスト広告に基づいた商用モデルに移行を開始しておりますので、既に導入を開始している企業もポツポツ出てきていることだと思います。

アメリカでは去年の10月あたりから開始され、先月あたりからCVRなど、その効果が表に出てくるようになりました。

まだ私の勤め先では導入にいたっていませんが、Googleの担当さんから伺った内容を少しシェアしようと思います。(正確性については保証できません・・・)

・GoogleショッピングにアップロードしたデータがAdwords側へ反映するのは最大24時間

・Googleショッピングへフィードで1度にアップロード出来る数量に関しては申請によって上げる事が可能

・GTINが無い、または商品名が英語のみなどでGoogleショッピング上エラーとなっている場合は、申請を出すことでエラーから除外する手続きを行うことが可能

・Googleショッピングで1商品に対して複数の店舗が紐づくにはGTINなど固有の情報の一致が元になっている

・Googleショッピングの各商品の説明は、複数店舗からアップロードされた情報ソースの中で、最も適切だと思われるものをそのまま表示する

・今回の商用モデルでは、PC・タブレットで表示するためのAdwords上限単価とそれを元にしたスマホ側へ表示するための上限単価設定が存在する。例えばPC・タブレットへ表示するための上限を100円/clickとし、スマホをその1/2(つまり50円/click)などと設定する。

・PC・タブレットでは全く表示せず、スマホだけ表示するということは出来ない。限りなくPC・タブレットで表示をしないという程度。

・【この辺重要】Google検索で何のキーワードで検索された場合、どの商品が表示されるかというヒモ付けはブラックボックス。(※Adwords側での単価設定は商品単位ではなく、Adwords_labels単位。つまり商品グルーピング単位)

⇒Google側でその商品に関連していると判断されたキーワードについて、検索結果で商品が表示される。
⇒単価を上げれば商品が表示されるとは限らない

単価を上げる事で表示が増えるかもしれないし、増えないかもしれない状況です。もちろん、実際にクリックが発生すれば検索キーワードも閲覧出来るし、サイトでコンバージョントラッキングをすれば、コンバージョンの結果も見える訳ですが、商品表示という意味では不明瞭です。

つまり、運用の仕方で分析や結果の見え方が変わる可能性があります。
また、今まで以上にGTIN情報などの固有情報などが重要で、情報ソースが1つしかないようなデータのアップロードを行なっていると、商品情報が少ない事などによりGoogle検索には一切表示されないという事が大いに発生しうるのではないかと思うわけです。

その場合は商品名や商品情報に限りなく関連性の高いキーワードで検索された場合のみの表示で、その関連キーワード数が非常に少ないという状況になりかねません。

通常のAdwordsとは考え方を変えて運用しなければならないかもしれませんが、Adwordsと同様に戦略や見たい結果が見えるような設計を入念に行いましょう!

【メモ】DFPを理解するための概念図

Googleの広告プラットフォーム、「DoubleClick for Publishers(DFP)」は全く利用したことがなかったけれども、勤め先で導入検討フェーズから導入へと舵を切り始めたので、サービスを触ったりテストをしながら、まずは自分がDFPの概念と、どのレベルでどの機能が利用できるのかを理解しなければならなかったので、簡単に図を描いてみました。

これから導入を考えている方の理解に、少しでも役立てばと思います。


Googleさんも、その理解で正しいという事だったので、メモとして公開しておきます。

あとは、まだ理解仕切れていなかったのでGoogleさんに色々と質問をしてしまったのですが、そのQと回答の一部をメモとして公開。

Q.ある1広告ユニットで、現在配信されているクリエイティブの一覧を見るページはありますか?
A.ありません

Q.プレースメントに関して、例えばA枠、B枠、C枠の3広告枠あった場合、AとBで1プレースメント、BとCで1プレースメントと、広告枠1つが複数のプレースメントに所属することは可能という理解で良いでしょうか?
A.可能です。

Q.新しい広告申込情報を登録する際、広告枠のサイズを複数選択出来ますが例えば2パターンの広告サイズを指定した場合、広告ユニット、またはプレースメントの設定で、該当広告枠サイズを全て含んでいれば、最適な場所に自動的に表示されるということで良いでしょうか?
A.その通りです。

Q.オーダーごとに配信に関する設定がありますが、広告枠で見た場合、どういう配信状況になるのか理解しきれておりません。例えば自社広告のAオーダーと純広告のBオーダーがあり、同じ広告枠に配信を設定した場合、配信の優先順位は広告申込情報のタイプと配信優先度設定に寄るのでしょうか?
A.その通りです。
ヘルプ参照。

Q.広告枠について、各広告枠のヘッダーへ埋め込むソースに関しては、Tag Managerの「カスタムHTML」タグにて管理することは可能でしょうか?
A.恐らく可能ですが、テスト・動作確認はお願いします。


と、いくつか質問に回答いただいたわけですが、広告申込情報レベルでクリエイティブの表示・非表示の期間設定が出来るのですが、期間が異なるキャンペーンなどを一緒に配信する場合、別の広告申込情報とするか、同じ広告申込情報の中でクリエイティブレベルで「無効」設定へと変更するかになると思います。

広告申込情報が別れれば別れるほど、1クリエイティブごとの配信数、配信比率の管理は非常に難しくなるなぁという印象。もちろん慣れるまでの問題でしょうけど。

今までimp保証で純広告などを受注していた場合、広告申込情報のタイプとその中のクリエイティブごとのウェイトなどにより数値を見ながら細かく調整が最初は必要でしょう。
慣れるといっても人に紐付いた仕事にはしたくないので、数値を色々変えながら実際の配信比率を見て、知識を蓄積していく作業が私には必要かもしれません。

【読了】コンセプトのつくりかた

コンセプトのつくりかた



少しダラダラと読んでしまったので簡潔に。

コンセプト = ビジョンの集合体 + アイテムの集合体

ビジョンの集合体:何をしたいか?(理由としてのWhy)
アイテムの集合体:何を用いるのか?(How)


「~したい」というビジョンと「~を使う」というHowの2つからコンセプトというものを導き出します。
Whyというのは企業として、もしかすると固定なのかもしれません。もしくは部門ごとに違うものなのかもしれません。

今回本書ではコンセプトを導き出すプロセスとして、1つの「コンセプトワーク」の流れを例示しています。
コンセプトワークは簡単に言えばKJ法です。

そのKJ法をサポートするためにメンバーへ質問するポイントとしては以下。

・逆に言うと、どうなる? さらに突き詰めていくと、どうなる?
・悪いことを「絶対に避けられないこと、それが真実だ」と過程すると、どうなる?(ゲームは不健康。など)
・立場をずらしたら、どうなる?(友達なら?奥さんなら?同僚なら?行為を行う側/行われる側なら?)
・関係のない物事を無理やりつなげてみるとどうなる?(ゲームの話の中に、料理の話)
・悪いことについて「自分も悪いことをしている」と仮定すると、どうなる?(それは自分たちにも言える?)
・本音としてはどう?/建前としてはどう?
・2つの悪いことを掛け合わせる(または同時に引き起こす)と、どうなる?(ゲーム脳&ネトゲ廃人)
・時期をずらしたら?
・ドラマ・小説・映画・アニメ・音楽に例えたら?
など。

Whyというのは意外とはっきりしていると思うけれども、Howの部分を構築するのはKJ法などで沢山出して構築していくしかないのかも。。。