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 を調べてみて、ビンゴでした!

Google Analytics Data API (GA4) は2つの指標(Metrics)を提供しています:
-
crashAffectedUsers :クラッシュの影響を受けたユーザー数
-
crashFreeUsersRate :クラッシュの影響を受けていないユーザーの割合(小数で表示)
ルートがわかったら、実際の実装を始めましょう!
Firebase と Google Analytics の連携
公式説明 の手順設定を参照してください。本記事では省略します。
GA4 クエリエクスプローラーツール
コードを書く前に、公式が提供する Web GUI ツールを使ってクエリ条件を素早く作成し、クエリ結果を取得できます。結果が望むものであることを確認してから、コードを書き始めましょう。前

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

- Start Date、EndDate:日付を直接入力するか、特殊変数で日付を表すことができます(
yesterday、today、30daysAgo、7daysAgo)。

- metrics:
crashFreeUsersRateを追加

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

- dimension filter:
platform、string、exact、iOSまたは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 に変換すると以下のようになります:
// 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 です。
-
googleSheetID:Google SheetsのURLから取得できます https://docs.google.com/spreadsheets/d/
googleSheetID/edit -
googleSheetName:Google Sheet 内のクラッシュ記録用シート名

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

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

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

実行に成功すると、下のログに Crash-Free Users Rate が表示され、クエリが成功したことを示します。
次に、自動で Google Sheet に入力するだけで完成です!
完全なコード:
// 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 によって変換されました。



コメント