複数のGA4のプロパティをGASで自動作成

:::note warn
本記事は2022年7月時点での内容になります。最新情報については公式サイトなどを確認願います。
::: 

Google Analyticsはユニバーサルアナリティクス（UA）にはビューがあったので、特定の人に特定のディレクトリだけ見せたいなどの時に、ビューを活用していたと思います。しかしGA4にはビューがないため、別プロパティを作成する人も多いでしょう。 

※Stream IDを活用して、閲覧者にはGA4にはアクセスさせずにデータポータルを使ってStream IDでビューのようなやり方をすることも可能です。

# Google Analytics Admin API、Google Sheet、Google Apps Scriptで作成
全世界に運航しているとある航空会社のUAではビューで国別のフライトを分けていたのですが、GA4ではプロパティで分ける事になり、約20個のGA4プロパティを作成し、各プロパティに約30個のカスタムディメンションを作成しなければなりませんでした。

20×30＝600個ものカスタムディメンションを作成しなければなりません。1個20秒で作成したとしても3時間以上かかりますし、どこかで間違えを起こしても見落とす可能性大なのでかなり疲弊します。そこで今回はGoogle Apps Scriptで[Google Analytics Admin API](https://developers.google.com/analytics/devguides/config/admin/v1)を使用して一括作成します。

## 作業手順
全てを一気にやることも可能ですが、今回はわかりやすくするためにプロパティの作成とカスタムディメンションの作成を分けて行います。手順は下記になります。

1. Google SheetにGA4プロパティに必要な情報の一覧を作成
2. Google Apps Scriptで上記を読み込み、複数のGA4プロパティを作成
3. Google SheetにGA4プロパティの一覧とカスタムディメンションの一覧を作成（次回）
4. Google Apps Scriptで上記を読み込み、各プロパティにカスタムディメンションを作成（次回）

# Google SheetにGA4プロパティに必要な情報の一覧を作成
Google Sheetに「properties」シートを作成し、そのシートのA列～E列に下記を記入していきます。

- A列：アカウントID（※accounts/アカウントIDという記述にしてください）
- B列：プロパティ名
- C列：カテゴリ（カテゴリ一覧を参照して当てはまるものを記入 今回は旅行なのでTRAVEL）
- D列：タイムゾーン
- E列：通貨
- F列：空欄（プロパティが作成されたプロパティIDがここに入ります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/b5638c3a-70b6-5e3b-8ee0-faffbbae33fc.png)


# Google Apps Scriptでプロパティを自動生成
今回はGoogle Apps Script（GAS）を使いますが、スクリプトの流れは以下になります。

1. 上記のGoogle Sheetsから必要な情報を読み込む
2. GA4プロパティを1つずつ作成

## Google Sheetsから必要な情報を読み込む
さきほどGoogle Sheetの「properties」シートに作成した情報を読み込む関数getPropetiesConfig()を作成します。

※sheet.getRange(2,1,tmpLastRow-1,5).getValues()でもあっさり取得できますが、プロパティ作成後にプロパティIDをGoogle Sheetに追記したいことなどから下記のように1つずつ読み込んでいます。

```
const FILEKEY ="abcdefghijklmno"; // GoogleSheetのキー（URLの一部分） 例：https://docs.google.com/spreadsheets/d/abcdefghijklmno/edit#gid=0

function getPropetiesConfig(){
  var sheetName = 'properties';
  var retConfig = [];
  var spreadsheet = SpreadsheetApp.openById(FILEKEY);
  //  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);
  var tmpLastRow = sheet.getLastRow();
//  var retConfig= sheet.getRange(2,1,tmpLastRow-1,5).getValues();
//  return retConfig;
  for(var i = 2;i <= sheet.getLastRow();i++){
   var val = sheet.getRange(i, 1).getValue();
    if (!val) {
      break;
    }else{
      var tmp ={};
      tmp['row'] = i;
      tmp['parent'] = sheet.getRange(i,1).getValue();
      tmp['displayName'] = sheet.getRange(i,2).getValue();
      tmp['industryCategory'] = sheet.getRange(i,3).getValue();
      tmp['timeZone'] = sheet.getRange(i,4).getValue();
      tmp['currencyCode'] = sheet.getRange(i,5).getValue();
      retConfig.push(tmp);
    }
  } 
    return retConfig;
}
```

## GA4プロパティを作成
### ServiceからGoogle Analytics Admin APIを追加
GA4のプロパティ作成などをするには[Google Analytics Admin API](https://developers.google.com/analytics/devguides/config/admin/v1)が必要になります。GASの「Service」から追加することでGoogle Analytics Admin APIが使用可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/038914bf-94ad-991e-9a97-b16770d11720.png)


Serviceから「Google Analytics Admin API」を検索して追加。（Identifierはそのまま「AnalyticsAdmin」にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/1796c3f3-48d6-399b-45a7-6da77174c070.png)


追加したら「Service」の下に「AnalyticsAdmin」が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/05f7ed81-06e2-0021-57ac-754e035e48dd.png)


無事Google Analytics Admin APIを追加できたら、createProperty()関数を記述します。AnalyticsAdmin.Properties.create関数でプロパティを作成します。

```
function createProperty(parent, displayName, industryCategory, timeZone, currencyCode){
  try{
    var property = {
      "parent": parent,
      "displayName": displayName,
      "industryCategory": industryCategory,
      "timeZone": timeZone,
      "currencyCode":currencyCode,
    }
    var property = AnalyticsAdmin.Properties.create(property);
    return property;
  }catch(e){
    Logger.log(e.message);
    throw ("createPropery:" + displayName + "\te.message");
  }
}
```


参考：[https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1alpha/properties/create](https://developers.google.com/analytics/devguides/config/admin/v1/rest/v1alpha/properties/create)

## 作成したプロパティのIDを取得
前述の```var property = AnalyticsAdmin.Properties.create(property) ```を実行後、propertyには新しく生成されたGA4プロパティが入るので、property.nameでプロパティIDを取得できますが、```properties/```が前に含まれているため取り除く必要があります。

### GA4プロパティの作成を繰り返して、プロパティIDをGoogle Sheetに追記
getPropetiesConfig()関数で取得したプロパティID個数分、createProperty関数を実行して、結果を再びGoogle Sheetに追記します。

```
function main(){
  var properties= getPropetiesConfig();
  var retProps = [];
  for(var i=0;i<properties.length;i++){
    var property = properties[i];
    property = createProperty(property);
    retProps.push(property);
    var propertyId = property.name.replace("properties/",""); // プロパティIDからproperties/を削除
    Logger.log(p.row +"\t" + p.displayName +"\t" + propertyId);
    setPropertyIdToSheet(p.row, propertyId);
  }
 // Logger.log(retProps);
}
/*
* 結果をpropertiesシートのF列に追記する
*/
function setPropertyIdToSheet(row, propertyId){
  var sheetName = 'properties';
  var retConfig = [];
  var spreadsheet = SpreadsheetApp.openById(FILEKEY);
  var sheet = spreadsheet.getSheetByName(sheetName);
  sheet.getRange(row, 6).setValue(propertyId);
  return true;
}
```

mainを実行するとGoogle Sheetで記入したアカウントの下にGA4プロパティが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/3627b4e7-d185-2ab6-31af-54f6ff2f25db.png)

そして、Google SheetのF列にプロパティIDが追記されている事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/6f6e356a-7289-9a4d-5f63-150ef7eaa6e1.png)


プロパティ名やカテゴリ、タイムゾーン、通貨もきちんと反映されていればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939399/5c7d30f9-97e5-c2e1-d4fe-b298ef4541ee.png)


P.S 別件で40個のプロパティを作成することになりました。。。