記事

CrashlyticsとGoogle Analytics連携|AppのCrash-Free Users率を自動取得する方法

Google Apps ScriptでGoogle AnalyticsからCrashlyticsのCrash-Free Users率を自動取得し、Google Sheetsに即時反映。手動作業を削減し、リアルタイムで安定性を把握可能です。

CrashlyticsとGoogle Analytics連携|AppのCrash-Free Users率を自動取得する方法

本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。

記事一覧


Crashlytics + Google Analytics で App のクラッシュフリーユーザー率を自動取得

Google Apps Script を使って Google Analytics 経由で Crashlytics のデータを取得し、Google Sheet に自動入力する方法

前回の「 Crashlytics + Big Query でよりリアルタイムで便利なクラッシュ追跡ツールを作る 」では、Crashlytics のクラッシュ記録を Raw Data として Big Query にエクスポートし、Google Apps Script を使って自動スケジュールで Top 10 クラッシュをクエリし、Slack チャンネルに通知を送る方法を紹介しました。

本稿は、Appのクラッシュに関連する重要なデータである Crash-Free Users Rate(クラッシュの影響を受けていないユーザーの割合) の自動化の続きです。多くのAppチームがこのデータを継続的に追跡・記録していると思いますが、これまでは手動での確認が一般的でした。本稿の目的は、この繰り返し作業を自動化し、手動確認時のデータ貼り間違いを防ぐことです。前述のとおり、Firebase Crashlyticsはユーザーがデータを取得できるAPIを提供していないため、Firebaseのデータを他のGoogleサービスに連携し、そのサービスのAPIを通じて関連データを取得します。

最初、このデータも Big Query から取得できると思っていました。しかし実際には全く違いました。Big Query はクラッシュの生データであり、クラッシュしなかったユーザーのデータは含まれていないため、Crash-Free Users Rate を算出できません。この要件に関する情報はネット上に少なく、長時間調べてようやく Google Analytics というキーワードが出てきました。Firebase の Analytics や Event は GA と連携してクエリ可能なのは知っていましたが、Crash-Free Users Rate のデータも含まれているとは思いませんでした。GA の API を調べてみて、ビンゴでした!

[API Dimensions & Metrics](https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=en){:target="_blank"}

API Dimensions & Metrics

Google Analytics Data API (GA4) は2つの指標(Metrics)を提供しています:

  • crashAffectedUsers :クラッシュの影響を受けたユーザー数

  • crashFreeUsersRate :クラッシュの影響を受けていないユーザーの割合(小数で表示)

ルートがわかったら、実際の実装を始めましょう!

Firebase と Google Analytics の連携

公式説明 の手順設定を参照してください。本記事では省略します。

GA4 クエリエクスプローラーツール

コードを書く前に、公式が提供する Web GUI ツールを使ってクエリ条件を素早く作成し、クエリ結果を取得できます。結果が望むものであることを確認してから、コードを書き始めましょう。前

前往 >>> GA4 Query Explorer

  • 左上で必ず GA4 を選択してください

  • 右側でアカウントにログイン後、該当する GA アカウントとプロパティを選択してください。

  • Start Date、EndDate:日付を直接入力するか、特殊変数で日付を表すことができます(yesterdaytoday30daysAgo7daysAgo)。

  • metrics:crashFreeUsersRate を追加

  • dimensions:platform(デバイスの種類 iOS/Android/Desktop など)を追加する

  • dimension filter:platformstringexactiOSまたはAndroidを追加

両プラットフォームの Crash Free Users Rate をそれぞれクエリする。

一番下までスクロールして「Make Request」をクリックすると、指定した日付範囲内の Crash-Free Users Rate を確認できます。

Firebase Crashlytics を開いて、同じ条件のデータと比較することもできます。

ここで両者の数値にわずかな差(0.0002の差)が見られましたが、原因は不明です。ただし許容範囲内の誤差です。GAのCrash-Free Users Rateを統一して使う場合は誤差とは言えません。

Google Apps Script を使ってデータを自動的に Google Sheet に入力する

次に自動化の部分です。Google Apps Script を使って GA の Crash-Free Users Rate のデータを取得し、自動で Google Sheet に入力します。これにより自動入力と自動追跡を実現します。

上図のように Google Sheet があるとします。

Google Sheet の上部メニューから Extensions -> Apps Script をクリックして Google Apps Script を作成するか、こちらの Google Apps Script を開き、左上の「新しいプロジェクト」をクリックしてください。

入ったらまず上部の「未命名專案名稱」をクリックし、プロジェクト名を付けてください。

左側の「Services」で「+」をクリックし、「Google Analytics Data API」を追加します。

先ほどの GA4 Query Explorer ツールに戻り、Make Request ボタンの隣にある「Show Request JSON」をチェックすると、この条件の Request JSON を取得できます。

この Request JSON を Google Apps Script に変換すると以下のようになります:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Google Analytics Data APIをサービスに追加することを忘れないでください。さもないとこのエラーが表示されます: ReferenceError: AnalyticsData is not defined
// https://ga-dev-tools.web.app/ga4/query-explorer/ -> プロパティID
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google シート名
const googleSheetName = "App Crash-Free Users Rate";

function execute() {
  Logger.log(fetchCrashFreeUsersRate())
}

function fetchCrashFreeUsersRate(platform = "iOS", startDate = "30daysAgo", endDate = "today") {
  const dimensionPlatform = AnalyticsData.newDimension();
  dimensionPlatform.name = "platform";

  const metric = AnalyticsData.newMetric();
  metric.name = "crashFreeUsersRate";

  const dateRange = AnalyticsData.newDateRange();
  dateRange.startDate = startDate;
  dateRange.endDate = endDate;

  const filterExpression = AnalyticsData.newFilterExpression();
  const filter = AnalyticsData.newFilter();
  filter.fieldName = "platform";
  const stringFilter = AnalyticsData.newStringFilter()
  stringFilter.value = platform;
  stringFilter.matchType = "EXACT";
  filter.stringFilter = stringFilter;
  filterExpression.filter = filter;

  const request = AnalyticsData.newRunReportRequest();
  request.dimensions = [dimensionPlatform];
  request.metrics = [metric];
  request.dateRanges = dateRange;
  request.dimensionFilter = filterExpression;

  const report = AnalyticsData.Properties.runReport(request, "properties/" + propertyId);

  return parseFloat(report.rows[0].metricValues[0].value) * 100;
}
  • GA プロパティID:同様に先ほどの GA4 Query Explorer ツールから取得できます:

最初の Property 選択メニューで選んだ Property の下に表示されている数字が propertyId です。

以上のコードを Google Apps Script の右側のコードエリアに貼り付け、上部の実行メニューから「execute」関数を選択して、デバッグで正常にデータが取得できるか確認してください:

初回実行時に認証ウィンドウが表示されます:

手順に従ってアカウント認証を完了してください。

実行に成功すると、下のログに Crash-Free Users Rate が表示され、クエリが成功したことを示します。

次に、自動で Google Sheet に入力するだけで完成です!

完全なコード:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Google Analytics Data APIをサービスに追加することを忘れないでください。そうしないと、ReferenceError: AnalyticsData is not defined エラーが発生します。

// https://ga-dev-tools.web.app/ga4/query-explorer/ -> プロパティID
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google シート名
const googleSheetName = "";

function execute() {
  const today = new Date();
  const daysAgo7 = new Date(new Date().setDate(today.getDate() - 6)); // 今日を含まないので -6

  const spreadsheet = SpreadsheetApp.openById(googleSheetID);
  const sheet = spreadsheet.getSheetByName(googleSheetName);
  
  var rows = [];
  rows[0] = Utilities.formatDate(daysAgo7, "GMT+8", "MM/dd")+"~"+Utilities.formatDate(today, "GMT+8", "MM/dd");
  rows[1] = fetchCrashFreeUsersRate("iOS", Utilities.formatDate(daysAgo7, "GMT+8", "yyyy-MM-dd"), Utilities.formatDate(today, "GMT+8", "yyyy-MM-dd"));
  rows[2] = fetchCrashFreeUsersRate("android", Utilities.formatDate(daysAgo7, "GMT+8", "yyyy-MM-dd"), Utilities.formatDate(today, "GMT+8", "yyyy-MM-dd"));
  sheet.appendRow(rows);
}

function fetchCrashFreeUsersRate(platform = "iOS", startDate = "30daysAgo", endDate = "today") {
  const dimensionPlatform = AnalyticsData.newDimension();
  dimensionPlatform.name = "platform";

  const metric = AnalyticsData.newMetric();
  metric.name = "crashFreeUsersRate";

  const dateRange = AnalyticsData.newDateRange();
  dateRange.startDate = startDate;
  dateRange.endDate = endDate;

  const filterExpression = AnalyticsData.newFilterExpression();
  const filter = AnalyticsData.newFilter();
  filter.fieldName = "platform";
  const stringFilter = AnalyticsData.newStringFilter()
  stringFilter.value = platform;
  stringFilter.matchType = "EXACT";
  filter.stringFilter = stringFilter;
  filterExpression.filter = filter;

  const request = AnalyticsData.newRunReportRequest();
  request.dimensions = [dimensionPlatform];
  request.metrics = [metric];
  request.dateRanges = dateRange;
  request.dimensionFilter = filterExpression;

  const report = AnalyticsData.Properties.runReport(request, "properties/" + propertyId);

  return parseFloat(report.rows[0].metricValues[0].value) * 100;
}

上部の Run or Debug をもう一度クリックして「execute」を実行します。

Google Sheet に戻り、データの追加が成功しました!

トリガーの追加と自動実行のスケジュール設定

左側の時計ボタンを選択 -> 右下の「+ Add Trigger」。

  • 最初の関数で「execute」を選択してください。

  • time based trigger は週次タイマーを選択し、毎週データを追跡&追加します

設定が完了したら、Save をクリックしてください。

完了

現在から、AppのCrash-Free Users Rateデータの記録と追跡を完全自動化します。手動での検索や入力は不要で、すべて機械に任せて自動処理します!

私たちはAppのクラッシュ問題の解決に専念するだけです!

p.s. 前回の記事でBig Queryを使ってデータを照会するには費用がかかりましたが、本記事でのCrash-Free Users Rateの取得やGoogle Apps Scriptの利用は完全に無料で安心して使えます。

結果をSlackチャンネルに同期して送信したい場合は、前回の記事を参照してください:

関連記事

ご質問やご意見がございましたら、こちらからご連絡ください

Post は Medium から ZMediumToMarkdown によって変換されました。


🍺 Buy me a beer on PayPal

👉👉👉 Follow Me On Medium! (1,053+ Followers) 👈👈👈

本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。

Improve this page on Github.

本記事は著者により CC BY 4.0 に基づき公開されています。