【GASで自動化】Googleスプレッドシートで作る無料の勤怠管理・残業アラートシステム

自動化事例

「従業員の労働時間を正確に把握したいけど、勤怠管理システムの導入はコストがかかる…」
「Excelでの手集計は、入力ミスや確認作業が負担になっている…」
このようなお悩みはありませんか?

従業員の勤怠管理は、コンプライアンス遵守や適切な人件費管理の観点から非常に重要ですが、多くの企業で課題を抱えているのが実情です。

本記事では、Googleが提供する無料のツール(スプレッドシート、フォーム、GAS)だけを使い、本格的な勤怠管理と残業アラートの仕組みを構築する方法を解説します。

この記事を読み終える頃には、日々の勤怠管理業務を効率化する第一歩を踏み出せるはずです。

完成イメージ:打刻から残業アラート通知までの自動化フロー

今回構築するのは、以下の流れで勤怠管理から残業アラートまでを自動化するシステムです。

  1. 打刻:従業員はPCやスマートフォンからGoogleフォームにアクセスし、「出勤」「退勤」などを選択して送信します。
  2. 自動記録:打刻データはリアルタイムでGoogleスプレッドシートに記録されます。
  3. 自動計算:スプレッドシートの関数が、実労働時間や残業時間を自動で計算・集計します。
  4. 自動通知:残業が発生した場合、GAS(Google Apps Script)が作動し、指定したメールアドレスに自動でアラート通知を送信します。

この仕組みにより、面倒な手作業での集計や確認作業から解放され、コンプライアンス違反のリスクを未然に防ぐことができます。

構築の4ステップ

構築は、以下の4つのステップで進めます。一つひとつ丁寧に進めれば、決して難しい作業ではありません。

  • STEP1:Googleフォームで打刻用のフォームを作成する
  • STEP2:スプレッドシートで勤怠データを管理する土台を準備する
  • STEP3:関数を使って労働時間をリアルタイムに自動計算する
  • STEP4:GASで残業アラートを自動で通知する

構築を始める前に:本システムの注意点

本記事でご紹介する仕組みは非常にシンプルなもので、以下の勤務パターンには対応していません。
構築を始める前にご確認ください。

  • 複数回の出退勤(中抜け)
    本システムは、1日に1回の出退勤を想定しています。中抜け後の再入室など、複数回の打刻には対応していませんのでご注意ください。
  • 日またぎでの勤務
    出勤した日と退勤した日が異なる勤務(例:22時〜翌5時)の労働時間は、正しく計算されません。
  • 打刻ミス・順番間違いの自動修正
    「出勤 → 休憩開始 → 休憩終了 → 退勤」の順番通りに打刻されることを前提としています。順番を間違えたり、打刻を忘れたりした場合、労働時間は正しく計算されません(本システムに打刻データを修正する機能はありません)。
  • 複数回の休憩
    本システムは、1日に1回の休憩を想定しています。複数回の休憩を取得する運用には対応していませんのでご注意ください。

それでは、さっそく始めましょう。

STEP1:Googleフォームで打刻用のフォームを作成する

まずは、従業員が日々の出退勤を記録するための「打刻フォーム」を作成します。

  1. Googleドライブを開き、「新規」>「Googleフォーム」を選択します。
  2. フォームのタイトルを「勤怠打刻フォーム」などに設定します。
  3. 以下の項目(質問)を追加します。
    • 打刻種別:(必須)ラジオボタン形式で「1.出勤」「2.休憩開始」「3.休憩終了」「4.退勤」を選択させます。
      ※項目名の番号は、後の集計で列を正しく並べるために必要になります。
    • 作業場所:(任意)ラジオボタン形式で「オフィス」「在宅勤務」などを選択させます。
    • 氏名:(必須)プルダウン形式で従業員名を選択できるように設定します。手入力による表記揺れを防ぐため、プルダウンがおすすめです。

フォームが完成したら、従業員がアクセスしやすいように、ブックマークや共有ドライブなどでURLを共有しておきましょう。

STEP2:スプレッドシートで勤怠データを管理する土台を準備する

次に、フォームから送信された打刻データを記録し、管理するためのスプレッドシートを準備します。

フォームとスプレッドシートの連携

作成したGoogleフォームの回答タブから、スプレッドシートとの連携を設定します。
詳しい手順については、こちらの記事で詳しく解説しています。

これで、フォームに回答が送信されるたびに、自動でスプレッドシートにデータが記録されるようになります。

3つのシートで管理する

自動作成されたシートに加えて、あと2枚シートを追加し、以下の3シート構成で管理します。こうすることで、計算式やルールが整理され、メンテナンス性が格段に向上します。

  1. フォームの回答:フォームから送られてくる生データが記録されるシートです。このシートは直接編集しません。
  2. ルール:会社の勤怠ルールを管理するシートです。法改正や社内規定の変更があった場合、このシートの値を変更するだけで計算全体に反映されるようになります。
  3. 勤怠計算簿:フォームの回答シートのデータを基に、従業員ごとの日次・週次・月次の勤怠を自動計算・集計するシートです。

ルールシートには、以下のような項目と値を設定しておきます。

項目備考
1日の所定労働時間8:00
週の所定労働時間40:00
月の残業アラート基準(時間)4536協定の上限など
深夜労働開始時刻22:00
深夜労働終了時刻5:00翌朝

STEP3:関数を使って労働時間をリアルタイムに自動計算する

ここが勤怠管理の心臓部です。勤怠計算簿シートに、フォームの回答シートの打刻データを自動で整理し、労働時間を計算する関数を入力していきます。

下準備:「フォームの回答」シートに日付・時刻列を追加する

まず、後の集計を簡単にするために、「フォームの回答」シートに作業用の列を2つ追加します。

  1. E1セルに「日付」と入力し、E2セルに以下の数式を貼り付けます。
=ARRAYFORMULA(IF(A2:A<>"", INT(A2:A), ""))

これで、A列のタイムスタンプから日付だけが抽出されます。

  1. F1セルに「時刻」と入力し、F2セルに以下の数式を貼り付けます。
=ARRAYFORMULA(IF(A2:A<>"", A2:A-INT(A2:A), ""))

これで、A列のタイムスタンプから時刻だけが抽出されます。

ARRAYFORMULA関数は、配列数式(一つの数式で、指定した範囲の行すべてに計算を自動で適用する仕組み)の結果を表示する関数です。
詳しい使い方については、こちらの記事で解説しています。

日付や時刻が「45893」のような数字で表示されるときは?

数式の結果が日付や時刻ではなく、数字(シリアル値)で表示されてしまうことがあります。その場合は、セルの書式設定を変更してください。

  • E列全体を選択し、メニューから「表示形式」>「数字」>「日付」を選びます。
  • F列全体を選択し、メニューから「表示形式」>「数字」>「時間」を選びます。

打刻データを整理して転記する(QUERY関数)

まずは、フォームの回答シートにバラバラに記録される「出勤」「退勤」の打刻を、従業員ごと・日付ごとに整理して、勤怠計算簿シートに転記します。ここではQUERY関数を使います。

勤怠計算簿シートのA1セルに、以下の関数を入力します。

=QUERY(
  'フォームの回答'!A:F,
  "SELECT D, E, MAX(F) WHERE D IS NOT NULL GROUP BY D, E PIVOT B"
)

※時刻が表示されない場合は、C列からF列を選択し、メニューの「表示形式」>「数字」>「時間」を選んでください。

QUERY関数は、指定した条件でデータを抽出・並べ替えできる強力な関数です。
詳しい使い方については、こちらの記事で解説しています。

QUERY設定

各種労働時間を計算する

データが整理できたら、実労働時間や残業時間を計算する列を追加します。

実労働時間の計算

実労働時間は「退勤時刻 – 出勤時刻 – 休憩時間」で求めます。

=F2 - C2 - (E2 - D2)

時間外労働(残業)時間の計算

1日の所定労働時間(ルールシートで設定した8時間)を超えた分を計算します。

=IF(
  G2 > 'ルール'!$B$2,
  G2 - 'ルール'!$B$2,
  0
)

STEP4:GASで残業アラートを自動で通知する

最後に、残業がある場合に自動でアラートを送信する仕組みをGAS(Google Apps Script)で構築します。

GASは、Googleの各種サービスを自動操作できるプログラミング言語です。難しそうに聞こえるかもしれませんが、今回はコピー&ペーストで使えるコードを用意しましたのでご安心ください。

スクリプトエディタを開く

  1. スプレッドシートのメニューから「拡張機能」>「Apps Script」を選択します。
  2. 新しいタブでスクリプトエディタが開きます。

スクリプトを記述する

開いたエディタに、はじめから書かれているコードをすべて消し、以下のコードを貼り付け、
‘manager@example.com’を通知を受け取りたいメールアドレスに変更してください。

// 残業が記録された場合に管理者にメールで通知する関数
function checkOvertimeAndNotify() {
  // 通知を受け取りたいメールアドレスをここに入力してください
  const RECIPIENT_EMAIL = 'manager@example.com'; 

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const attendanceSheet = ss.getSheetByName('勤怠計算簿');
  
  const lastRow = attendanceSheet.getLastRow();
  const overtimeRecords = []; // その日の残業記録を保存する配列

  // 勤怠計算簿シートを1行ずつチェック
  for (let i = 2; i <= lastRow; i++) {
    const employeeName = attendanceSheet.getRange(i, 1).getValue(); // A列:氏名
    const overtimeDisplay = attendanceSheet.getRange(i, 8).getDisplayValue(); // H列:残業時間
    
    // 残業時間があった場合
    if (overtimeDisplay && overtimeDisplay !== "0:00:00") {
      // 残業情報を配列に追加
      overtimeRecords.push(`  - ${employeeName}: ${overtimeDisplay}`);
    }
  }

  // 残業記録が1件以上あった場合のみメールを送信
  if (overtimeRecords.length > 0) {
    const subject = '【勤怠アラート】残業が記録されました';
    const body = '本日、以下の通り残業が記録されました。\n\n' +
                 '業務量に問題が無かったか、確認をお願いします。\n\n' +
                 '▼残業記録\n' +
                 overtimeRecords.join('\n'); // 配列を改行で連結
    
    // 設定したメールアドレスに送信
    MailApp.sendEmail(RECIPIENT_EMAIL, subject, body);
  }
}

トリガーを設定する

最後に、このスクリプトを「いつ実行するか」を設定します。これをトリガーと呼びます。例えば、「毎日夜22時から23時の間に実行する」のように設定することで、自動で残業チェックが行われるようになります。

  1. スクリプトエディタの左側メニューから、時計のアイコン(「トリガー」)をクリックします。
  2. 右下の「トリガーを追加」ボタンをクリックします。
  3. 以下の通り設定し、「保存」をクリックします。
    • 実行する関数を選択:checkOvertimeAndNotify
    • イベントのソースを選択:時間主導型
    • 時間ベースのトリガーのタイプを選択:日付ベースのタイマー
    • 時刻を選択:午後10時~11時

保存する際に、Googleアカウントへのアクセス許可を求める「承認フロー」の画面が表示されることがあります。表示された内容を確認し、アクセスを許可してください。
承認フローの詳しい手順については、こちらの記事で解説しています。

これで全ての設定は完了です!設定した時刻になると、GASが自動で残業時間をチェックし、残業があった場合に指定したメールアドレスにアラートメールが届くようになります。

【発展編】さらに便利な機能を追加する

今回構築した仕組みを応用すれば、さらに便利な機能を追加することも可能です。

  • 打刻漏れ防止のリマインド:夕方の時点で退勤打刻がない従業員にリマインド通知を送る。
  • 休日出勤や深夜労働の自動計算:営業日カレンダーと連携し、休日出勤や深夜時間帯の労働を自動で判別・集計する。
  • 週次・月次の自動集計レポート:週の終わりや月の初めに、各従業員の労働時間サマリーを自動で作成し、指定のメールアドレスやチャットに送付する。

運用を始める前に:必ず確認したい2つのポイント

この便利な仕組みを安心して運用するために、最後に2つの重要な点を確認しておきましょう。

  1. 権限設定の重要性
    勤怠データは重要な個人情報です。スプレッドシートの共有設定を適切に行い、閲覧・編集できるのが本人と上長、人事担当者のみになるように必ず制限しましょう。また、数式が入っているセルを誤って編集してしまわないよう、シートの保護機能を活用することも強く推奨します。
  2. ルール変更への備え
    36協定の改定や社内規定の変更で、所定労働時間や残業の上限が変わる可能性があります。今回はメンテナンス性を高めるためにルールシートを作成しました。ルールに変更があった際は、このシートの値を更新するだけで、すべての計算に正しく反映されます。

まとめ

本記事では、Googleの無料ツールのみを活用して、日々の勤怠管理を自動化し、残業アラートを送信する仕組みの作り方を解説しました。

この仕組みを導入することで、

  • 手作業による集計ミスや確認の手間がなくなる
  • 従業員の労働時間をリアルタイムで正確に把握できる
  • コンプライアンス違反のリスクを未然に防ぎ、従業員の健康を守る

といった大きなメリットが期待できます。

最初は少し難しく感じるかもしれませんが、一度設定してしまえば、あとはシステムが自動で働き続けてくれます。ぜひこの記事を参考に、貴社の業務効率化と働きやすい環境づくりにお役立てください。

※Googleサービスは、Google LLC の商標であり、この記事はGoogleによって承認されたり、Google と提携したりするものではありません。