GASでGA4のAPIフィルタ設定方法を解説!(文字列・数値フィルタのコード付き)

2023年1月14日

Google Apps Script(GAS)には、GA4のAPIである「Google Analytics Data API」をサービス追加で簡単に利用できます。

ただ、指標やディメンションの設定は簡単ですが、フィルタ設定は複雑で難易度が高いです。

GA4のAPIをGASで利用する際のフィルタ設定方法を解説します。

従来版GA終了に伴うGA4への切り替え

アクセス解析で事実上ディファクトスタンダードとも言えるGoogle Analytics(GA)は、従来のユニバーサルアナリティクス(UA)からGA4に切り替わっています。

2023年7月1日に従来のUAのデータ収集が停止して利用できなくなる予定です。

そのため、GA利用ユーザーは急ピッチでGA4に切り替えを進めています。

GA4のAPIはGASで手軽に利用可能

そんなGA4にはプログラミング言語からデータを取得できるAPIとして、「Google Analytics Data API」が用意されています。

ただ、通常GA4のAPIを利用するのはかなり複雑です。

Google Analytics Data API(GA4)を有効にすると、ページ遷移

Google Cloud Platform(GCP)の利用登録し、GA4のAPIを有効にし、アクセス権限を設定する必要があります。

しかし、Google Apps Script(GAS)にはGA4のAPIがサービス追加すれば、利用可能です。

Google Apps ScriptプロジェクトのスクリプトエディタにあるサービスからGA4用のAPI「Google Analytics Data API」が追加してGASスクリプトから実行可能に

前述した通常のAPI利用時に行う、GCP側の各種操作は必要ありません。

GASでGA4のAPIを利用する方法は下記の記事で解説しています。

GA4のAPIのフィルタ設定は難しい

Google Apps Script(GAS)では、GA4のAPIを簡単に利用できます。

通常のAPIリクエストでは、UrlfetchApp.fetchメソッドで各種パラメーターを設定して、エンドポイントとなるURLにリクエストします。

一方、GASのサービス追加でGA4のAPIを利用する場合、UrlfetchAppは不要です。

GA4用のクラスが利用できるようになっており、インスタンス化してGA4のAPIからデータを取得できます。

ただ、GA4の指標やディメンションは指定が簡単なのですが、フィルタ設定は複雑です。

フィルタ設定には以下4点指定する必要があります。

  1. フィルタ設定する指標/ディメンション
  2. フィルタの種類
  3. フィルタ条件(一致/含む/より大きい/より小さい)
  4. 条件の値(文字列/数値)

それゆえに、指標やディメンションのように名前を指定するだけでなく、フィルタ設定には条件となる3種類の指定しなければなりません。

GASでGA4APIのフィルタ設定手順

Google Apps Script(GAS)でGA4のAPIリクエストパラメーターにフィルタ設定する際は、Google Analytics Data APIのリファレンス「FilterExpression」ページを参照しましょう。

フィルタ設定時には下記の複数オブジェクトを設定する必要があります。

  1. FilterExpression
  2. FilterExpressionList
  3. Filter(StringFilter,InListFilter,NumericFilter,BetweenFilter)

それぞれのオブジェクトごとに設定すべきフィールド値があり、それらをセットした上でAPIリクエストを実行することでフィルタ適用した結果を取得可能です。

フィルタ設定項目は、Filterの4種類どれを使うかによって設定項目が異なるため、後述のサンプルコードで具体的な設定方法を紹介します。

GA4のAPIでフィルタ設定するGASサンプルコード

実際にGoogle Apps Script(GAS)でGA4のAPIにフィルタ設定のパラメータをつけてリクエストするサンプルコードを解説します。

今回は以下の2パターンのフィルタ設定を施した結果をログ出力してみます。

  1. セッションの参照元/メディアに「organic」が含まれる
  2. セッション数が100以上のもの

まずGASのスクリプトエディタを開き、サービスの「+」をクリックし、「Google Analytics Data API」を追加します。

Google Apps Script(GAS)でGA4のAPI(Google Analytics Data API)をサービス一覧から追加

これで、GASコードから簡単にGA4のAPIにアクセスできるようになります。

セッションの参照元/メディアに「organic」が含まれる

1つ目はディメンションのフィルタで、【「セッションの参照元/メディア」にorganicが含まれる】という条件をセットします。

Google Apps Script(GAS)でGA4のAPIにリクエストしてセッションの参照元/メディアがorganicが含まれるフィルタ条件を適用したデータを取得するサンプルコード
//GA4のAPIから指定したディメンションと指標、フィルタ条件指定して取得する関数
function runGa4Report() {
  //GA4のプロパティIDを設定 ※GA4プロパティIDをセットください。
  const propertyId = '********';
  //APIリクエスト時にエラーが起きやすいため例外処理を追加
  try {
    //GA4から取得する指標を設定する
    const metric = [AnalyticsData.newMetric(),AnalyticsData.newMetric()];
    metric[0].name = 'sessions';
    metric[1].name = 'averageSessionDuration';
    //GA4から取得するディメンションを設定する
    const dimension = [AnalyticsData.newDimension()];
    dimension[0].name = 'sessionSourceMedium';
    //GA4からデータを取得する際のフィルタ条件を設定する
    let dimensionfilter = AnalyticsData.newFilterExpression();
    dimensionfilter.andGroup =  AnalyticsData.newFilterExpressionList();
    dimensionfilter.andGroup.expressions = [];
    let filterExpression = AnalyticsData.newFilterExpression();
    filterExpression.filter = AnalyticsData.newFilter();
    //フィルタ条件として「セッションの参照元/メディアにorganicが含まれる」を設定
    filterExpression.filter.fieldName = 'sessionSourceMedium';
    filterExpression.filter.stringFilter = AnalyticsData.newStringFilter();
    filterExpression.filter.stringFilter.value = 'organic';
    filterExpression.filter.stringFilter.matchType = 'CONTAINS';
    dimensionfilter.andGroup.expressions.push(filterExpression);
    //取得するデータ期間を設定('n'daysAgo)
    const dateRange = AnalyticsData.newDateRange();
    dateRange.startDate = '2daysAgo';
    dateRange.endDate = '2daysAgo';
    //これまで設定した各種設定をリクエストにセット
    const request = AnalyticsData.newRunReportRequest();
    request.dimensions = dimension;
    request.metrics = metric;
    request.dateRanges = dateRange;
    request.dimensionFilter = dimensionfilter;
    //GA4のAPIにリクエスト
    const report = AnalyticsData.Properties.runReport(request,'properties/' + propertyId);
    if (!report.rows) {
      Logger.log('取得できるデータがありませんでした。');
      return;
    }    
    //ディメンションのヘッダー情報を取得
    const dimensionHeaders = report.dimensionHeaders.map(
        (dimensionHeader) => {
          return dimensionHeader.name;
        });
    //指標のヘッダー情報を取得
    const metricHeaders = report.metricHeaders.map(
        (metricHeader) => {
          return metricHeader.name;
        });
    const headers = [...dimensionHeaders, ...metricHeaders];
    //ディメンションと指標のヘッダー情報をログ出力
    console.log(headers);
    //ディメンション×指標のレポートを出力する
    const rows = report.rows.map((row) => {
      const dimensionValues = row.dimensionValues.map(
          (dimensionValue) => { 
            return dimensionValue.value;
          });
      const metricValues = row.metricValues.map(
          (metricValues) => {
            return metricValues.value;
          });
      return [...dimensionValues, ...metricValues];
    });
    //ディメンションごとの指標の値を出力
    console.log(rows);
  } catch (e) {
    //エラーが起きた場合にエラー情報を出力
    Logger.log('Failed with error: %s', e);
  }
}

まず4行目でGA4のプロパティIDを設定しているので、取得したいGA4のプロパティIDを設定します。

指標は「セッション数」と「セッション滞在時間」の2種類、ディメンションは「セッションの参照元/メディア」を設定しています。

15行目~25行目がフィルタ設定を行っている箇所です。

FilterExpression、FilterExpressionList、Filterのオブジェクトを生成します。

FilterにはstringFilterでフィルタ設定となるフィールド名、フィルタ値、フィルタ条件をセットします。

GASのサンプルコードを実行すると、フィルタ設定が適用されたGA4のレポートデータがログ出力されます。

Google Apps Script(GAS)でGA4のAPIにリクエストしてセッションの参照元/メディアがorganicが含まれるフィルタ条件を適用したデータを取得するサンプルコードを実行した結果、フィルタ結果が適用された結果がログ出力

「セッションの参照元/メディアにorganicが含まれる」というフィルタで絞り込んだため、direct/noneや、referralの項目がありません。

そのため、想定通りにフィルタが適用されたGA4のデータが取得できていることがわかります。

セッション数が100以上のもの

続いて指標のフィルタで、【「セッション数」が100以上】という条件をセットします。

前述のGASサンプルコードの15~25行目、35行目のリクエスト部分を修正します。

セッション数が100以上というフィルタ設定でGA4のAPIからデータを取得するGoogle Apps Script(GAS)のサンプルコード(フィルタ設定部分抜粋)
//GA4のAPIから指定したディメンションと指標、フィルタ条件指定して取得する関数
function runGa4Reportv2() {
  //GA4のプロパティIDを設定 ※GA4プロパティIDをセットください。
  const propertyId = '********';
  //APIリクエスト時にエラーが起きやすいため例外処理を追加
  try {
    //GA4から取得する指標を設定する
    const metric = [AnalyticsData.newMetric(),AnalyticsData.newMetric()];
    metric[0].name = 'sessions';
    metric[1].name = 'averageSessionDuration';
    //GA4から取得するディメンションを設定する
    const dimension = [AnalyticsData.newDimension()];
    dimension[0].name = 'sessionSourceMedium';
    //GA4からデータを取得する際のフィルタ条件を設定する
    let metricfilter = AnalyticsData.newFilterExpression();
    metricfilter.andGroup =  AnalyticsData.newFilterExpressionList();
    metricfilter.andGroup.expressions = []; 
    let filterExpression = AnalyticsData.newFilterExpression();
    filterExpression.filter = AnalyticsData.newFilter();
    //フィルタを設定する指標・ディメンションを設定※条件に応じて書き換え
    filterExpression.filter.fieldName = 'sessions';
    //指標などで数値フィルタ(未満、以上、等しい)を設定する場合はnumericFilterをセット
    filterExpression.filter.numericFilter = AnalyticsData.newNumericFilter();
    //フィルタの条件(未満、以上、等しい)をoperationプロパティに設定※条件に応じて書き換え
    filterExpression.filter.numericFilter.operation = 'GREATER_THAN';
    //フィルタ条件を満たす値をnumericValue.doubleValueに設定※値に応じて書き換え
    let numericValue = AnalyticsData.newNumericValue();
    numericValue.doubleValue = 100;
    filterExpression.filter.numericFilter.value = numericValue;
    metricfilter.andGroup.expressions.push(filterExpression);
    //取得するデータ期間を設定('n'daysAgo)
    const dateRange = AnalyticsData.newDateRange();
    dateRange.startDate = '2daysAgo';
    dateRange.endDate = '2daysAgo';
    //これまで設定した各種設定をリクエストにセット
    const request = AnalyticsData.newRunReportRequest();
    request.dimensions = dimension;
    request.metrics = metric;
    request.dateRanges = dateRange;
    request.metricFilter = metricfilter;
    //GA4のAPIにリクエスト
    const report = AnalyticsData.Properties.runReport(request,'properties/' + propertyId);
    if (!report.rows) {
      Logger.log('取得できるデータがありませんでした。');
      return;
    }    
    //ディメンションのヘッダー情報を取得
    const dimensionHeaders = report.dimensionHeaders.map(
        (dimensionHeader) => {
          return dimensionHeader.name;
        });
    //指標のヘッダー情報を取得
    const metricHeaders = report.metricHeaders.map(
        (metricHeader) => {
          return metricHeader.name;
        });
    const headers = [...dimensionHeaders, ...metricHeaders];
    //ディメンションと指標のヘッダー情報をログ出力
    console.log(headers);
    //ディメンション×指標のレポートを出力する
    const rows = report.rows.map((row) => {
      const dimensionValues = row.dimensionValues.map(
          (dimensionValue) => { 
            return dimensionValue.value;
          });
      const metricValues = row.metricValues.map(
          (metricValues) => {
            return metricValues.value;
          });
      return [...dimensionValues, ...metricValues];
    });
    //ディメンションごとの指標の値を出力
    console.log(rows);
  } catch (e) {
    //エラーが起きた場合にエラー情報を出力
    Logger.log('Failed with error: %s', e);
  }
}

さきほどはstringFilterでしたが、数値型フィルタなので、numericFilterで数値と条件を設定していきます。

フィルタの数値はAnalyticsData.newNumericValue()をインスタンス化して、doubleValueプロパティにセットするのがポイントです。

フィルタ条件を書き換えたGASサンプルコードを実行すると、ログ出力でセッション数が100以上のものが抽出できます。

セッション数が100以上というフィルタ設定でGA4のAPIからデータを取得するGoogle Apps Script(GAS)のサンプルコード(フィルタ設定部分抜粋)を実行した結果、ログ出力にGA4のフィルタ抽出データが表示

1つ目のフィルタ適用結果とは異なり、organic以外のディメンションも表示されるものの、100未満のものは表示されなくなっています。

今回紹介したstringFilterとnumericFilterのGASサンプルコードを参考にすれば、別の指標やディメンションで色々なフィルタ条件を指定可能です。

まとめ・終わりに

今回、GA4のAPI「Google Analytics Data API」でGoogle Apps Script(GAS)からリクエストする際にフィルタ条件を設定する方法を紹介しました。

GASにはサービス機能からGA4のAPIが追加できるため、簡単にリクエストが実行できます。

しかし、GA4のAPIリクエスト時にフィルタ設定するのは、指標やディメンションを設定するよりも複雑です。

そこで、「ディメンションに○○が含まれる」のstringFilterと「指標の数値が○○以上」のnumericFilterの2つの設定方法を解説しました。

GASサンプルコードのフィルタ設定部分を変更すれば、色々なフィルタ設定が可能です。

ぜひ、今回紹介したGASサンプルコードを参考にして、フィルタ適用したGA4のレポートを抽出してみてください。