「kintoneで勤務時間や作業時間を自動で計算したい」と思ったことはありませんか?
kintoneには計算フィールドがありますが、
- 時刻フィールド同士の計算が分かりにくい
- Excelと同じように計算式を書いたのに結果が違う
- 計算結果を時刻として扱いたい
といった場面で、戸惑うことも少なくありません。
kintoneとExcelでは、時間の計算方法の仕組みが異なります。
- Excel:時間を「シリアル値」という数値で管理して計算
- kintone:時間差を「秒」で計算
そのため、Excelの感覚で式を書くと、思った通りの結果にならないことがあります。
そこで今回は、Excelライクな関数を使える「計算プラグイン」を使って、kintoneで時間計算を行う方法を解説します。
まずは時間計算の仕組み(シリアル値)を理解したうえで、
- 基本的な時間計算
- 関連レコード一覧での時間集計
- 条件付きの勤務時間計算
など、実務でよく使うパターンを具体的な計算式とともに紹介していきます。
「計算フィールドでは物足りないけれど、JavaScriptカスタマイズは難しい」
そんな方は、ぜひ参考にしてみてください。
■Excel と kintone で時間の値が違う?¶
Excelでは
| A | B | C | |
|---|---|---|---|
| 1 | 9:00 | 17:00 | =B1-A1 |
| 2 |
と入力すると、C1には"8:00" と表示されます。
Excelでは、表示上は"hh:mm"形式(または"[h]:mm"形式)の表示となっていますが、内部ではシリアル値を持っていて、シリアル値で計算したあと"hh:mm"形式(または"[h]:mm"形式)で表示しています。
kintoneでは、
A1(時刻フィールド)、B1(時刻フィールド)、C1(文字列(1行)フィールド)を作成して自動計算を選択して計算式を
B1 - A1
とすると、C1に"28800"と表示されます。これは 8時間 = 28,800秒 のためです。(1時間 = 3,600秒)
自動計算の計算式を
DATE_FORMAT(B1 - A1, "h:mm", "Etc/GMT")
とすると、"8:00" と表示されます。
また、C1を計算フィールドで作成し、C1フィールドの設定で計算式に
B1 - A1
を設定して書式を「数値(例:1000)」にすると、"28800"と表示されます。書式を「時刻(例:2:03)」にすると、"8:00" と表示されます。
このように計算フィールドと自動計算ではシリアル値ではなく秒を基準に処理をしています。
しかし、C1を時刻フィールドにしたい場合、時刻フィールドに自動計算は設定できません。(2026年03月現在)
そういった場合には、javascriptのカスタマイズや、プラグインなどを利用することになると思います。
計算プラグインでは、Excel関数の仕様を再現している関係上、日付、時間の計算はシリアル値で行っています。
時刻フィールドは"9:00"、"18:00"のように文字列として保存されており、Excelのようなシリアル値ではありません。
そのため、そのままではExcelと同じようには計算ができません。
■シリアル値とは?¶
Excelなどで日付や時間を計算するときに日付の文字列を数値に置き換えたもので、時間の場合は"0:00"が0、"24:00"が1となります。
Excelでこの値を知りたい場合は、9:00 など時間フォーマットで入力したあとに、書式変更でフォーマットを"標準"か"数値"にすると確認できます。
計算プラグインでシリアル値を確認する場合、もしくは計算で使用する場合は、"TIMEVALUE"関数を使って文字列になっている値をシリアル値に変換します。
例)
・文字列(1行)フィールドに"A1のシリアル値"と名前を付けてフォームを保存
・アプリの設定 → 高度な設定で[小数部の桁数]を5桁(またはそれ以上)、[丸めかた]を"切り上げ"
・計算プラグインで
A1のシリアル値:
TIMEVALUE(A1)
これで、入力画面でA1のシリアル値を確認することができます。
※日付のシリアル値を使う場合は"DATEVALUE"関数を使用します。
■補足:小数部の桁数について¶
時間のシリアル値による計算は少数点以下5位までの値を使用します。
kintoneのアプリの初期設定では[小数部の桁数]が4桁になっていて、このままでは誤差が生じてしまいます。
アプリの設定→高度な設定で[小数部の桁数]は5桁以上、[丸めかた]は"切り上げ"に設定してください。
■実際計算してみよう¶
Excelでは B1-A1 を計算しましたが、計算プラグインでは以下の計算式となります。
TIMEVALUE(B1) - TIMEVALUE(A1)
TIMEVALUE関数の分だけ計算式が長くなります。前述の通り、基本的な時間計算をするのであれば kintoneの計算フィールドや自動計算を使用した方が簡単に設定できます。(計算フィールドでの時間計算はこちら)
ですが「計算結果を時刻フィールドに表示したい場合」や「式の中でExcelのほかの関数を使用したいけれど計算フィールドにその関数がない場合」などに計算プラグインが真価を発揮します。
では、そんな応用編を説明していきます。
■補足:24時間以上の時間計算について¶
kintoneの時刻フィールドは「1日の時刻」を表すためのフィールドで、
00:00 ~ 23:59 までしか入力できません。
そのため、例えば月間勤務時間のように
24時間を超える時間は時刻フィールドでは表現できません。
このような場合は、
- 数値フィールドで時間を管理する
- 文字列フィールドで "[h]:mm" 形式に変換して表示する
といった方法を使います。
■応用① 関連レコード一覧で時間を合計する¶
例えば、日報をもとに月報を作成するなど、関連レコード一覧を使用した時間集計を行う場合
1. 関連レコード一覧で参照するアプリ側(日報アプリ)
開始時刻:時刻フィールド
終了時刻:時刻フィールド
時間集計:数値フィールド(シリアル値を保持する)
高度な設定:[小数部の桁数]を5桁(またはそれ以上)、[丸めかた]を"切り上げ"
計算プラグイン:
時間集計:
TIMEVALUE(終了時刻) - TIMEVALUE(開始時刻)
2. 関連レコード一覧を配置したアプリ側(月報アプリ)
時刻合算:文字列(1行)フィールド(kintoneの時刻フィールドは24時以上を表現できないため)
計算プラグイン:
時刻合算:
TEXT(SUM(時間集計.関連レコード一覧), "[h]:mm")
これで日報アプリの時間の集計を月報アプリに表示することができます。
■応用② 条件付きで休憩時間を引く¶
出勤時刻が12時より前の場合のみ休憩時間を差し引く計算などは
出勤時刻:時刻フィールド
退勤時刻:時刻フィールド
休憩時間:時刻フィールド
勤務時間:時刻フィールド
計算プラグイン:
勤務時間:
TIMEVALUE(退勤時刻) - TIMEVALUE(出勤時刻) - IF(TIMEVALUE(出勤時刻) < TIMEVALUE("12:00") , TIMEVALUE(休憩時間), 0)
とすることで表現できます。休憩時間は固定値の場合は TIMEVALUE("1:00") や TIMEVALUE("0:45") など記述することも可能です。
※ただし、TIMEVALUE関数には"23:59"より大きな時間は指定できません。TIMEVALUE("23:00")+TIMEVALUE("1:00")のような計算はできます。
■応用③ 未入力の場合は0時間にする¶
出勤時間が未入力の場合に勤務時間を"0:00"とする計算などは
出勤時刻:時刻フィールド
退勤時刻:時刻フィールド
勤務時間:時刻フィールド
計算プラグイン:
時間集計:
IF(ISBLANK(出勤時刻), TIMEVALUE("0:00"), TIMEVALUE(退勤時刻) - TIMEVALUE(出勤時刻))
■応用④ 日付をまたぐ時間計算(夜勤・深夜勤務など)¶
夜勤などで、出勤と退勤が日付をまたぐ場合、そのまま計算してしまうとマイナスになってしまいます。
例) 5:00 - 22:00 = -17:00
日を跨ぐ可能性がある場合は以下のように設定します。
出勤時刻:時刻フィールド
退勤時刻:時刻フィールド
計算プラグイン:
時間集計:
TIMEVALUE(退勤時刻) - TIMEVALUE(出勤時刻) + IF(TIMEVALUE(退勤時刻) < TIMEVALUE(出勤時刻), 1, 0)
または、MOD関数を使って次のように書くこともできます。
時間集計:
MOD(TIMEVALUE(退勤時刻) - TIMEVALUE(出勤時刻), 1)
MOD(値, 1) は 24時間(シリアル値=1)で折り返した値を取得できるため、
日付をまたぐ場合でも正しい時間差を求めることができます。
■まとめ¶
kintoneとExcelでは時間計算の仕組みが異なります。
- kintoneの計算フィールド → 秒で計算
- Excel / 計算プラグイン → シリアル値で計算
そのため、計算プラグインで時間を扱う場合は
TIMEVALUE関数でシリアル値に変換してから計算します。
この仕組みを理解しておくことで、
- 関連レコード一覧の時間集計
- 条件付き勤務時間計算
- 複雑な時間計算
などもExcelと同じ感覚で作れるようになります。
今回は以上です。
いかがでしたか?
ぜひ、計算プラグインをご活用ください。