GTMで行ったこと

## GTMの中にGA4タグとUAタグを包括する

2023年7月にUAタグが廃止されGA4に完全移行するので、google analyticsでGA4を作成
(今までUAタグだけが埋め込まれていた)

手順
1. アナリティクスの管理を開く
1. GA4設定アシスタント
1. プロパティを作成
終わり！

いきなりGA4だけにしなくても良いので、GTMの中にGA4とUAの両方を入れる
→ GTM上で操作できる！

## GTMのAPIを使って、全トリガーをスプレットシートで管理

#### 背景
- トリガーの量が膨大
- 1トリガーの中に複数条件が存在
- URLを変える頻度が高い

#### スプレットシート上のメニュータブをクリックするだけ
1. 今GTM上で設定されているトリガー全てをスプレットシートに書き込む
1. スプレットシートで編集したURLをGTM上に反映できる

#### 問題点
- workspaceIdだけ公開される度に数字が上がってしまうため、workspaceIdを見にGTMに入らなければならない
- 変更は1トリガー単位で更新しなければならない
- まだ、新規作成はGTM上で行わなければならない

#### コード

    // スプレットシート
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const trigger = ss.getSheetByName("スプレットシート名");
    const tag = ss.getSheetByName("スプレットシート名");

    // スプレットシートから各IDを取得
    const accountId = tag.getRange("B1").getValue();
    const containerId = tag.getRange("D1").getValue();
    const workspaceId = tag.getRange("F1").getValue();

    // リクエストパラメータ
    const request_parameters = 'accounts/' + accountId + '/containers/' + containerId + '/workspaces/' + workspaceId;

    // GTMのトリガー取得
    function getTriggers() {
      const triggers = TagManager.Accounts.Containers.Workspaces.Triggers.list(request_parameters);
      const formattedData = []

      triggers.trigger.map((value) => {
        const id = value.triggerId
        const name = value.name
        const type = value.type

        // formattedDataに整形したデータを格納していく
          if (value.filter !== undefined){
            value.filter.map((filterValue) => {
            formattedData.push([id, name,type,filterValue.parameter[0].value,filterValue.type,filterValue.parameter[1].value])
          })
          }else{
            formattedData.push([id, name, type,"","",""])
          }
      })
      trigger.getRange(2, 2, formattedData.length, 6).setValues(formattedData);
    }

    // GTMのトリガー更新
    function updateTriggers() {
      const getRange = trigger.getRange("A2:G");
      const values = getRange.getValues();

      // チェックボックスにチェックがついている行を判定
      const checkBox = values.filter(([value])=>{
        return value === true
      })
      // トリガーの設定が複数の処理
      const filter = checkBox.map(([,triggersId,name,type,value1,filterType,value2])=>{
        return  {
                  "parameter": [
                    {
                      "type": "template",
                      "key": "arg0",
                      "value": value1
                    },
                    {
                      "type": "template",
                      "value": value2,
                      "key": "arg1"
                    }
                  ],
                  "type": filterType
                }
      }) 

      const triggersId = checkBox.flat()[1]
      const name = checkBox.flat()[2]
      const type = checkBox.flat()[3]
      
      // 更新の処理
      TagManager.Accounts.Containers.Workspaces.Triggers.update(
        {
          "name": name,
          "type": type,
          "filter": [filter]
        }, request_parameters + "/triggers/" + triggersId);    
    }

    // チェックボックスを外す
    function deleteCheckBox() {
      const getRange = trigger.getRange("A2:A");
      const values = getRange.getValues();
      trigger.getRange(2, 1, values.length, 1).setValue([false]);
    }

※変数tagのスプレットシートには、アカウントID、コンテナID、ワークスペースIDを読み取るシートになってます。

 ## 最後に
変数名が微妙なところや強引に書いている部分、上記で記載した問題点は要改善が必要です...

## 参考文献

https://www.data-be.at/magazine/ga4-gtm/

https://www.data-be.at/magazine/ga4-property/

https://developers.google.com/tag-manager/api/v2/reference