見出し画像

Google Analyticsの情報を毎週自動で収集する

今回はGoogle Analyticsで収集されている情報を定期的に集計し、特定のSlackのチャンネルに自動的に通知してくれるシステムをご紹介します。

自社でも個人でもHPを保有している場合、アクセス解析などを行うシーンがあると思いますが、その際週間単位でどのぐらいアクセス数に変化があったのかなど、一定スパンで記録をしていくことによって施策に対する変動を追いやすくなります。それを都度GA4にアクセスしてログをダウンロードして所定のExcelやスプレッドシートに収集する部分を自動化し、尚且つ通知をさせていくのが今回の趣旨になります。

今回の最終系

最終系はこちらです。
↓Slackの画面

こんな感じで毎週定刻に集計されたスプレッドシートのURLが通知されます。

そのスプレッドシートのはこのような感じです。

ページ単位で訪問された数(セッション)閲覧数(ビュー)が集計されています。

今回の条件

①ページ単位収集
・表示単位:ページのタイトル+ページのパス
・表示値:セッション数、ビュー数
・表示件数:上位30ページ
・期間:前週1週間分

②起点単位収集
・表示単位:流入元×デバイス×属性
・表示件数:上位30媒体
・取得値:セッション数
・期間:前週1週間分
例)l.instagram.com / referral × mobile × new 30

今回はこの二つのデータを集計してシートに自動で貼り付けていきます。
これによりどのページが多くみられているのか?あるいは、どこから流入してくるのが多いか?などを1週間単位で確認する事ができます。

全体の流れ

  • SLACKのBOTを作る

  • GASでプログラムを書く

今回も例に漏れずGASを活用していきます。
GASには「Analytics Data」という標準ライブラリが用意されており、GA4にアクセスするための関数が用意されています。
それを応用して↑に挙げて条件を満たすプログラムを組んでいきます。
※プログラムはコピペで行けるのでご心配なく
(一部IDやKeyなどはご自身の環境の値に置換していただく必要があります)

その前に本件はSlackに自動で投稿する必要がありますので、まずはSlackでBOTを作っていきます。
BOTの作成に関してはこちらの記事がわかりやすいので参考にしてみてください。

GA4の準備

GA4のデータをGASから取得するには、プロパティIDが必要になるのでメモします。

右上グレーの部分に書いてあるものを控えておきます。

スプレッドシートの準備

任意のスプレッドシートに二つシートを追加します。

「ページ単位収集シート」
A列:取得日
B列:ページタイトル
C列:ページパス
D列:セッション数
E列:ページ閲覧数

「起点単位収集シート」
A列:取得日
B列:流入元
C列:デバイス
D列:属性
E列:セッション数

GASの準備

GAS側でも少し設定が必要です。用意されているライブラリを利用できるようにします。
ライブラリの+ボタンをクリックし、「Google Analytics Data API」を選択します。

コード全体

こちらが今回のコード全体です。


// GA4からデータを持ってくる関数

function ga4(id,metArray,dimArray,limit,orderdesc,ordername){
  const propertyid = id
  const metrics = metArray.map(value=>{
    const met = AnalyticsData.newMetric()
    met.name = value
    return met
  })
  const dimension = dimArray.map(value=>{
    const dim = AnalyticsData.newDimension()
    dim.name = value
    return dim
  })
  const daterange = AnalyticsData.newDateRange()
  daterange.startDate = "7daysAgo"
  daterange.endDate = "yesterday"
  const orderBy=AnalyticsData.newOrderBy()
  orderBy.desc = orderdesc
  const metricsOrderby = AnalyticsData.newMetricOrderBy()
  metricsOrderby.metricName = ordername
  orderBy.metric = metricsOrderby
  const request = AnalyticsData.newRunReportRequest()
  request.metrics = [metrics]
  request.dimensions = [dimension]
  request.dateRanges = daterange
  request.orderBys = orderBy
  request.limit = limit
  const report = AnalyticsData.Properties.runReport(request,"properties/"+propertyid)
  return report
}

// スプレッドシートにデータを張り付ける関数
function toss(report,ssid,shname){
  const ss = SpreadsheetApp.openById(ssid)
  const sh = ss.getSheetByName(shname)
  const lastRow = sh.getLastRow()
  if(!report.rows){
    return console.log("対象のデータがありません")
  }
  const datas = report.rows.map((row) => {
    const dimensionValues = row.dimensionValues.map((dimensionValue) => {
      return dimensionValue.value;
    });
    const metricValues = row.metricValues.map((metricValues) => {
      return metricValues.value;
    });
    const back = [...dimensionValues, ...metricValues];
    const today = Utilities.formatDate(new Date(),"JST","MM/dd");
    back.unshift(today)
  return back;
  })
  sh.getRange( lastRow + 1, 1, datas.length, datas[0].length).setValues(datas)
}

// パラメーターのクラス
class parameter{
  constructor(metrics = [],dimension = []){
    this.metrics = metrics
    this.dimension = dimension
  }
}

// Slackに通知する関数
function postslack(token,channnel,url){
  const params = {
    "method":"POST",
    "payload":{
      "token":token,
      "channel":channnel,
      "text":`先週一週間分のHP閲覧履歴です。\n${url}`
    }
  }
  UrlFetchApp.fetch("https://slack.com/api/chat.postMessage",params)
}

// ↑3つを実行する関数
function exe(){
  const propertyId = "GA4からメモしたプロパティID";
  const ssId = "スプレッドシートのID";
  const order = "30"; //今回は上位30件表示
  const orderdesc = "true"; //今回はするのでtrue
  const orderName = "sessions";  //今回はセッション数で降順
  let metarray = ["sessions","screenPageViews"];  //ページ単位収集のメトリクス配列
  let dimarray = ["pageTitle","pagePath"];  //ページ単位収集のディメンション配列
  const pageDataParam = new parameter(metarray, dimarray);
  const pageData = ga4(propertyId, pageDataParam.metrics, pageDataParam.dimension, order, orderdesc, orderName);
  toss(pageData, ssId, "ページ単位収集");
  metarray = ["sessions"]; //起点単位収集のメトリクス配列
  dimarray = ["sessionSourceMedium","deviceCategory","newVsReturning"]; //起点単位収集のディメンション配列
  const inflowDataParam = new parameter(metarray, dimarray);
  const inflowData = ga4(propertyId, inflowDataParam.metrics, inflowDataParam.dimension, order, orderdesc, orderName);
  toss(inflowData, ssId, "起点単位収集");
  const token = "Slack BOTのトークン";
  const channel = "Slackのチャンネル名";
  const shURL = "スプレッドシートのURL";
  postslack(token, channnel, shURL);
}

プログラムは大きく3つに分類されます。

  1. GA4からデータを持ってくる

  2. スプレッドシートに転置する

  3. Slackに通知する

  4. ↑3つを実行する関数

GASをまだ理解しきれていなく、引数に配列を指定すると正常に動作しなかった為、パラメーターのクラスを用意してそこに一旦配列を格納し再度呼び出すことで関数に値を差し込んでいます。

トリガーの設定

最後にトリガーを設定していきます。

このようにして毎週月曜日の9時~10時の間に前週1週間分のGA4のデータが収集されるようになりました。

是非皆さんも試してみてください。

この記事が気に入ったらサポートをしてみませんか?