Crashlytics与Google Analytics自动查询App Crash-Free Users Rate|Google Apps Script整合实作
针对App开发团队,解决手动查询Crash-Free Users Rate繁琐问题,透过Google Analytics与Crashlytics搭配Google Apps Script,自动将数据填入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
、iOS
orAndroid
针对双平台的 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 提供自动转换与同步技术。