# 勤怠管理表をスプレッドシートで作る｜出退勤から勤務時間と残業を自動計算

Google スプレッドシートで勤怠管理表を作る方法を、そのまま使える式付きで解説します。出勤・退勤・休憩から実働時間と残業時間を出す式、日付をまたぐ夜勤の計算、24時間を超える合計を正しく表示する表示形式、時給からの給与計算、NETWORKDAYS での所定労働日数まで公式ヘルプで確かめました。

<Points>

- 出勤・退勤・休憩の時刻を入れ、実働時間は `退勤 − 出勤 − 休憩` の式で出す。日付をまたぐ夜勤は退勤に 1 日を足して計算する
- 月の合計は表示形式を `[h]:mm` にしないと、24 時間を超えた分が消えて少なく見える
- 給与は `合計時間 × 24 × 時給` で出す。スプレッドシートの時刻は「1 日 = 1」の数なので、24 を掛けて「時間」に直す

</Points>

## スプレッドシートで勤怠を管理する前に知っておくこと

出退勤の時刻を紙やメモで集め、月末に電卓で勤務時間を足していると、計算の間違いや転記の漏れが起きます。スプレッドシートに時刻を入れて式で計算すれば、入力した時点で 1 日の実働時間と月の合計が出ます。

ただし、時刻の計算には独特の決まりがあります。[Google の開発者向けガイド](https://developers.google.com/workspace/sheets/api/guides/formats)によると、スプレッドシートの日付と時刻は数値で保存され、整数の部分が日付、小数の部分が「1 日のうちの割合」としての時刻です。たとえば 12 時は 0.5、6 時間は 0.25 です。この決まりを知っておくと、この記事の式がなぜそうなっているかがわかります。

<Compare>
<Column title="電卓で足す場合">

- 月末にまとめて計算する
- 60 分で繰り上げる計算を間違えやすい
- 誰がいつ直したか残らない

</Column>
<Column title="式で計算する場合" tone="accent">

- 入力した時点で実働時間が出る
- 時刻の繰り上げは自動
- 変更履歴から直した跡をたどれる

</Column>
</Compare>

## シートの構成

1 人 1 か月で 1 枚のシートを作り、1 行目に次の見出しを入れます。2 行目から日付ごとに 1 行ずつ使います。

<Figure title="勤怠のシートの形" caption="A〜D 列は手で入力し、E・F 列は式で計算します。">

| | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 1 | 日付 | 出勤 | 退勤 | 休憩 | 実働 | 残業 |
| 2 | 2026/12/01 | 9:00 | 18:00 | 1:00 | (式) | (式) |
| 3 | 2026/12/02 | 9:00 | 20:30 | 1:00 | (式) | (式) |
| 4 | 2026/12/03 | 22:00 | 6:00 | 1:00 | (式) | (式) |

</Figure>

出勤・退勤・休憩は「9:00」「1:00」のように時刻の形で入れます。休憩も「60」ではなく「1:00」と時刻で入れるのがポイントです。数値の 60 を入れると 60 日分として計算されてしまいます。

## 実働時間と残業時間を出す式

E2 と F2 に次の式を入れ、月の日数分だけ下へコピーします。

```
E2 (実働): =IF(OR(B2="",C2=""),"",IF(C2<B2,C2+1,C2)-B2-D2)
F2 (残業): =IF(E2="","",MAX(0,E2-TIME(8,0,0)))
```

<Flow
  title="実働時間が出るまでの流れ"
  caption="人が入れるのは出勤・退勤・休憩の時刻だけです。"
  steps={[
    { label: "出勤・退勤・休憩を入力", note: "時刻の形で入れる" },
    { label: "日付をまたぐか判定", note: "退勤が出勤より前なら +1 日" },
    { label: "実働を計算", note: "退勤 − 出勤 − 休憩" },
    { label: "残業を計算", note: "実働のうち 8 時間を超えた分" },
  ]}
/>

### 式がしていること

- **空の日は計算しない**: `IF(OR(B2="",C2=""),"", ...)` で、出勤か退勤が空の行は空白のままにします。休みの日の行に「0:00」が並ぶのを防げます。
- **日付をまたぐ夜勤**: 22 時に出勤して翌朝 6 時に退勤すると、そのまま引き算すると負の数になります。退勤が出勤より前のときは `C2+1` で退勤に 1 日分 (数値の 1) を足してから引くので、8 時間と正しく出ます。
- **残業**: [TIME 関数](https://support.google.com/docs/answer/3093056?hl=ja)の `TIME(8,0,0)` で 8 時間を作り、実働からその分を引いています。8 時間に届かない日は負の数になるので、`MAX(0, ...)` で 0 にそろえます。

<Note tone="info">

この記事の残業は「1 日 8 時間を超えた分」で計算しています。所定の労働時間や残業の数え方は会社の決まりによって違うので、`TIME(8,0,0)` の部分は自社の規則に合わせて書き換えてください。

</Note>

## 24時間を超える合計を正しく表示する

月末の行の下に、実働と残業の合計を出します。

```
E33 (実働の合計): =SUM(E2:E32)
F33 (残業の合計): =SUM(F2:F32)
```

このままだと、合計が 24 時間を超えたときに「160:00」ではなく「16:00」のように、日をまたいだ分が消えて表示されることがあります。時刻の表示形式は 1 日の中の時刻を表すためのもので、日数の分を表示しないからです。

経過した時間として表示するには、表示形式を `[h]:mm` にします。

<Steps>
<Step title="範囲を選ぶ">

E 列と F 列 (E2 から F33) を選びます。

</Step>
<Step title="カスタム数値形式を開く">

上部のメニューの [表示形式] > [数字] > [カスタム数値形式] を押します。

</Step>
<Step title="形式を入れて適用する">

テキストボックスに `[h]:mm` と入れ、[適用] を押します。

</Step>
</Steps>

[開発者向けガイドの表示形式の一覧](https://developers.google.com/workspace/sheets/api/guides/formats)によると、`[h]` は「経過した時間の数」を表す記号です。時刻の `h` と違って 24 で折り返さないので、月の合計のように 24 時間を超える値もそのまま表示されます。メニューの手順は [公式ヘルプ](https://support.google.com/docs/answer/56470?hl=ja) のとおりです。

## 時給から給与を計算する

合計の時間に時給を掛けて給与を出すときは、24 を掛けてから時給を掛けます。

```
H1 (時給): 1200
H2 (支給額): =E33*24*H1
```

スプレッドシートの時刻は「1 日 = 1」の数なので、160 時間は内部では 160 ÷ 24 ≒ 6.67 という値です。そのまま時給を掛けると 1/24 の金額になってしまうため、24 を掛けて「時間の数」に直してから掛けます。H2 の表示形式は [表示形式] > [数字] > [通貨] などにしておきます。

<Figure title="時間の値と計算の例" caption="セルの表示と、計算に使われる中の値の対応です。">

| セルの表示 (`[h]:mm`) | 中の値 | × 24 した値 |
|---|---|---|
| 8:00 | 約 0.333 | 8 |
| 7:30 | 0.3125 | 7.5 |
| 160:00 | 約 6.667 | 160 |

</Figure>

## 所定の労働日数を出す

月の出勤日数と比べるために、その月の平日の数を出しておくと便利です。[NETWORKDAYS 関数](https://support.google.com/docs/answer/3092979?hl=ja)は、2 つの日付の間の土日を除いた日数を返し、3 番目の引数に祝日の範囲を渡すとその日も除きます。

```
=NETWORKDAYS(DATE(2026,12,1),DATE(2026,12,31),祝日!A2:A30)
```

「祝日」という名前のシートを作り、A 列に会社の休日や祝日を日付の形で並べておきます。実際に出勤した日数は `=COUNT(E2:E32)` で、実働が入っている行の数として数えられます。

## 運用するときのコツ

- **入力する列だけ開ける**: 式の入った E・F 列や合計の行を消されないよう、[データ] > [シートと範囲を保護] で保護しておくと安心です。
- **月ごとにシートをコピー**: 前の月のシートをコピーして日付と時刻だけ消すと、式と表示形式をそのまま使えます。
- **共有の範囲を絞る**: 勤怠には個人の情報が入るので、共有する相手と権限を見直します ([スプレッドシートの共有方法](/spreadsheet-share/))。

<Note tone="caution">

スプレッドシートの勤怠管理表は、打刻の記録そのものではなく、本人や管理者が入力した時刻をもとにした計算表です。労働時間の記録の方法や保存のしかたは、法令と社内の規則に沿って決めてください。

</Note>

## 自分で作るのが難しいときは

数人の勤怠を月に 1 回集計するくらいなら、このテンプレートで十分に回せます。ただ、人数が増えて「全員のシートを 1 つに集めたい」「打刻をフォームやスマートフォンから受けたい」「締め日に自動で集計してメールで送りたい」となると、関数だけでは手が回らなくなります。

GAS を組み合わせると、フォームで受けた打刻をシートに並べる、月末に集計を自動で送る、といった仕組みを作れます。シートでの管理に限界を感じている場合は、専用のシステムへの置き換えも含めて、シートナビの[相談フォーム](/contact/)からお気軽にご相談ください。

## よくある質問

### Q. 実働時間を「7.5」のような数字で表示したいです。

実働のセルに 24 を掛けると、時間の数として表示できます。たとえば `=E2*24` とすると、7 時間 30 分は 7.5 と出ます。表示形式は [表示形式] > [数字] > [数値] にしておきます。

### Q. 休憩を「60 分」のように分で入力したいです。

分の数で入れたいときは、実働の式の `D2` を `D2/1440` に変えます。1 日は 1,440 分なので、60 を 1,440 で割ると 1 時間分の値になります。

### Q. 深夜の時間帯だけ分けて数えられますか？

できますが、出勤と退勤の時刻と深夜の時間帯の重なりを求める式になり、日付をまたぐ場合も考える必要があるため式が長くなります。深夜や休日の割増を細かく分けたい場合は、GAS で計算するか、勤怠管理の専用のサービスを使うほうが間違いが起きにくくなります。
