GA4 移行対応 JavaクライアントでFilterExpressionListを使って条件を複数指定する方法

こんにちは、エキサイト株式会社メディア事業部所属のエンジニアの岩藤です。

Universal Analyticsを利用できるのも後少しですね。

GoogleAnalytics4(以下GA4)へ移行中方も多いのではないでしょうか。 私もランキングプログラムの移行真っ最中です。

今回GA4でランキング生成を行うにあたり、言語もPHP からJavaへの切り替えも行いました。 その際に複数条件を書く方法にハマってしまったので、備忘録を残したいと思います。

切り替えは下記をもとに行いました。 developers.google.com github.com

Betaという名前が気になりますが、とりあえず入れたら動きました。

PVレポートを作るときはURLの絞り込みを行うことが多いと思います。 絞り込みを行う場合は、FilterExpressionクラスを使うようです(下記はurlパターンで絞り込みしてます)

FilterExpression filterExpression = FilterExpression.newBuilder()
    .setFilter(
        Filter.newBuilder()
            .setFieldName("pagePath")
            .setStringFilter(
                Filter.StringFilter.newBuilder()
                    .setMatchType(Filter.StringFilter.MatchType.PARTIAL_REGEXP)
                    .setValue(pathRegex)
            ).build()
        ).build();

RunReportRequest request = RunReportRequest.newBuilder()
    .setProperty("properties/" + propertyId)
    .addDimensions(Dimension.newBuilder().setName("pagePath"))
    .addMetrics(Metric.newBuilder().setName("screenPageViews"))
    .setDimensionFilter(filterExpression)
    .addDateRanges(
        DateRange.newBuilder()
            .setStartDate(startDate)
            .setEndDate(endDate)
      )
     .build();

そして、条件が一つの場合は上記でいいのですが、複数条件を書くFilterを場合は別の書き方が必要でした。 FilterExpressionListとFilterExpressionを使い、複数のFilterExpressionをAndもしくはOrで纒める事で、 複数条件を指定できました。

FilterExpression filter1 = FilterExpression.newBuilder()
    .setFilter(
        Filter.newBuilder()
            .setFieldName("pagePath")
            .setStringFilter(
                Filter.StringFilter.newBuilder()
                    .setMatchType(Filter.StringFilter.MatchType.PARTIAL_REGEXP)
                    .setValue(pathRegex)
             ).build()
     ).build();

FilterExpression filter2 = FilterExpression.newBuilder()
        .setFilter(
            Filter.newBuilder()
                .setFieldName("session")
                .setStringFilter(
                    Filter.StringFilter.newBuilder()
                        .setMatchType(Filter.StringFilter.MatchType.EXACT)
                        .setValue("session_p")
                 ).build()
     ).build();

FilterExpressionList expressionList = FilterExpressionList.newBuilder()
    .addExpressions(filter1)
    .addExpressions(filter2)
    .build();

FilterExpression filterExpression = FilterExpression.newBuilder()
    .setAndGroup(expressionList)
    .build();

setAndGroupだけでなく、setOrGroup等が用意されています。 これでどんな条件も指定できそうですね!