• 更新日 : 2025年12月2日

スプレッドシートで勤怠管理するには?効率的な勤務表作成と自動計算の実装方法

スプレッドシートで勤怠管理表を作成することで、出退勤時間の記録から給与計算まで一元管理できます。本記事では、Googleスプレッドシートやエクセルを使った勤怠管理システムの構築手順から、労働時間の自動計算、残業代算出に必要な関数、セキュリティ対策まで詳しく解説します。

中小企業や部署単位での勤務管理に最適な、実践的なタイムシート作成のテクニックを紹介します。

目次

スプレッドシートで作る勤怠管理表の基本構成と考え方は?

スプレッドシートの勤怠管理表は、日付・出勤時刻・退勤時刻・休憩時間・実働時間を基本項目とし、労働基準法に準拠した自動計算機能を実装します。 これにより、正確な労務管理が可能になります。

勤怠管理に必要な基本項目の設計

効果的な勤怠管理表には、以下の必須項目が含まれます。

  1. 日付、曜日:カレンダー機能と連動
  2. 出勤時刻、退勤時刻:打刻漏れ防止のチェック機能
  3. 休憩時間:法定休憩を考慮した自動計算
  4. 実働時間、残業時間:自動算出し、月次集計に活用
  5. 勤怠区分:通常勤務・休日出勤有給休暇などを管理

エクセルとGoogleスプレッドシートの勤怠管理機能比較

エクセル(Excel)では、マクロやVBAを使った高度な勤怠システムが構築可能で、オフライン環境でも動作します。一方、Googleスプレッドシート(スプシ)は、リアルタイム共有により管理者が即座に勤怠状況を確認でき、スマートフォンからの打刻も容易です。また、Google Apps Script(GAS)により、Slackやメールとの連携も実現できます。クラウドベースの利点を活かし、リモートワーク対応も含めた柔軟な勤怠管理が可能です。

労働基準法を考慮した設計ポイント

勤怠管理表の設計では、労働基準法の遵守が重要です。1日8時間・週40時間の法定労働時間を超える場合の時間外労働の自動判定、6時間超で45分・8時間超で1時間の休憩時間の確保、深夜労働(22時〜5時)の割増賃金計算などを組み込みます。また、36協定の上限時間チェック機能も実装し、コンプライアンス違反を未然に防ぎます。

スプレッドシートで勤怠管理表を作成する具体的な手順は?

勤怠管理表の作成は、月間カレンダーの生成、入力フォームの設計、計算式の設定という3つのステップで構築します。 以下、詳細な作成手順を解説します。

STEP1:月間勤怠表のレイアウト作成

新しいスプレッドシートを作成し、A1セルに「○○年○月 勤怠管理表」とタイトルを入力します。続いて、B1セルに対象月の1日(例:2025/04/01)を入力しておきます。A3セルから横に「日付」「曜日」「出勤」「退勤」「休憩」「実働」「普通残業」「深夜残業」「備考」の項目を配置します。B4セルに該当月の日付を自動生成する数式を設定し、下方向にコピーします。

=IF(ROW()-3>DAY(EOMONTH($B$1,0)),””,DATE(YEAR($B$1),MONTH($B$1),ROW()-3))

STEP2:曜日の自動表示と休日設定

C列に曜日を自動表示する数式を設定します。

=IF(B4=””,””,TEXT(B4,”ddd”))

さらに、土日祝日を自動的に色分けする条件付き書式を設定します。祝日リストを別シートに用意し、COUNTIF関数で判定します。

=OR(WEEKDAY(B4)=1,WEEKDAY(B4)=7,COUNTIF(祝日リスト!A:A,B4)>0)

STEP3:出退勤時刻の入力規則設定

出勤・退勤時刻の列には、時刻形式の入力規則を設定します。データの入力規則で「時間」を選択し、0:00から23:59の範囲を指定します。また、不正な入力を防ぐため、カスタム数式で論理チェックも追加します(時刻は数値として扱われるため、数値かどうかを判定します)。

=AND(D4<E4,ISNUMBER(D4),ISNUMBER(E4))

STEP4:実働時間の自動計算式

実働時間を計算する基本的な数式は以下の通りです。

=IF(OR(D4=””,E4=””),””,E4-D4-F4)

ただし、日をまたぐ勤務(深夜勤務)に対応するため、より高度な計算式を使用します。

=IF(OR(D4=””,E4=””),””,IF(E4<D4,E4+1-D4-F4,E4-D4-F4))

勤怠管理で使う重要な関数とその活用方法は?

TIME関数、NETWORKDAYS関数、SUMIFS関数などを組み合わせることで、複雑な勤怠計算も自動化できます。 実践的な関数の使い方を詳しく解説します。

労働時間計算に必須のTIME関数群

時間計算では、TIME関数、HOUR関数、MINUTE関数を活用します。

日をまたぐ勤務にも対応した残業時間の計算例:

=MAX(0,IF(E4<D4,E4+1-D4-F4,E4-D4-F4)-TIME(8,0,0))

深夜労働時間の算出には、より複雑な計算が必要です(0:00〜5:00 と 22:00〜翌5:00 に対応):

=IF(OR(D4=””,E4=””),0,

MAX(0,MIN(E4,TIME(5,0,0))-MAX(D4,TIME(0,0,0))) +

MAX(0,MIN(IF(E4<D4,E4+1,E4),TIME(5,0,0)+1)-MAX(D4,TIME(22,0,0))))

NETWORKDAYS関数による営業日数計算

月間の営業日数を自動計算し、出勤率の算出に活用します。

=NETWORKDAYS(DATE(YEAR($B$1),MONTH($B$1),1),EOMONTH($B$1,0),祝日リスト!A:A)

個人の出勤日数は以下の数式で計算:

=COUNTIFS(D4:D34,”<>”,C4:C34,”<>日”,C4:C34,”<>土”)

SUMIFS関数による勤怠集計

月間の総労働時間や残業時間を集計する際は、SUMIFS関数を使用します。

=SUMIFS(G4:G34,B4:B34,”>=”&DATE(2024,1,1),B4:B34,”<=”&DATE(2024,1,31))

部署別・個人別の集計も可能:

=SUMIFS(実働時間列,部署列,”営業部”,氏名列,”山田太郎”,日付列,”>=”&月初,日付列,”<=”&月末)

VLOOKUP関数での社員マスター連携

社員マスターシートと連携し、時給や基本給を自動参照します。

=VLOOKUP($A$2,社員マスター!A:E,3,FALSE)

これにより、給与計算の自動化も実現できます。

=VLOOKUP($A$2,社員マスター!A:E,4,FALSE)*SUM(G4:G34) +

VLOOKUP($A$2,社員マスター!A:E,5,FALSE)*1.25*SUM(H4:H34)

勤怠管理表のセキュリティ対策と権限管理は?

個人情報を含む勤怠データは、適切なアクセス制限と暗号化により保護する必要があります。 実践的なセキュリティ対策を解説します。

シート保護と編集権限の設定

Googleスプレッドシートでは、範囲保護機能を使用して権限を細かく制御します。管理者以外は過去の打刻時刻を変更できないよう、以下の設定を行います。

  1. 「データ」→「シートと範囲を保護」を選択
  2. 編集可能な範囲を当日分のみに限定
  3. 管理者グループのみに全範囲の編集権限を付与

データの暗号化とバックアップ

重要な勤怠データを保護するため、定期的なバックアップとアーカイブを実装します。

GASによる自動バックアップ:

javascript

function dailyBackup() {

var originalSheet = SpreadsheetApp.getActiveSpreadsheet();

var backupFolder = DriveApp.getFolderById(‘バックアップフォルダID’);

// PDFとしてエクスポート(バックアップフォルダのアクセス権限で保護)

var blob = originalSheet.getAs(‘application/pdf’);

var fileName = ‘勤怠_’ + Utilities.formatDate(new Date(), ‘JST’, ‘yyyyMMdd’);

backupFolder.createFile(blob).setName(fileName);

// 古いバックアップの削除(30日以前)

var files = backupFolder.getFiles();

var cutoffDate = new Date();

cutoffDate.setDate(cutoffDate.getDate() – 30);

while (files.hasNext()) {

var file = files.next();

if (file.getDateCreated() < cutoffDate) {

file.setTrashed(true);}}}

アクセスログの記録と監査

不正アクセスや改ざんを検知するため、編集履歴を詳細に記録します。

javascript

function onEdit(e) {

var auditSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘監査ログ’);

if (!auditSheet) {

auditSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(‘監査ログ’);

auditSheet.getRange(‘A1:E1’).setValues([[‘日時’, ‘編集者’, ‘セル’, ‘変更前’, ‘変更後’]]);}

var timestamp = new Date();

var user = Session.getActiveUser().getEmail();

var cell = e.range.getA1Notation();

var oldValue = e.oldValue || ”;

var newValue = e.value || ”;

auditSheet.appendRow([timestamp, user, cell, oldValue, newValue]);}

二要素認証とIPアドレス制限

Googleアカウントの二要素認証を必須とし、組織のセキュリティポリシーに基づいてアクセスを制限します。特定のIPアドレスからのみアクセスを許可する場合は、Google Workspace の管理コンソールで設定します。また、VPNを経由したアクセスのみを許可することで、セキュリティをさらに強化できます。

勤怠管理表作成・運用時の重要な注意点は?

勤怠管理では、法令遵守、データの正確性、プライバシー保護が特に重要です。 運用上の注意点と対策を詳しく説明します。

労働時間の端数処理と法的要件

労働時間の端数処理は、労働基準法および厚生労働省通達に準拠する必要があります。

1か月における時間外労働・休日労働・深夜労働のそれぞれの合計時間については、次のような端数処理が認められています。

1時間未満の端数がある場合に、30分未満の端数を切り捨て、30分以上の端数を1時間に切り上げる
参照:賃⾦計算の端数の取扱い|労働基準監督署

たとえば、時間外労働時間(例:G列)が 1か月分 G4:G34 に入っている場合、次のような数式でこのルールを実装できます。

=(INT(SUM(G4:G34)*24)

+ IF(MOD(SUM(G4:G34)*24,1)>=0.5,1,0))/24

この数式では、

  • 1か月の時間外労働の合計時間から
  • 30分未満は切り捨て、30分以上は1時間に切り上げたうえで
  • 「時間(h)」単位の値を返します。

なお、日々の労働時間の記録・賃金計算は原則1分単位で行う必要があり、安易な切り捨ては違法となる可能性があります。端数処理を行う範囲・対象は就業規則等で明確に定めてください。

打刻漏れ・修正申請のワークフロー

打刻漏れや修正が必要な場合の承認フローを明確化します。

別シートに修正申請フォームを作成:

javascript

function submitCorrection() {

var ui = SpreadsheetApp.getUi();

var response = ui.prompt(‘修正申請’, ‘修正理由を入力してください:’, ui.ButtonSet.OK_CANCEL);

if (response.getSelectedButton() == ui.Button.OK) {

var reason = response.getResponseText();

var correctionSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘修正申請’);

correctionSheet.appendRow([

new Date(),

Session.getActiveUser().getEmail(),

SpreadsheetApp.getActiveRange().getA1Notation(),

reason,

‘承認待ち’ ]);

// 管理者に通知

GmailApp.sendEmail(

[email protected]’,

‘勤怠修正申請’,

‘修正申請が提出されました。確認をお願いします。’ );}}

データ保存期間と法定帳簿要件

労働基準法により、賃金台帳などの労働関係書類は原則5年間の保存義務があります(当面は経過措置により3年間で足りるとされています)。勤怠データ(出勤簿・タイムカード等)も同様に、少なくとも3年以上、将来的には5年以上の保存を前提に運用することが望まれます。

月次でPDF出力し、所定のフォルダに保管します。

電子帳簿保存法の要件(改ざん防止措置・検索要件など)への正式な対応については、税理士・社労士等の専門家と相談のうえ、運用ルールやシステム設定を行ってください。

function monthlyArchive() {

var ss = SpreadsheetApp.getActiveSpreadsheet();

var pdfBlob = ss.getAs(‘application/pdf’);

var fileName = ‘勤怠記録_’ + Utilities.formatDate(new Date(), ‘JST’, ‘yyyyMM’) + ‘.pdf’;

// 法定保存用フォルダに保存(ファイル名に年月を付与)

var archiveFolder = DriveApp.getFolderById(‘法定保存フォルダID’);

var file = archiveFolder.createFile(pdfBlob).setName(fileName);

// メタデータを設定(作成日時・作成者情報を付加)

file.setDescription(

‘作成日時: ‘ + new Date() +

‘n作成者: ‘ + Session.getActiveUser().getEmail());}

プライバシー保護とデータ利用規約

従業員の個人情報保護のため、以下の対策を実施します。

  • 勤怠データへのアクセス権限を最小限に制限
  • 個人を特定できる情報の暗号化
  • データの目的外使用の禁止
  • 退職者データの適切な処理

利用規約を明文化し、全従業員の同意を得ることも重要です。

実践的な勤怠管理表のカスタマイズ例は?

業種や勤務形態に応じた勤怠管理表のカスタマイズにより、より実用的なシステムを構築できます。 具体的な活用例を紹介します。

シフト制勤務への対応

飲食店や小売業など、シフト制勤務の管理機能を実装します。以下は、簡易的にシフトを自動割り当てするサンプルです(※実際のロジックは運用に合わせて調整してください)。

function createShiftTable() {

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘シフト表’);

var employees = [‘山田’, ‘鈴木’, ‘田中’, ‘佐藤’];

var shifts = {

‘早番’: {start: ‘7:00′, end: ’15:00’},

‘遅番’: {start: ’13:00′, end: ’21:00′},

‘夜勤’: {start: ’21:00′, end: ‘7:00’}};

// シフトパターンを自動割り当て

for (var i = 0; i < employees.length; i++) {

for (var day = 1; day <= 31; day++) {

var shiftType = assignShift(employees[i], day); // 下の関数で判定

var cell = sheet.getRange(i + 2, day + 1);

cell.setValue(shiftType);

// 色分け

if (shiftType === ‘早番’) {

cell.setBackground(‘#ffeb3b’);

} else if (shiftType === ‘遅番’) {

cell.setBackground(‘#4caf50’);

} else if (shiftType === ‘夜勤’) {

cell.setBackground(‘#2196f3’); }}}}

// シンプルなシフト自動割り当て例

function assignShift(employee, day) {

var shiftTypes = [‘早番’, ‘遅番’, ‘夜勤’];

// 従業員名の長さと日付を使って擬似的にローテーション

var index = (day + employee.length) % shiftTypes.length;

return shiftTypes[index];}

フレックスタイム制の管理

コアタイムフレキシブルタイムを考慮した勤怠管理:

=IF(AND(D4>=TIME(10,0,0),E4>=TIME(15,0,0)),

E4-D4-F4,

IF(OR(D4>TIME(10,0,0),E4<TIME(15,0,0)),

“コアタイム違反”,

E4-D4-F4))

在宅勤務・リモートワーク対応

勤務場所の記録と在宅勤務手当の計算:

=IF(勤務場所=”在宅”,

実働時間*時給+在宅手当,

実働時間*時給)

有給休暇管理の統合

有給休暇の自動計算と残日数管理:

=VLOOKUP(社員ID,有給マスター!A:C,2,FALSE) –

COUNTIF(勤怠区分列,”有給”)

高度な勤怠管理機能の実装例

リアルタイム勤怠ダッシュボード

Google Apps Scriptで現在の出勤状況をリアルタイム表示:

javascript

function updateDashboard() {

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘ダッシュボード’);

var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘勤怠データ’);

var today = new Date();

var currentHour = today.getHours();

// 本日の出勤者数をカウント

var presentCount = 0;

var lateCount = 0;

var absentCount = 0;

var lastRow = dataSheet.getLastRow();

for (var i = 2; i <= lastRow; i++) {

var attendance = dataSheet.getRange(i, 3).getValue(); // 出勤時刻

var scheduled = dataSheet.getRange(i, 2).getValue(); // 予定出勤時刻

if (attendance) {

presentCount++;

if (attendance > scheduled) {

lateCount++;}

} else if (currentHour > 10) { // 10時以降で未出勤

absentCount++;  }}

// ダッシュボードに反映

sheet.getRange(‘B2’).setValue(presentCount);

sheet.getRange(‘B3’).setValue(lateCount);

sheet.getRange(‘B4’).setValue(absentCount);

// グラフ更新

var chart = sheet.getCharts()[0];

var newChart = chart.modify()

.setOption(‘title’, ‘本日の勤怠状況 ‘ + Utilities.formatDate(today, ‘JST’, ‘MM/dd HH:mm’))

.build();

sheet.updateChart(newChart);}

勤怠アラート機能

異常な勤怠パターンを検知して通知:

javascript

function detectAnomalies() {

var threshold = 10; // 10時間以上の勤務

var consecutiveDays = 6; // 6日連続勤務

// 長時間労働チェック

var longWorkingEmployees = [];

// 実装コード…

if (longWorkingEmployees.length > 0) {

sendAlertEmail(

[email protected]’,

‘長時間労働アラート’,

‘以下の従業員が’ + threshold + ‘時間を超える勤務をしています:n’ +

longWorkingEmployees.join(‘n’));}}

スプレッドシートで作る勤怠管理表で効率的な労務管理を

スプレッドシートを活用した勤怠管理は、適切な設計と関数の活用により、市販のシステムに匹敵する機能を実現できます。本記事で紹介した作成手順、計算関数、セキュリティ対策を実装することで、法令に準拠した正確な勤怠管理が可能になります。

特に中小企業や部署単位での導入では、コストを抑えながら柔軟なカスタマイズができる点が大きなメリットです。

まずは基本的な勤怠表から始めて、必要に応じて高度な機能を追加していくことをお勧めします。従業員の働き方改革と業務効率化の両立を、スプレッドシートで実現しましょう。


※ 掲載している情報は記事更新時点のものです。

※本サイトは、法律的またはその他のアドバイスの提供を目的としたものではありません。当社は本サイトの記載内容(テンプレートを含む)の正確性、妥当性の確保に努めておりますが、ご利用にあたっては、個別の事情を適宜専門家にご相談いただくなど、ご自身の判断でご利用ください。

関連記事