Google Analytics Data APIの割り当て履歴を集計可能な形に変える

# ▼背景
Google Analytics Data APIには1日ごとや1時間ごとに割り当て制限がされている。

https://www.ever-rise.co.jp/dx-blog/ga4-api-limit/#1google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9360%E3%81%AE%E5%88%A9%E7%94%A8

Google Analytics Data APIの割り当て履歴を確認し、上限を超えていないかを確認する必要があった。
割り当て履歴はGA4の管理画面上にて確認できる。
しかし、ファイルエクスポート機能がサポートされておらず、表示された結果を他の場所にコピーして集計する必要がある。
また、貼り付けを行うと集計しずらい形で張り付けられてしまう問題があった。
この問題をGASで解決して集計を行ったため、この一連の流れを説明する。

# ▼GA4管理画面で割り当て履歴を確認する方法

アカウント > Account Data APIの割り当て履歴

期間を設定すれば写真のように表示される。

![api_rireki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/232f00a6-00ec-4ac0-af05-a75b82627961.png)

# ▼起きた問題
エクスポートが出来ないため、コピーしてスプレッドシートに貼り付けて集計するしかない

貼り付けてみると以下のようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/f0c8f1f2-075c-491b-ac80-1b978767e63a.png)

これでは時間ごとに消費トークン数を集計するなどの作業が行いづらい

# ▼行った対処法
GASで列に展開する関数を作成することで対処を行った。

## 完成形
この形に変形する処理をGASにて行った

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/8d5bbdb9-32a2-4745-8dec-8c033748689c.png)


## GASスクリプト
この関数を実行すると"シート1"シートに貼り付けたAPI割り当て履歴が列に展開され、写真の通り完成形の形で別のシートにコピーされる。

```javascript
function transposeDataWithHeader() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = ss.getSheetByName("シート1"); // 元データのシート
  if (!sourceSheet) {
    Logger.log("シート1 が見つかりません");
    return;
  }
  
  const data = sourceSheet.getRange("A:A").getValues().flat().filter(String); // A列のデータを取得
  const numRows = 6; // 6行ごとに1セット
  const rowCount = data.length;
  
  // 新しいシートを作成（タイムスタンプ付き）
  const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd");
  const newSheetName = "割り当て履歴_" + timestamp;
  const targetSheet = ss.insertSheet(newSheetName);
  
  // ヘッダーを設定
  const headers = ["日付", "時間", "タイムゾーン", "プロパティ名", "プロジェクト名", "実行者", "コア数"];
  targetSheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  
  const output = [];

  // 6行ごとに処理
  for (let i = 0; i < rowCount; i += numRows) {
    if (i + numRows > rowCount) break; // 不完全なセットは無視

    // 日付と時間の解析
    const dateTimeStr = data[i]; // "2025年1月21日 4:00:00 GMT+9"
    const dateTimeParts = dateTimeStr.match(/(\d{4}年\d{1,2}月\d{1,2}日) (\d{1,2}:\d{2}:\d{2}) (GMT[+-]\d+)/);
    
    if (!dateTimeParts) continue; // 解析に失敗した場合はスキップ
    
    const datePart = dateTimeParts[1]; // "2025年1月21日"
    const timePart = dateTimeParts[2]; // "4:00:00"
    const timezonePart = dateTimeParts[3]; // "GMT+9"

    // 日付を Date オブジェクトに変換
    const formattedDate = new Date(datePart.replace(/年|月/g, "/").replace(/日/, "")); // "2025/01/21" に変換
    const formattedTime = timePart; // "04:00:00"

    output.push([
      formattedDate,  // 日付 (Excelで正しく認識)
      formattedTime,  // 時間
      timezonePart,   // タイムゾーン
      data[i + 1],    // プロパティ名
      data[i + 2],    // プロジェクト名
      data[i + 3],    // 実行者
      data[i + 5]     // コア数（5行目の"コア"は無視）
    ]);
  }
  
  // 新しいシートにデータを書き込み
  if (output.length > 0) {
    targetSheet.getRange(2, 1, output.length, headers.length).setValues(output);
    Logger.log("データ変換が完了しました！ 新しいシート: " + newSheetName);
  } else {
    Logger.log("変換するデータがありませんでした。");
  }
}

```
# ▼集計を行う
ここまでこれたら後はスプレッドシートにて自由に集計するだけ

## 消費コア数が多い日付・時間・プロジェクトなどを特定する

スプレッドシートにてコア数を基準に降順ソート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/0eb82be8-c3d2-422f-bbe5-55c922ce6905.png)

## 日付ごとに合計コア数を集計する
様々な方法が考えられるが、私はピポッドテーブルを使用した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/81dd30bb-6f16-4b22-9786-8707416e5fba.png)