Post

Crashlytics与Google Analytics自动查询App Crash-Free Users Rate|Google Apps Script整合实作

针对App开发团队,解决手动查询Crash-Free Users Rate繁琐问题,透过Google Analytics与Crashlytics搭配Google Apps Script,自动将数据填入Google Sheet,实现数据追踪自动化,提高效率并降低错误率。

Crashlytics与Google Analytics自动查询App Crash-Free Users Rate|Google Apps Script整合实作

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!

[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) 提供两个 Metrics:

  • crashAffectedUsers :受闪退影响的使用者数量

  • crashFreeUsersRate :不受闪退影响的使用者百分比(小数表示)

知道路通之后,就可以开始动手实作了!

串接 Firebase -> Google Analytics

可参考 官方说明 步骤设定,本篇省略。

GA4 Query Explorer Tool

开始写 Code 之前,我们可以先用官方提供的 Web GUI Tool 来快速建造查询条件、取得查询结果;实验完结果是我们想要的之后,再开始写 Code。前

前往 >>> GA4 Query Explorer

  • 在左上方记得选到 GA4

  • 右方登入完帐号后,选择相应的 GA Account & Property

  • Start Date、EndDate:可直接输入日期或用特殊变数表示日期 ( ysterday , today , 30daysAgo , 7daysAgo )

  • metrics:增加 crashFreeUsersRate

  • dimensions:增加 platform (设备类型 iOS/Android/Desktop. . . )

  • dimension filter:增加 platformstringexactiOS or 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
// 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;
}

在一开始的选择 Property 选单中,选择的 Property 下方的数字就是 propertyId

将以上程式码贴到 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 可参考 上一篇文章

延伸阅读

有任何问题及指教欢迎 与我联络


Buy me a beer

本文首次发表于 Medium (点击查看原始版本),由 ZMediumToMarkdown 提供自动转换与同步技术。

Improve this page on Github.

This post is licensed under CC BY 4.0 by the author.