メンバーに日報を出してもらう運用にしているのに、提出済みかどうかを毎日目で追いかけ、抜けている人には個別にチャットで声をかける。
この確認作業だけで、管理職の時間が少しずつ削られている会社は少なくありません。
日報のテンプレートを毎朝用意すること、夕方に提出状況を確認すること、未提出者へ声をかけることは、いずれもルールが単純な繰り返し作業です。
判断が要らない作業ほど、Google Apps Script(Googleスプレッドシートに標準搭載されているスクリプト機能)による自動化に向いています。
毎朝メンバー分の日報入力欄を自動で用意し、夕方に提出状況を集計して未提出者だけへ通知するまでの仕組みを、ここから整理していきます。
完成イメージ
始業前の時間帯になると、その日の日付とメンバー全員分の氏名が入った行が、日報用のシートへ自動で追加されるところが起点です。
メンバーは自分の行の業務内容欄に記入するだけで提出が完了し、URLを共有したり別のフォームを開いたりする手間はありません。
夕方の決まった時刻になると、その日の行のうち業務内容欄が空欄のままの人だけが拾われ、担当者宛てに通知メールが届きます。
声をかける相手を確認する作業自体が要らなくなるので、管理側は通知に載った氏名にだけ声をかければ済みます。
自動化する範囲を整理すると、以下のとおりです。
| やりたいこと | 自作で足りるか |
|---|---|
| 日報の入力欄を毎朝自動で用意する | 足りる(この記事の最小構成で対応) |
| 未提出者だけへ自動で通知する | 足りる(時間トリガーと条件判定で対応) |
| 部署別・期間別に集計する | 足りる(数式やピボットテーブルで対応) |
| 記入内容の傾向を自動で分析・要約する | 足りない(別途AI連携などの追加実装が必要) |
日報の自動生成と集計を組む手順
ここからは、入力欄の自動生成から未提出者への通知まで、4つの手順で組んでいきます。
スプレッドシート1つと、2つの関数だけで動く構成です。
Step1. シートを準備する
Googleスプレッドシートを1つ作成し、シートを2つ用意します。
1つ目のシート名は「従業員名簿」とし、A列にメンバーの氏名を1行1名で入力します。
2つ目のシート名は「日報」とし、1行目には日付・氏名・業務内容・所要時間の4列を見出しとして並べてください。
「日報」シートには手動でデータを入れず、次のStep2のスクリプトが行を自動で追加していく形にします。
Step2. 毎朝の入力欄を自動生成するコードを書く(コード全文)
拡張機能からApps Scriptエディタを開き、以下のコードを貼り付けて保存してください。
従業員名簿の氏名を1件ずつ読み込み、日報シートへその日の日付とセットで行を追加する関数です。
function createDailyReportRows() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const staffSheet = ss.getSheetByName('従業員名簿');
const reportSheet = ss.getSheetByName('日報');
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const lastRow = staffSheet.getLastRow();
if (lastRow < 2) {
return;
}
const staffNames = staffSheet.getRange(2, 1, lastRow - 1, 1).getValues().flat();
staffNames.forEach((name) => {
if (!name) {
return;
}
reportSheet.appendRow([today, name, '', '']);
});
} この関数を毎朝実行するよう、Apps Scriptエディタの時計マークのアイコンからトリガーを設定します。
イベントの種類を時間主導型にし、朝の時間帯(7時から8時など始業前の枠)を選ぶと、始業時点で全員分の行が準備された状態になります。
Step3. 未提出者だけを判定して通知するコードを書く(コード全文)
同じスクリプトファイルに、以下の関数を書き足してください。
その日の行を確認し、業務内容欄が空欄のままの氏名だけをメールで通知する関数です。
function notifyUnsubmitted() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const reportSheet = ss.getSheetByName('日報');
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const data = reportSheet.getDataRange().getValues();
const unsubmitted = [];
for (let i = 1; i < data.length; i++) {
const [date, name, content] = data[i];
if (!date) {
continue;
}
const rowDate = Utilities.formatDate(new Date(date), 'Asia/Tokyo', 'yyyy/MM/dd');
if (rowDate === today && !content) {
unsubmitted.push(name);
}
}
if (unsubmitted.length > 0) {
MailApp.sendEmail(
'[通知先メールアドレス]',
'本日の日報未提出者',
`本日の日報がまだ提出されていないメンバーです。\n${unsubmitted.join('\n')}`
);
}
} コード中の通知先メールアドレスは、実際に確認する担当者のアドレスに書き換えてください。
業務内容欄に何か1文字でも入力されていれば提出済みと判定されるため、空文字や記号だけの記入は未提出扱いにならない点は運用でカバーする必要があります。
Step4. 夕方のトリガーを設定してテストする
Step2と同じ手順でトリガー画面を開き、notifyUnsubmittedを夕方の決まった時刻(18時など終業前後の枠)に毎日実行するよう設定します。
設定が終わったら、従業員名簿に自分のテスト用アカウントだけを残した状態で一度手動実行し、日報シートに行が追加されること、業務内容欄を空欄のままにすると通知が届くことを確認してください。
確認が済んだら従業員名簿を全メンバー分に戻し、本番運用に切り替えます。
定着しない場合の運用調整
仕組みを作っても、しばらく経つと通知を無視するメンバーが出てくることがあります。
原因の多くは、通知の仕組みそのものではなく、その先の運用に潜んでいるからです。
未提出者への通知メールが、事務的な一斉送信のまま担当者から個別に読まれていないと、メンバー側も次第に「催促は形だけ」と学習してしまいます。
通知が届いたら担当者がその日のうちに一声かける、という手前の運用まで含めて設計してください。
入力項目が多すぎることも定着を妨げます。
業務内容と所要時間だけに絞った最小構成から始め、必要性が確認できた項目だけを後から足していく順番のほうが、途中で入力が止まりにくくなります。
日報の記入内容を朝会や週次の振り返りで実際に参照する場面を作ることも有効です。
書いても誰にも見られていないと感じさせないことが、催促の仕組みそのものより定着に効きます。
日報と近い性質を持つ業務として、打刻の仕組みを自作するときの考え方も参考になります。

Google Apps Scriptで自動化する業務全般の選び方は、こちらで整理しています。

日報の自動化について相談してみませんか?
「日報の催促に毎日時間を取られている」「テンプレートをどこまで自動化できるか判断がつかない」「社内に業務自動化を設計できる人材がいない」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、日報運用に関するお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 従業員の入退社があった場合、名簿の管理はどうすればいいですか?
従業員名簿シートに氏名を追加・削除するだけで、翌朝の日報シートには自動で反映されます。
退職者の行を削除し忘れても、その人あての行が生成され続けるだけで、他のメンバーの運用に影響はありません。
Q. 土日や休業日にも日報の行が作られてしまいませんか?
この記事のコードは曜日を判定していないため、そのままでは土日にも行が作られます。
平日だけ実行したい場合は、トリガーの繰り返し設定を曜日指定に変更するか、関数の冒頭で当日の曜日を判定して土日なら処理を終了する条件を1行足してください。
Q. 提出内容の質までチェックできますか?
このスクリプトが判定できるのは、業務内容欄に文字が入っているかどうかだけです。
記入内容が業務の実態に沿っているかどうかの確認は、これまでどおり管理者による目視が前提になります。
Q. 受信メールの内容をそのまま日報の材料に転記できますか?
メンバーが業務報告をメールで送っている運用であれば、受信メールをスプレッドシートへ転記する仕組みと組み合わせる方法もあります。
