CrashlyticsとGoogle Analytics連携|AppのCrash-Free Users率を自動取得する方法
Google Apps ScriptでGoogle AnalyticsからCrashlyticsのCrash-Free Users率を自動取得し、Google Sheetsに即時反映。手動作業を削減し、リアルタイムで安定性を把握可能です。
本記事は 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 を調べてみて、ビンゴでした!
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 に変換すると以下のようになります:
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 です。
googleSheetID:Google SheetsのURLから取得できます https://docs.google.com/spreadsheets/d/
googleSheetID/editgoogleSheetName:Google Sheet 内のクラッシュ記録用シート名
以上のコードを 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 によって変換されました。
本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。


{:target="_blank"}](/assets/793cb8f89b72/1*4BVf-FMVcY1UbVuLwfKOQg.webp)



















