6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GA4のストリーム情報一覧をGASでスプレッドシートに出力する

Last updated at Posted at 2022-06-09

自分のGoogleアカウントが権限を持っている全GA4プロパティが持つストリーム情報をGoogle Apps Scriptを使ってGoogleスプレッドシートに出力する方法について。

この方法でGA4計測タグ設定の測定IDから対応するプロパティを見つけることができます。

image.png

背景

GA4の計測タグ設定はデータストリームの測定ID情報を持っていますがプロパティに関する情報を持っておらず、管理画面からも検索できないため、GA4計測タグがデータを送信しているプロパティが分からなくなってしまう場合があります。
GA4側の管理画面の機能アップデートが期待されますが、それまでは Google Analytics Admin API を叩いて情報を抽出する必要があります。
本記事で紹介する方法ではこのAPIをGASから叩いて結果をGoogleスプレッドシートに出力します。

GA4計測タグ
データストリームの測定ID情報しか持たない。

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX');
</script>

執筆時点でGA4の管理画面から測定IDを使ったプロパティの検索は不可能。
image.png

使い方

1. 準備

まず、ブラウザに複数のGoogleアカウントでログインしている場合はGASを編集する前に予めGoogleアカウントからログアウト、GA4のストリーム情報出力を行いたいGoogleアカウントのみでログインしている状態にします。
これはマルチログイン状態だとGASを編集するページが以下のようなエラーにより正常に開けない場合があるためです。

image.png

Googleスプレッドシートの準備

新しいスプレッドシートにGoogle Sheetを作成し、結果を出力したいシートに resultというシート名を付けます。
image.png

あとで使うのでこのSheetのURLの /d/ の後に続く英数字(シートID)をどこかにメモして下さい。

https://docs.google.com/spreadsheets/u/1/d/[[ここの半角英数字]]/edit

GASの準備

上部の「拡張機能」>「App Script」からGASの編集画面を開きます。
image.png

左側メニューの「サービス」の隣のプラスボタンをクリックして、
リストから「Google Analytics Admin API」を選択して「追加」をクリックします。

image.png

既に入力されている function myFunction() { }のコードをすべて消して、代わりに以下コードを貼り付けます。

function main() {
  const FILE_ID = 'INSERT_YOUR_SHEET_ID_HERE';
  const SHEET_NAME = 'result';
  const resultSheet = SpreadsheetApp.openById(FILE_ID).getSheetByName(SHEET_NAME);

  resultSheet.clear();

  const startTime = new Date();
  let results = [];
  let accountSummaryNextPageToken = undefined;
  while(true){
    let accounts = getAccountSummaries(100, accountSummaryNextPageToken);
    let result = [];
    if(accounts !== null){
      result = getGa4Streams(accounts) || [];
      results.push(...result);
    }
    console.log(`accountSummaries.list > accounts.nextPageToken: ${accounts.nextPageToken}`);
    let elapsedTime = parseInt((new Date() - startTime) / 1000); // GASは6分以上連続で動作できないため経過時間チェック
    if(elapsedTime >= 300){  // 5分経過したら処理を強制終了させる
      console.log('アカウントが多すぎるため、処理が中断されました');
      break;
    }
    if(result.length = 0 || typeof accounts.nextPageToken === 'undefined'){
      break;
    }
    accountSummaryNextPageToken = accounts.nextPageToken;
  }

  const resultHeaders = Object.keys(results[0]);
  const resultBody = results.map((row) => {
    return resultHeaders.map((key) => row[key] || '');
  });
  const resultTable = [resultHeaders].concat(resultBody);
  const tableRange = resultSheet.getRange(1, 1, resultTable.length, resultTable[0].length);
  tableRange.setValues(resultTable);
  tableRange.applyRowBanding();
  console.log('スプレッドシートへの出力が完了しました');
}

function getAccountSummaries(pageSize=200, nextPageToken) {
  try {
    const params = {
      pageSize: pageSize,
      pageToken: nextPageToken
    }
    const accounts = AnalyticsAdmin.AccountSummaries.list(params);
    if (!accounts.accountSummaries || !accounts.accountSummaries.length) {
      console.log('No accounts found.');
      return null;
    }
    return accounts;
  } catch (e) {
    console.log('getAccountSummaries failed with error: %s', e.error);
  }
}

function getGa4Streams(accounts) {
  let results = [];
  try {
    for(const account of accounts.accountSummaries){
      const accountId = account.name.split('/')[1];
      console.log(`${accountId} : ${account.displayName}`);
      if (account.propertySummaries) {
        properties = AnalyticsAdmin.Properties.list({filter: 'parent:' + account.account});
        if (properties.properties !== null) {
          for(const property of properties.properties){
            const propertyID = property.name.replace('properties/','');
            const streams = AnalyticsAdmin.Properties.DataStreams.list(property.name);
            console.log(`  └ ${propertyID} :  ${property.displayName}`);
            if(typeof streams.dataStreams !== 'undefined') {
              for(const dataStream of streams.dataStreams) {
                let result = {
                  'accountId': accountId,
                  'accountName': account.displayName,
                  'propertyId': propertyID,
                  'propertyName': property.displayName,
                  'streamId': dataStream.name,
                  'streamName': dataStream.displayName,
                  'streamType': dataStream.type,
                  'streamCreateTime': dataStream.createTime,
                  'streamAndroidFirebaseAppId': dataStream.androidAppStreamData && dataStream.androidAppStreamData.firebaseAppId,
                  'streamAndroidPackageName': dataStream.androidAppStreamData && dataStream.androidAppStreamData.packageName,
                  'streamIosBundleId': dataStream.iosAppStreamData && dataStream.iosAppStreamData.bundleId,
                  'streamWebMeasurementId': dataStream.webStreamData && dataStream.webStreamData.measurementId,
                  'streamWebDefaultUrl': dataStream.webStreamData && dataStream.webStreamData.defaultUri
                };
                console.log(`    └ ${result.streamId} : ${result.streamName}`);
                results.push(result);
              }
            }
          }
        }
      }
    }
    return results;
  } catch (e) {
    console.log('getGa4Streams failed with error: %s', e.error);
  }
}

コードを貼り付けたら、 INSERT_YOUR_SHEET_ID_HEREの文字列を先ほどメモしたスプレッドシートのURL内に登場した文字列で書き換えた上で、フロッピーディスクアイコンをクリックして「保存」します。
image.png

GASの実行

実行する関数に「main」が選ばれていることを確認、選ばれていなければ「main」に変更の上、「実行」ボタンをクリックしてコードの実行を開始します。
image.png

初回実行時のみ、承認およびスクリプトを信用していいか尋ねられるので許可します。

「権限を確認」をクリック
image.png
アカウントを選択
image.png
自作スクリプトに対して警告が出るので「詳細」をクリック
image.png
「…に移動」をクリック
image.png
「許可」をクリックしてコードを実行
image.png

実行ログウィンドウが表示されてぐるぐる処理し始めるので待機。
アカウントの量によっては実行完了まで数分掛かります。
image.png

GASの実行結果

実行ログに「実行完了」と表示されたらスプレッドシートにストリームの情報が出力されています。

image.png

ウェブストリームの測定IDから対応するプロパティを調べたいときはstreamWebMeasurementId列から対応する測定IDを探せばOKです。

うまく動かない場合

シート名の書き換えやコード内のINSERT_YOUR_SHEET_ID_HEREの書き換えを行ったか確認して下さい。
また、GASの制限により本ツールは5分で処理を打ち切るように設定しているため、あまりに紐づいているアカウント数が多いと一部のアカウント情報を取得できない場合があります。

メモ: GTMでGA4タグ設定を行うとき

対応するプロパティが分からなくなると上記のような面倒なことをしないといけなくなるので、予め設定時にメモにプロパティの情報を残すことをオススメします。
image.png

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?