日次の売上や件数をスプレッドシートに記録しているものの、月末になると担当者が手作業で1か月分を拾い集めて月次シートに転記している、という会社は珍しくありません。
件数が増えるほど転記の手間も見落としのリスクも大きくなり、月初の数日が集計作業でつぶれてしまう担当者も多いはずです。
Google Apps Scriptを使うと、日次データが溜まっているスプレッドシートから月次の集計シートを自動で作れます。
この記事では、日次データから月次シートを自動生成する仕組みと、月初に自動実行させる設定、集計結果が合わないときに確認すべき点を整理していきます。
完成イメージ:日次データから月次シートを自動生成する
まず、できあがる仕組みの全体像を先に説明します。
「日次」シートには、日付・項目・金額(または件数)の3列で、日々の記録が1行ずつ蓄積されているとします。
このシートに対してスクリプトを実行すると、対象月のデータだけを項目ごとに合計し、「月次」シートに新しい行として追記します。
| 処理前 | 処理後 |
|---|---|
| 日次シートに1か月分、数十〜数百行のデータが並んでいる | 月次シートに「年月・項目・合計金額」の行が項目数分だけ追加される |
| 担当者が日次シートをフィルタしながら電卓や関数で集計 | スクリプトの実行だけで集計が完了する |
処理自体は数十行のコードで組めます。
複数のスプレッドシートに分かれているデータをまず1つに集約したい場合は、先にこちらを済ませてから今回の集計処理につなげると流れがスムーズです。

月次集計シートを自動生成する手順
ここからは、日次データを月次シートへ集計する仕組みを4つの手順で組んでいきます。
対象月の判定には日付を文字列に変換してから比較する方法を使うため、日次シートのセルがDate型でも「年/月/日」形式の文字列でも、同じように対象月を判定できます。
Step1. 日次シートと月次シートを用意する
Googleスプレッドシートに「日次」と「月次」という名前のシートをそれぞれ用意します。
「日次」シートの1行目には、日付・項目・金額の3列を見出しとして入力し、2行目以降に日々のデータを記録していきます。
「月次」シートの1行目には、年月・項目・合計金額の3列を見出しとして入力しておきます。
実行のたびにこのシートへ集計結果が追記されていく形にします。
Step2. 集計スクリプトを作成する(コード全文)
拡張機能からApps Scriptエディタを開き、以下のコードを貼り付けて保存します。
実行した月の前月分を対象に、項目ごとの合計を計算して月次シートへ書き込む内容です。
function createMonthlyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dailySheet = ss.getSheetByName('日次');
const monthlySheet = ss.getSheetByName('月次');
const data = dailySheet.getDataRange().getValues();
const today = new Date();
const firstDayOfThisMonth = new Date(today.getFullYear(), today.getMonth(), 1);
const lastMonth = new Date(firstDayOfThisMonth.getTime() - 24 * 60 * 60 * 1000);
const targetMonth = Utilities.formatDate(lastMonth, 'Asia/Tokyo', 'yyyy/MM');
const totals = {};
for (let i = 1; i < data.length; i++) {
const [date, item, amount] = data[i];
if (!date) continue;
const rowMonth = Utilities.formatDate(new Date(date), 'Asia/Tokyo', 'yyyy/MM');
if (rowMonth !== targetMonth) continue;
totals[item] = (totals[item] || 0) + Number(amount);
}
const items = Object.keys(totals);
if (items.length === 0) {
MailApp.sendEmail(
'[通知先メールアドレス]',
'月次集計:対象データなし',
`${targetMonth}の日次データが見つかりませんでした。`
);
return;
}
const rows = items.map((item) => [targetMonth, item, totals[item]]);
const startRow = monthlySheet.getLastRow() + 1;
monthlySheet.getRange(startRow, 1, rows.length, 3).setValues(rows);
} 日付の比較には、セルの値をそのまま比べるのではなく、Utilities.formatDateで「年/月」の文字列に変換してから比べる方法を使っています。
日次シートの日付セルは、手入力・関数の結果・別シートからのコピーなど入力経路によってDate型になっていたり文字列になっていたりすることがあり、値のまま比較すると一致しないことがあります。
文字列に揃えてから比較すれば、こうした入力経路の違いに影響されずに対象月を判定できます。
Step3. 一度手動で実行して結果を確認する
コードを保存したら、エディタ上でcreateMonthlyReport関数を選び、一度手動で実行します。
初回はスクリプトの承認画面が表示されるので、内容を確認して許可してください。
実行後、月次シートに前月分の集計行が追加されていれば正しく動作しています。
このタイミングで、日次シートの件数を目視で数えた結果と月次シートの合計が一致するかも合わせて確認しておくと、後の手直しが減ります。
Step4. 月初に自動実行するトリガーを設定する
動作を確認できたら、毎月自動で実行されるようトリガーを設定します。
Apps Scriptエディタの時計マークのアイコンから、トリガーの設定画面を開きます。
設定画面では、実行する関数にcreateMonthlyReportを選び、イベントの種類を「時間主導型」に指定します。
あとは時間ベースのトリガーを「月」、実行日を1日、時間帯を朝6時から7時のように設定して保存すれば完了です。
これで毎月1日の朝に、前月分の集計が月次シートへ自動で追加されるようになります。
Google Apps Scriptで自動化する業務全般の選び方は、こちらで整理しています。

集計が合わないときの確認点
自動集計を導入した直後は、手作業で出した数字と自動集計の結果が一致しないことがあります。
原因の大半は日次シート側のデータの入り方にあり、スクリプト自体の不具合であることはまれです。
| 症状 | 主な原因 | 対処 |
|---|---|---|
| 特定の日のデータだけ集計から漏れる | 日付セルが空欄、または日付として認識されない文字列で入力されている | 日付列の表示形式を日付に統一し、空欄行がないか確認する |
| 合計額が想定より大きい、または小さい | 同じ日・同じ項目のデータが重複して記録されている、または金額欄に数値以外の文字が混ざっている | 日次シート側で重複行と金額欄の表記ゆれを確認する |
| 前月分のはずが今月のデータで集計される | 手動実行のタイミングが月初より前で、まだ前月が終わっていない | 月が完全に終わってから実行する、またはトリガーの実行日を確認する |
| 項目名の表記ゆれで同じ項目が別々に集計される | 「売上」と「売上高」のように、同じ意味の項目名が表記違いで入力されている | 日次シートへの入力時に項目名をプルダウンで選ぶ形式に変更する |
これらを確認しても解決しない場合は、日次シートの数行だけをコピーした検証用シートを作り、少ないデータで集計結果を照合すると原因を切り分けやすくなります。
月次集計の自動化について相談してみませんか?
「日次データはあるのに月次集計だけ手作業が残っている」「集計結果が合わない原因を自分では切り分けられない」「担当者が変わるたびに集計のやり方が引き継がれず崩れる」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、月次集計の自動化に関するお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 日次データが複数のスプレッドシートに分かれている場合はどうすればいいですか?
その場合は、先に複数のスプレッドシートを1つに集約してから、今回の集計処理にかける流れが確実です。
集約の手順は、複数のスプレッドシートを自動でまとめる方法の記事で整理しています。
Q. 今月分をリアルタイムで集計したい場合は?
その場合はtargetMonthの計算部分を、実行日が属する月の文字列に変更するだけで対応できます。
ただし月の途中で実行すると集計が未確定のまま関係者に共有されてしまうため、締め日が過ぎてから実行するか、その旨をシート上に注記しておくことをおすすめします。
Q. 金額ではなく件数を集計したい場合もこのコードで対応できますか?
対応できます。
「日次」シートの3列目を金額の代わりに件数として入力すれば、コードを変更せずにそのまま件数の合計が算出されます。
金額と件数の両方を集計したい場合は、列を1つ追加してそれぞれの合計を別々に加算する処理を足してください。