Crashlytics + Google Analytics 自动查询 App Crash-Free Users Rate
使用 Google Apps Script 透过 Google Analytics 查询 Crashlytics 自动填入到 Google Sheet
Click here to view the English version of this article.
點擊這裡查看本文章正體中文版本。
基于 SEO 考量,本文标题与描述经 AI 调整,原始版本请参考内文。
文章目录
Crashlytics + Google Analytics 自动查询 App Crash-Free Users Rate
使用 Google Apps Script 透过 Google Analytics 查询 Crashlytics 自动填入到 Google Sheet
上篇「 Crashlytics + Big Query 打造更即时便利的 Crash 追踪工具 」我们将 Crashlytics 闪退纪录 Export Raw Data 到 Big Query,并使用 Google Apps Script 自动排程查询 Top 10 Crash & 发布讯息到 Slack Channel。
本篇接续自动化一个与 App 闪退相关的重要数据 — Crash-Free Users Rate 不受影响使用者的百分比 ,想必很多 App Team 都会持续追纵、纪录此数据,以往都是传统人工手动查询,本篇目标是将此重复性工作自动化、也能避免人工查询时可能贴错数据的状况;同之前所述,Firebase Crashlytics 没有提供任何 API 供使用者查询,所以我们同样要借助将 Firebase 数据串接到其他 Google 服务,再透过该服务 API 查询相关数据。
一开始我以为这个数据同样能从 Big Query 查询出来;但其实这方向完全错误,因为 Big Query 是 Crash 的 Raw Data,不会有没有闪退的人的数据,因此也算不出 Crash-Free Users Rate;关于这个需求在网路上的资料不多,查询许久才找到有人提到 Google Analytics 这个关键字;我知道 Firebase 的 Analytics、Event 都能串到 GA 查询使用,但没想到 Crash-Free Users Rate 这个数据也包含在内,翻阅了 GA 的 API 后,Bingo!
Google Analytics Data API (GA4) 提供两个 Metrics:
crashAffectedUsers :受闪退影响的使用者数量
crashFreeUsersRate :不受闪退影响的使用者百分比(小数表示)
知道路通之后,就可以开始动手实作了!
串接 Firebase -> Google Analytics
可参考 官方说明 步骤设定,本篇省略。
GA4 Query Explorer Tool
开始写 Code 之前,我们可以先用官方提供的 Web GUI Tool 来快速建造查询条件、取得查询结果;实验完结果是我们想要的之后,再开始写 Code。前
在左上方记得选到 GA4
右方登入完帐号后,选择相应的 GA Account & Property
- Start Date、EndDate:可直接输入日期或用特殊变数表示日期 (
ysterday,today,30daysAgo,7daysAgo)
- metrics:增加
crashFreeUsersRate
- dimensions:增加
platform(设备类型 iOS/Android/Desktop. . . )
- dimension filter:增加
platform、string、exact、iOSorAndroid
针对双平台的 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
// Remeber add Google Analytics Data API to Services, or you'll see this error: ReferenceError: AnalyticsData is not defined
// https://ga-dev-tools.web.app/ga4/query-explorer/ -> property id
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google Sheet 名称
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 Property ID:一样也可以由刚刚的 GA4 Query Explorer 工具取得:
在一开始的选择 Property 选单中,选择的 Property 下方的数字就是 propertyId 。
googleSheetID:可以由 Google Sheet 网址中取得 https://docs.google.com/spreadsheets/d/
googleSheetID/editgoogleSheetName:Google Sheet 中闪退纪录的 Sheet 名称
将以上程式码贴到 Google Apps Script 右方程式码区块&上方执行方法选择「execute」function 后可以点击 Debug 测试看看是否能正常取得资料:
第一次执行会出现要求授权视窗:
按照步骤完成帐号授权即可。
执行成功会在下方 Log Print 出 Crash-Free Users Rate,代表查询成功。
再来我们只要再加上自动填入 Google Sheet 就大功告成了!
完整 Code:
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
// Remeber add Google Analytics Data API to Services, or you'll see this error: ReferenceError: AnalyticsData is not defined
// https://ga-dev-tools.web.app/ga4/query-explorer/ -> property id
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google Sheet 名称
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,数据新增成功!
新增 Trigger 排程自动执行
选择左方时钟按钮 -> 右下方「+ Add Trigger」。
第一个 function 选择「execute」
time based trigger 可选择 week timer 每周追踪&新增一次数据
设定完点击 Save 即可。
完成
现在开始,纪录追踪 App Crash-Free Users Rate 数据完全自动化;不需要人工手动查询&填入;全部交给机器自动处理!
我们只需专注在解决 App Crash 问题!
p.s. 不同于上一篇使用 Big Query 需要花钱查询资料,此篇查询 Crash-Free Users Rate、Google Apps Script 都是完全免费,可以放心使用。
如果想将结果同步发送到 Slack Channel 可参考 上一篇文章 :
延伸阅读
Ultimate Beginner’s Guide to Google Analytics 4 (NEW 2023 Interface) (Thanks to Emma for providing the information )
有任何问题及指教欢迎 与我联络 。
本文首次发表于 Medium (点击查看原始版本),由 ZMediumToMarkdown 提供自动转换与同步技术。


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



















