従業員が5~20名の会社では、勤怠管理SaaSの月額が1人あたり数百円でも、人数分をかけると年間のコストが無視できない金額になります。
かといって紙のタイムカードやExcelへの手入力に戻すのも面倒です。
無料で使えるGoogle Apps Script(Googleスプレッドシートに標準搭載されているスクリプト機能)で打刻の仕組みを自作できないか、と考える経営者や総務担当は少なくありません。
実際、打刻ボタンを押して時刻を記録し、月末に集計するだけの機能ならGoogle Apps Scriptで十分に組めます。
ただし残業計算のルールが複数ある、有給管理まで必要、といった条件がひとつでも加わると、自作の手間が一気に膨らみ、SaaSの月額のほうが安くつく場面に変わります。
この記事では、最小構成の打刻シートを作る手順と、自作で足りるラインの見極め方を整理していきます。
自作で足りる会社・足りない会社
打刻ボタンで時刻を記録し、月次で集計するだけなら、Google Apps Scriptでの自作は十分に実用に耐えます。
目安は、勤務形態が全員同じで、残業代の計算式がひとつだけ、有給や休日出勤の管理は別のExcelや紙で回している会社です。
従業員数でいえば、5~20名程度で担当者が全員の状況を目視でも把握できる規模が向いています。
一方、拠点や職種によって勤務時間帯が違う、フレックスやみなし残業が混在している、有給の残日数を自動で管理したい、といった条件が重なる会社は自作に向きません。
条件が増えるたびに判定ロジックが複雑になり、保守する担当者がいなくなった瞬間に運用が止まるリスクが上がるためです。
勤怠管理に求めることごとに、自作で足りるかを整理すると次のようになります。
| 求めること | 自作で足りるか |
|---|---|
| 打刻と時刻の記録 | 足りる(この記事の最小構成で対応) |
| 月次の勤務時間集計 | 足りる(集計シートの数式で対応) |
| 複数ルールの残業計算 | 足りない(条件分岐が複雑になりSaaSが安い) |
| 有給の残日数管理 | 足りない(保守の手間がSaaSの月額を上回りやすい) |
Google Apps Scriptで自動化する業務全般の選び方は、こちらで整理しています。

最小構成の打刻シートを作る手順
ここからは、打刻ボタンと月次集計だけに絞った最小構成の作り方を、4つの手順で説明します。
スプレッドシート1つと数十行のスクリプトで組めます。
Step1. 打刻用シートを用意する
Googleスプレッドシートを1つ作成し、シート名を「打刻」に変更します。
1行目に、日付・氏名・出勤時刻・退勤時刻の4列を見出しとして入力します。
このシートに、打刻のたびに1行ずつデータが追加されていく形にします。
Step2. 打刻ボタンにスクリプトを割り当てる(コード全文)
スプレッドシート上に図形を1つ描画し、打刻用のボタンとして使います。
拡張機能からApps Scriptエディタを開き、以下のコードを貼り付けて保存します。
同じ日の1回目の打刻を出勤、2回目を退勤として自動で判定する仕組みです。
なお、氏名の列には打刻した人のGoogleアカウントのメールアドレスが記録されます。
誰の打刻かを区別する値として、そのまま使ってください。
function stampTime() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('打刻');
const user = Session.getActiveUser().getEmail();
const now = new Date();
const today = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy/MM/dd');
const data = sheet.getDataRange().getValues();
let targetRow = -1;
for (let i = data.length - 1; i >= 1; i--) {
if (!data[i][0]) continue;
const rowDate = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
if (rowDate === today && data[i][1] === user) {
targetRow = i + 1;
break;
}
}
if (targetRow === -1) {
sheet.appendRow([today, user, now, '']);
return;
}
if (!data[targetRow - 1][3]) {
sheet.getRange(targetRow, 4).setValue(now);
} else {
SpreadsheetApp.getUi().alert('本日の出勤・退勤はすでに記録済みです');
}
}
function notifyMissingClockOut() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('打刻');
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const data = sheet.getDataRange().getValues();
const missing = [];
for (let i = 1; i < data.length; i++) {
const [date, name, clockIn, clockOut] = data[i];
if (!date) continue;
const rowDate = Utilities.formatDate(new Date(date), 'Asia/Tokyo', 'yyyy/MM/dd');
if (rowDate === today && clockIn && !clockOut) {
missing.push(name);
}
}
if (missing.length > 0) {
MailApp.sendEmail(
'[通知先メールアドレス]',
'本日の退勤打刻漏れ',
`退勤の打刻がないメンバーです。\n${missing.join('\n')}`
);
}
} 図形を右クリックし「スクリプトを割り当て」からstampTimeを指定すると、ボタンを押すだけで打刻できるようになります。
初回にボタンを押したときは、各自の画面にスクリプトの承認画面が表示されるので、内容を確認して許可してください。
承認は1人につき1回だけで、2回目以降は表示されません。
Step3. 月次集計シートを作る
集計用に新しいシートを追加し、氏名ごとに当月の合計勤務時間を出します。
氏名を入力したセルの隣に次の数式を入力すると、当月分の勤務時間の合計が時間単位で表示されます。
=SUMPRODUCT((打刻!$B$2:$B$1000=B2)*(TEXT(打刻!$A$2:$A$1000,"yyyy/mm")=TEXT(TODAY(),"yyyy/mm"))*(打刻!$D$2:$D$1000<>"")*(打刻!$D$2:$D$1000-打刻!$C$2:$C$1000))*24
退勤がまだ入力されていない行は集計から除外されるため、勤務中のメンバーがいても合計は崩れません。
範囲に指定した1000行は目安なので、従業員数と打刻の頻度に合わせて増やしてください。
Step4. 打刻漏れの通知を足す
Step2で貼り付けたコードには、退勤の打刻漏れを検知するnotifyMissingClockOutも含めています。
Apps Scriptエディタの時計マークのアイコンからトリガーの設定画面を開き、この関数を毎日20時に実行するよう設定すると、退勤の打刻がないメンバーがいる日だけ通知メールが届きます。
コード中の通知先メールアドレスは、実際に確認する担当者のアドレスに書き換えてください。
自作の限界:ここから先はSaaSが安い
ここまでの構成で運用できるのは、残業計算のルールがひとつで、有給管理を別で回している会社までです。
条件が増えると、SaaSに切り替えたほうが安くつくラインがいくつかあります。
切り替えを検討すべき条件は次の3つです。
- 法定・所定・深夜割増など、残業計算のルールが複数ある
- 有給の残日数を自動で管理したい
- 拠点やシフトが複数あり、担当者が全員分の打刻状況を目視で把握しきれない
残業計算のルールが増えるたびに条件分岐を書き足すことになり、法改正のたびに担当者が数式やコードを直す前提になってしまいます。
有給についても、付与日・繰越・時効の計算まで自作すると、保守にかかる手間がSaaSの月額を上回りやすくなります。
打刻の記録は、労働時間を客観的に把握するための資料としても位置づけられており、厚生労働省もガイドラインで考え方を示しています。
記録の正確さが崩れてから慌てるより、把握しきれなくなった時点で見直すほうが安全です。
出典: 厚生労働省「労働時間の適正な把握のために使用者が講ずべき措置に関するガイドライン」
現場での記録業務を自動化した想定ケースとして、日報の自動化例も参考になります。
同じGoogle Apps Scriptで、受信メールをスプレッドシートに自動転記する仕組みも組めます。

勤怠管理の自動化について相談してみませんか?
「自社の勤怠管理を自作でどこまで組めるか判断がつかない」「SaaSに切り替えるタイミングを見極めたい」「担当者が退職した後の保守が不安」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、勤怠管理の自動化に関するお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 打刻の記録は労務管理としてそのまま使えますか?
時刻の記録自体は使えますが、給与計算や残業代の集計まで自動化するかどうかは別の判断です。
残業計算のルールが複数ある会社は、集計部分だけ既存の勤怠ソフトに任せる組み合わせも検討してください。
Q. スマートフォンから打刻できますか?
スマートフォンのGoogleスプレッドシートアプリでは、図形に割り当てたスクリプトはタップしても動作しません。
スマートフォンから打刻したい場合は、図形の代わりにチェックボックスを置き、チェックが入ったら時刻を記録するトリガー(onEditトリガー)を組む方法が現実的です。
ブラウザでPC版の画面を開けば図形ボタンも押せますが、画面が小さく日常の打刻には向きません。
Q. 途中でSaaSに切り替える場合、データは引き継げますか?
打刻シートの日付・氏名・出勤時刻・退勤時刻はそのままCSVとして書き出せるため、多くの勤怠SaaSの初期データとして取り込めます。
ただし取り込み形式はサービスごとに異なるため、切り替え前に対応表を確認してください。