
GA4 のデータを月次で自動集計する仕組みを以前の記事で作りました。
GA4の月次データ集計が面倒すぎる|Apps Scriptでスプレッドシートに完全自動化して気づいたこと
月次データでも月ごとの傾向はつかめますが、「特定の日にアクセスが急増した原因を調べたい」「どの曜日にアクセスが多いか確認したい」という場面では、日単位のデータがないと分析できません。
そこで、全体データの集計単位を月次から日次に変更しました。 Apps Script のコードを3箇所修正するだけで対応できます。 ページランキングのデータは月次のまま変更しません。
変更前と変更後の違い
まず、今回の変更で何がどう変わるかを整理します。
| 項目 | 変更前 | 変更後 | |---|---|---| | 全体データの集計単位 | 月次(年月ごと) | 日次(日ごと) | | 全体データのシート名 | 全体データ | 全体データ | | ページランキング | 月次(変更なし) | 月次(変更なし) |
Apps Script の変更方法
スプレッドシートのメニューから「拡張機能」>「 Apps Script 」を開き、エディタに表示されているコードを修正します。
変更1:集計単位を「月」から「日」に変える
appendOverallData 関数の中に、 GA4 へどんなデータを要求するかを指定している部分があります。
変更前
javascriptdimensions: [{ name: 'yearMonth' }],
変更後
javascriptdimensions: [{ name: 'date' }],
dimensions とは「データをどの切り口で集計するか」を指定する項目です。
'yearMonth' は「年月単位」、 'date' は「日単位」を意味します。
ここを書き換えることで、取得されるデータの粒度が月ごとから日ごとに変わります。
あわせて、日付を古い順(昇順)で並べるための設定も追加します。 この設定がないと、日付がバラバラの順番でシートに書き込まれてしまいます。
追加する内容
javascriptorderBys: [{ dimension: { dimensionName: 'date' }, desc: false }]
orderBys はデータの並び順を指定する項目です。
desc: false が「昇順(古い順)」を意味します。
変更2:日付の表示形式を変える
GA4 から受け取る日付データの形式が変わるため、スプレッドシートへの書き込み方も変える必要があります。
'yearMonth' を使っていたときは 202601 という6桁の形式で受け取り、 2026/01 に変換していました。
'date' に変えると 20260101 という8桁の形式で受け取ります。これを 2026/01/01 という形式に変換するよう書き換えます。
変更前
javascriptconst ym = row.dimensionValues[0].value; return [ ym.substring(0, 4) + '/' + ym.substring(4, 6), ... ];
変更後
javascriptconst d = row.dimensionValues[0].value; const dateStr = d.substring(0, 4) + '/' + d.substring(4, 6) + '/' + d.substring(6, 8); return [ dateStr, ... ];
substring は文字列の一部を切り出す処理です。
20260101 という8桁の文字列に対して、以下のように3つに分割してスラッシュでつなぎ合わせています。
substring(0, 4)→2026(先頭から4文字)substring(4, 6)→01(5文字目から2文字)substring(6, 8)→01(7文字目から2文字)
結果として 2026/01/01 という形式でスプレッドシートに書き込まれます。
変更3:過去データ一括取得の関数に全体データを追加する
過去分を一括取得するための runHistoricalPageData 関数は、もともとページランキングのみを取得する設計になっています。
全体データ(日次)も過去分を取得できるよう、1行追加します。
変更前
javascriptappendPageRankingData(startDate, endDate);
変更後
javascriptappendOverallData(startDate, endDate); // この1行を追加 appendPageRankingData(startDate, endDate);
変更後のスクリプト全体
以下が変更後のスクリプト全体です。 Apps Script のエディタに貼り付ける前に、以下の2箇所をご自身の環境に合わせて書き換えてください。
- 1行目の
'123456789'→ ご自身の GA4 プロパティ ID(数字のみ) startYearとstartMonth→ 過去データの取得開始年月
GA4 プロパティ ID の確認方法は、前回の記事をご参照ください。
GA4の月次データ集計が面倒すぎる|Apps Scriptでスプレッドシートに完全自動化して気づいたこと
javascript// ↓ご自身のGA4プロパティID(数字のみ)を入力してください const PROPERTY_ID = '123456789'; // 過去データを一括取得する用(初回のみ手動で実行) function runHistoricalPageData() { const startYear = 2023; // ← 取得開始年を変更してください const startMonth = 1; // ← 取得開始月を変更してください const today = new Date(); const endYear = today.getFullYear(); const endMonth = today.getMonth(); let currentYear = startYear; let currentMonth = startMonth; while (currentYear < endYear || (currentYear === endYear && currentMonth <= endMonth)) { const firstDay = new Date(currentYear, currentMonth - 1, 1); const lastDay = new Date(currentYear, currentMonth, 0); const startDate = Utilities.formatDate(firstDay, Session.getScriptTimeZone(), 'yyyy-MM-dd'); const endDate = Utilities.formatDate(lastDay, Session.getScriptTimeZone(), 'yyyy-MM-dd'); appendOverallData(startDate, endDate); appendPageRankingData(startDate, endDate); currentMonth++; if (currentMonth > 12) { currentYear++; currentMonth = 1; } } } // 毎月5日に自動実行するプログラム function runMonthlyReport() { const today = new Date(); const firstDay = new Date(today.getFullYear(), today.getMonth() - 1, 1); const lastDay = new Date(today.getFullYear(), today.getMonth(), 0); const startDate = Utilities.formatDate(firstDay, Session.getScriptTimeZone(), 'yyyy-MM-dd'); const endDate = Utilities.formatDate(lastDay, Session.getScriptTimeZone(), 'yyyy-MM-dd'); appendOverallData(startDate, endDate); appendPageRankingData(startDate, endDate); } // 全体データの処理(日次) function appendOverallData(startDate, endDate) { const sheetName = '全体データ'; let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (!sheet) { sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName); sheet.appendRow(['日付', '総ユーザー数', '新規ユーザー数', 'セッション数', '表示回数', 'エンゲージメント率', '平均エンゲージメント時間(秒)']); sheet.getRange("A1:G1").setFontWeight("bold").setBackground("#f3f3f3"); sheet.setFrozenRows(1); } const request = { dateRanges: [{ startDate: startDate, endDate: endDate }], dimensions: [{ name: 'date' }], metrics: [ { name: 'totalUsers' }, { name: 'newUsers' }, { name: 'sessions' }, { name: 'screenPageViews' }, { name: 'engagementRate' }, { name: 'averageSessionDuration' } ], orderBys: [{ dimension: { dimensionName: 'date' }, desc: false }] }; const response = AnalyticsData.Properties.runReport(request, 'properties/' + PROPERTY_ID); if (response.rows) { const rows = response.rows.map(row => { const d = row.dimensionValues[0].value; const dateStr = d.substring(0, 4) + '/' + d.substring(4, 6) + '/' + d.substring(6, 8); return [ dateStr, Number(row.metricValues[0].value), Number(row.metricValues[1].value), Number(row.metricValues[2].value), Number(row.metricValues[3].value), (row.metricValues[4].value * 100).toFixed(2) + '%', Number(row.metricValues[5].value).toFixed(1) ]; }); sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, rows[0].length).setValues(rows); } } // ページランキングの処理(月次・変更なし) function appendPageRankingData(startDate, endDate) { const sheetName = 'ページランキング推移'; let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (!sheet) { sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName); sheet.appendRow(['年月', 'ページタイトル', 'ページパス', '総ユーザー数', '新規ユーザー数', 'セッション数', '表示回数', 'エンゲージメント率', '平均エンゲージメント時間(秒)']); sheet.getRange("A1:I1").setFontWeight("bold").setBackground("#f3f3f3"); sheet.setFrozenRows(1); } const request = { dateRanges: [{ startDate: startDate, endDate: endDate }], dimensions: [{ name: 'yearMonth' }, { name: 'pageTitle' }, { name: 'pagePath' }], metrics: [ { name: 'totalUsers' }, { name: 'newUsers' }, { name: 'sessions' }, { name: 'screenPageViews' }, { name: 'engagementRate' }, { name: 'averageSessionDuration' } ], orderBys: [{ metric: { metricName: 'sessions' }, desc: true }], limit: 50 }; const response = AnalyticsData.Properties.runReport(request, 'properties/' + PROPERTY_ID); if (response.rows) { const rows = response.rows.map(row => { const ym = row.dimensionValues[0].value; return [ ym.substring(0, 4) + '/' + ym.substring(4, 6), row.dimensionValues[1].value, row.dimensionValues[2].value, Number(row.metricValues[0].value), Number(row.metricValues[1].value), Number(row.metricValues[2].value), Number(row.metricValues[3].value), (row.metricValues[4].value * 100).toFixed(2) + '%', Number(row.metricValues[5].value).toFixed(1) ]; }); sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, rows[0].length).setValues(rows); } }
過去データを一括取得する手順
スクリプトを貼り付けて保存したら、以下の手順で過去分のデータを一括取得します。
- Apps Script のエディタ上部のドロップダウンから
runHistoricalPageDataを選択します - ▶ 実行ボタンをクリックします
- しばらく待つと、スプレッドシートの「全体データ」シートと「ページランキング推移」シートに、指定した開始年月から前月末までのデータが書き込まれます
この操作は初回のみ行います。
翌月以降は、設定済みのトリガーにより毎月5日に runMonthlyReport が自動実行されるため、手動での操作は不要です。
まとめ
今回の変更点は以下の3つです。
dimensionsの値を'yearMonth'から'date'に変更する- 日付の変換処理を6桁から8桁に対応させる
runHistoricalPageData関数にappendOverallDataの呼び出しを追加する
月次データでは見えなかった日ごとのアクセス変動を把握できるようになるため、記事公開日との相関や曜日ごとの傾向など、より細かい分析が可能になります。



