如何使用 Google Analytics Data API (GA4) Java 客户端库按维度过滤?

How to filter by dimension using Google Analytics Data API (GA4) Java client library?

我正在尝试使用 Java 客户端库调用 Google Analytics Data API (GA4) 并应用维度过滤器。如果我不使用 setDimensionFilter 调用,这是有效的调用:

RunReportRequest request =
    RunReportRequest.newBuilder()
        .setProperty(propertyId)
        .addDimensions(com.google.analytics.data.v1beta.Dimension.newBuilder().setName("pageLocation"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("screenPageViews"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("activeUsers"))
//        .setDimensionFilter(FilterExpression.newBuilder().setFilter(Filter.newBuilder().setStringFilter(
//             Filter.StringFilter.newBuilder()
//               .setMatchType(Filter.StringFilter.MatchType.FULL_REGEXP)
//               .setField(Descriptors.FieldDescriptor, "pageLocation")
//               .setValue("MY_REGEXP")
//               .build())))
        .addDateRanges(com.google.analytics.data.v1beta.DateRange.newBuilder()
        .setStartDate(startDate.toStringYYYYMMDDWithDashes())
        .setEndDate(endDate.toStringYYYYMMDDWithDashes()))
        .setKeepEmptyRows(true)
        .build();

我不知道如何使用setDimensionFilter。如果前面代码中注释的用法是正确的,那么唯一缺少的就是对 setField 的调用。我不知道如何生成 Descriptors.FieldDescriptor 实例(甚至它的含义)。

我已经查看了 client library javadoc, and also the code samples(非常简单,不幸的是没有显示 setDimensionFilter 的任何用法)。

Descriptors.FieldDescriptor 不是 GA4 数据的一部分 API,而是 protobuf 框架的内部功能

如果您尝试在名称为 'pageLocation' 的字段上调用此过滤器而不是使用 setField,我认为您可以这样做

RunReportRequest request =
    RunReportRequest.newBuilder()
        .setProperty("properties/" + propertyId)
        .addDimensions(com.google.analytics.data.v1beta.Dimension.newBuilder().setName("pageLocation"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("screenPageViews"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("activeUsers"))
        .setDimensionFilter(FilterExpression.newBuilder()
            .setFilter(Filter.newBuilder()
                .setFieldName("pageLocation")
                .setStringFilter(Filter.StringFilter.newBuilder()
                    .setMatchType(Filter.StringFilter.MatchType.FULL_REGEXP)
                    .setValue("MY_REGEXP"))))
        .addDateRanges(com.google.analytics.data.v1beta.DateRange.newBuilder()
            .setStartDate("2020-03-31")
            .setEndDate("2021-03-31"))
        .build();

另外,如果您想要一个关于如何使用 setDimensionFilter 的额外示例,这里是另一个可能有帮助的代码示例

RunReportRequest request =
          RunReportRequest.newBuilder()
              .setProperty("properties/" + propertyId)
              .addDimensions(Dimension.newBuilder().setName("city"))
              .addMetrics(Metric.newBuilder().setName("activeUsers"))
              .addDateRanges(DateRange.newBuilder().setStartDate("2020-03-31").setEndDate("today"))
              .setDimensionFilter(FilterExpression.newBuilder()
                  .setAndGroup(FilterExpressionList.newBuilder()
                      .addExpressions(FilterExpression.newBuilder()
                          .setFilter(Filter.newBuilder()
                              .setFieldName("platform")
                              .setStringFilter(Filter.StringFilter.newBuilder()
                                  .setMatchType(Filter.StringFilter.MatchType.EXACT)
                                  .setValue("Android"))))
                      .addExpressions(FilterExpression.newBuilder()
                          .setFilter(Filter.newBuilder()
                              .setFieldName("eventName")
                              .setStringFilter(Filter.StringFilter.newBuilder()
                                  .setMatchType(Filter.StringFilter.MatchType.EXACT)
                                  .setValue("in_app_purchase"))))))
              .setMetricFilter(FilterExpression.newBuilder()
                  .setFilter(Filter.newBuilder()
                      .setFieldName("sessions")
                      .setNumericFilter(Filter.NumericFilter.newBuilder()
                          .setOperation(Filter.NumericFilter.Operation.GREATER_THAN)
                          .setValue(NumericValue.newBuilder()
                              .setInt64Value(1000)))))
              .build();