スマホから打刻できる勤怠システムを無料で作る方法|GoogleフォームとGASで実現
「社員のタイムカードをスマホで管理したい」「外出先やリモートワーク中でも打刻できる仕組みがほしい」――そんな悩みを抱えている中小企業の管理者は少なくありません。市販の勤怠管理システムは月額で数万円かかるものも多く、数名規模の会社では費用対効果が見合わないケースもあります。
実は、Googleフォームと Google Apps Script(GAS)を組み合わせれば、初期費用ゼロ・月額費用ゼロで「スマホから打刻できる勤怠管理システム」を構築できます。この記事では、プログラミング未経験の方でも再現できるよう、具体的な手順をスプレッドシートの設計からGASのコードまで一つずつ解説します。
この記事の目次
なぜGoogleフォーム+GASで勤怠システムが作れるのか
Googleフォームは、スマホのブラウザからアクセスするだけで入力・送信ができるツールです。回答データはGoogleスプレッドシートに自動で蓄積されるため、「入力画面」と「データベース」の2つが無料で手に入ります。
ここにGAS(Google Apps Script)を組み合わせると、フォーム送信をトリガーにして「出勤・退勤の判定」「勤務時間の自動計算」「月次集計シートへの転記」まで自動化できます。GASはGoogleが提供するJavaScriptベースのスクリプト環境で、Googleアカウントがあれば追加費用なしで利用可能です。
無料で使える理由
Googleフォーム、スプレッドシート、GASはすべてGoogle Workspaceの無料枠(個人Googleアカウント)で動作します。Google Workspace Business Starterを導入済みの企業であれば、そのまま利用できます。GASの実行回数にも無料枠があり、1日あたり最大6分の実行時間が割り当てられています(Google公式:Apps Scriptのクォータ、2026年4月時点)。社員50名程度までなら、この無料枠で十分に運用できます。
市販の勤怠システムとの違い
KING OF TIMEやジョブカン勤怠管理といった市販SaaSは、1人あたり月額200〜400円程度が相場です。社員30名なら月額6,000〜12,000円、年間で7〜14万円のコストになります。GPS打刻やシフト管理など高機能が必要な場合は市販SaaSが向いていますが、「出退勤の時刻を記録して月末に集計する」だけであれば、Googleフォーム+GASで十分対応できます。
完成イメージと全体構成を把握する
まず完成後の利用フローを確認します。全体像を把握してから作業に入ると、各ステップの意味が理解しやすくなります。
利用フロー(社員側)
社員はスマホのホーム画面に設置したショートカットアイコンをタップします。Googleフォームが開いたら、自分の名前を選択し「出勤」または「退勤」を選んで送信するだけです。所要時間は5秒程度です。
データフロー(システム側)
フォームの送信データはスプレッドシートの「回答」シートに自動で蓄積されます。GASがフォーム送信をトリガーに起動し、「勤怠管理」シートに日付・氏名・出勤時刻・退勤時刻・勤務時間を自動で整形・転記します。月末には「月次集計」シートに社員ごとの勤務日数・合計時間がまとまります。
必要なもの
- Googleアカウント(個人用でもWorkspaceでも可)
- スマホまたはPC(フォーム作成時はPCが作業しやすい)
- 所要時間:約60〜90分(初回構築時)
手順1:Googleフォームで打刻フォームを作成する
Google ドライブ(drive.google.com)にアクセスし、左上の「新規」からGoogleフォームを作成します。
フォームの項目設定
フォームには以下の3項目だけを設置します。入力項目を最小限にすることで、打刻にかかる時間を短縮できます。
項目1:氏名(プルダウン形式)
回答形式を「プルダウン」に設定し、社員の氏名を選択肢として登録します。自由入力にすると表記揺れ(「田中太郎」「田中 太郎」「たなかたろう」など)が発生するため、必ずプルダウンにしてください。「必須」をONにします。
項目2:打刻種別(ラジオボタン形式)
選択肢は「出勤」「退勤」の2つです。回答形式を「ラジオボタン」に設定し、「必須」をONにします。
項目3:備考(短文回答・任意)
「直行」「直帰」「早退」などのメモを残す用途です。「必須」はOFFにしておきます。不要であれば省略しても構いません。
フォームの設定調整
フォーム上部の歯車アイコン(設定)をクリックし、以下を確認します。
- 「回答を1回に制限する」はOFF(1日に出勤・退勤の2回送信するため)
- 「メールアドレスを収集する」はOFF(不要な入力を省くため)
- 「回答のコピーを回答者に送信」はOFF
設定が完了したら「回答」タブを開き、スプレッドシートのアイコンをクリックして「新しいスプレッドシートを作成」を選択します。これで、フォームの回答がスプレッドシートに自動連携されます。
業務自動化でできること100選
経理・人事・営業・CS・総務・ITの6部門100事例を収録。各事例に月間削減時間と導入難易度を明記。今日から始められるチェックリスト付き。
手順2:スプレッドシートの勤怠管理テンプレートを設計する
フォームと連携したスプレッドシートを開くと、「フォームの回答 1」というシートが自動作成されています。このシートはフォームの生データ置き場として残しておき、別シートに整形後のデータを出力する構成にします。
シート構成
シート1:フォームの回答 1(自動生成・編集不要)
A列にタイムスタンプ、B列に氏名、C列に打刻種別、D列に備考が記録されます。このシートは直接編集しません。
シート2:勤怠管理(手動で新規作成)
GASが整形したデータを出力するシートです。1行目にヘッダーを設定します。
| A列 | B列 | C列 | D列 | E列 | F列 |
|---|---|---|---|---|---|
| 日付 | 氏名 | 出勤時刻 | 退勤時刻 | 勤務時間 | 備考 |
シート3:月次集計(手動で新規作成)
月末に社員ごとの勤務日数と合計勤務時間を集計するシートです。こちらもGASで自動出力します。
手順3:GASで打刻データを自動整形するスクリプトを書く
スプレッドシートのメニューから「拡張機能」→「Apps Script」を開きます。既存のコード(function myFunction()…)を削除し、以下のスクリプトを貼り付けてください。
メインスクリプト:フォーム送信時の自動処理
以下のスクリプトは、Googleフォームが送信されるたびに自動で実行されます。出勤打刻であれば「勤怠管理」シートに新しい行を追加し、退勤打刻であれば同日・同一人物の行を検索して退勤時刻と勤務時間を書き込みます。
function onFormSubmit(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('勤怠管理');
var responses = e.values;
var timestamp = new Date(responses[0]);
var name = responses[1];
var type = responses[2]; // 出勤 or 退勤
var note = responses[3] || '';
var date = Utilities.formatDate(timestamp, 'Asia/Tokyo', 'yyyy/MM/dd');
var time = Utilities.formatDate(timestamp, 'Asia/Tokyo', 'HH:mm');
if (type === '出勤') {
// 出勤:新しい行を追加
sheet.appendRow([date, name, time, '', '', note]);
} else if (type === '退勤') {
// 退勤:同日・同名の行を探して退勤時刻を記入
var data = sheet.getDataRange().getValues();
for (var i = data.length - 1; i >= 1; i--) {
if (data[i][0] === date && data[i][1] === name && data[i][3] === '') {
sheet.getRange(i + 1, 4).setValue(time);
// 勤務時間を計算(時間単位・小数点1桁)
var startParts = data[i][2].split(':');
var endParts = time.split(':');
var startMin = parseInt(startParts[0]) * 60 + parseInt(startParts[1]);
var endMin = parseInt(endParts[0]) * 60 + parseInt(endParts[1]);
var workHours = ((endMin - startMin) / 60).toFixed(1);
sheet.getRange(i + 1, 5).setValue(workHours + '時間');
if (note) sheet.getRange(i + 1, 6).setValue(note);
break;
}
}
}
}
月次集計スクリプト
月末に実行する集計用スクリプトです。「勤怠管理」シートのデータを社員ごとに集計し、「月次集計」シートに出力します。毎月1日の朝に自動実行する設定(トリガー)も後述します。
function monthlySummary() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheetByName('勤怠管理');
var summary = ss.getSheetByName('月次集計');
// 先月の年月を取得
var now = new Date();
var lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1);
var targetYM = Utilities.formatDate(lastMonth, 'Asia/Tokyo', 'yyyy/MM');
var data = source.getDataRange().getValues();
var result = {};
for (var i = 1; i < data.length; i++) {
var rowDate = String(data[i][0]);
if (!rowDate.startsWith(targetYM)) continue;
var name = data[i][1];
var hours = parseFloat(data[i][4]) || 0;
if (!result[name]) {
result[name] = { days: 0, totalHours: 0 };
}
result[name].days++;
result[name].totalHours += hours;
}
// 集計シートに出力
summary.clear();
summary.appendRow(['集計期間', targetYM]);
summary.appendRow(['氏名', '出勤日数', '合計勤務時間']);
Object.keys(result).forEach(function(name) {
summary.appendRow([
name,
result[name].days + '日',
result[name].totalHours.toFixed(1) + '時間'
]);
});
}
トリガーの設定方法
Apps Scriptの左メニューから時計アイコン(トリガー)をクリックし、以下の2つを設定します。
トリガー1:onFormSubmit
イベントのソースを「スプレッドシートから」、イベントの種類を「フォーム送信時」に設定します。これでフォーム送信のたびにスクリプトが自動実行されます。
トリガー2:monthlySummary
イベントのソースを「時間主導型」、タイプを「月ベースのタイマー」に設定し、「毎月1日」「午前6〜7時」を選択します。前月分の集計が毎月自動で行われます。
手順4:スマホのホーム画面にショートカットを設置する
Googleフォームの「送信」ボタンからURLリンクをコピーし、スマホのホーム画面にショートカットを作成します。社員は毎朝このアイコンをタップするだけで打刻画面にアクセスできます。
iPhoneの場合
Safariでフォームの回答URLを開き、画面下部の共有ボタン(四角に上矢印のアイコン)をタップします。「ホーム画面に追加」を選択し、アイコン名を「出退勤」などわかりやすい名前に変更して「追加」をタップすれば完了です。
Androidの場合
Google ChromeでフォームのURLを開き、右上の三点メニューから「ホーム画面に追加」を選択します。名前を設定して「追加」をタップすれば、ホーム画面にショートカットアイコンが作成されます。
社員への共有方法
フォームURLを社内のチャットツール(Slack、LINE WORKS、Chatworkなど)で全社員に共有し、各自のスマホにショートカットを設定してもらいます。初回設定の手順書を画面キャプチャ付きで用意しておくと、問い合わせが減ります。
運用時の注意点とよくあるトラブル対処法
構築して終わりではなく、運用開始後にいくつか注意すべきポイントがあります。事前に把握しておくことで、トラブル発生時にも素早く対応できます。
打刻忘れへの対応
出勤打刻を忘れた場合、退勤打刻時に対応する出勤行が見つからず、退勤時刻が記録されません。対処法として、管理者が「勤怠管理」シートに手動で出勤時刻を入力する運用ルールを決めておきます。GASに打刻忘れ検知の機能を追加することも可能で、以下のような通知スクリプトを併用すると効果的です。
function checkMissingClockOut() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('勤怠管理');
var data = sheet.getDataRange().getValues();
var today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
var missing = [];
for (var i = 1; i < data.length; i++) {
if (data[i][0] === today && data[i][3] === '') {
missing.push(data[i][1]);
}
}
if (missing.length > 0) {
var body = '退勤未打刻: ' + missing.join(', ');
GmailApp.sendEmail('admin@example.com', '退勤未打刻通知', body);
}
}
このスクリプトを時間主導型トリガーで「毎日20時」に設定しておけば、退勤打刻を忘れている社員を管理者にメール通知できます。
タイムスタンプの精度について
Googleフォームのタイムスタンプはサーバー受信時刻が基準です。そのため、通信環境が悪い場所ではフォーム送信に数秒〜数十秒の遅延が生じる場合があります。秒単位の精度が求められる職種では、市販の勤怠システムの利用を検討してください。分単位の管理であれば、この仕組みで十分な精度が得られます。
データのバックアップ
スプレッドシートはGoogleドライブ上に自動保存されますが、万が一の削除や誤操作に備えて、月次集計のタイミングでPDFとしてエクスポートする運用を推奨します。Apps ScriptのgetAs('application/pdf')メソッドで自動PDF化も実現できます。
社員数が増えた場合
新入社員が加わったら、Googleフォームのプルダウン選択肢に氏名を追加するだけで対応完了です。スクリプト側の変更は不要です。ただし社員50名を超えるあたりから、スプレッドシートの行数が増えてスクリプトの実行時間が長くなる可能性があります。その場合は月ごとにシートを分割する、または市販の勤怠システムへの移行を検討してください。
この仕組みの限界と、次のステップ
Googleフォーム+GASの勤怠システムは手軽に構築できる反面、いくつかの制約があります。導入前に把握しておくことで、後から「やっぱりできなかった」という事態を防げます。
できないこと
- GPS位置情報の記録(不正打刻の防止が難しい)
- シフト管理・残業アラート・有給管理
- 労働基準法に準拠した36協定の自動チェック
- 給与計算ソフトとのデータ連携(CSV出力で手動対応は可能)
次のステップ
まずこの無料の仕組みで「スマホ打刻」の文化を社内に定着させ、運用上の課題を洗い出すのがおすすめです。3ヶ月ほど運用して「GPS打刻がほしい」「シフト管理と連動させたい」といった追加要件が明確になった段階で、KING OF TIMEやジョブカン勤怠管理などの市販SaaSへの移行を検討するとスムーズです。
なお、GASを使った業務自動化はこの勤怠管理以外にも幅広く応用できます。請求書の自動作成、日報の自動集計、問い合わせフォームの自動振り分けなど、Googleスプレッドシートを中心とした業務であればGASで自動化できる範囲は非常に広いです。
Q.Googleアカウントは個人用と法人用(Workspace)のどちらがよいですか?
A.法人として運用するならGoogle Workspace Business Starter(1ユーザーあたり月額680円、2026年4月時点)の利用を推奨します。管理コンソールでアカウントの一元管理ができ、退職者のデータ引き継ぎもスムーズです。個人アカウントでも機能的には同じことが可能ですが、管理者の個人アカウントに業務データが紐づくリスクがあります。
Q.打刻データの改ざん防止はできますか?
A.スプレッドシートの「勤怠管理」シートに対して、管理者以外の編集権限を外すことで簡易的な改ざん防止が可能です。また、フォーム回答の生データ(「フォームの回答 1」シート)は自動記録されるため、整形後のデータと突き合わせて異常を検知できます。ただし、他人の名前を選択して打刻する「なりすまし」は防げないため、社内ルールでの運用対策が必要です。
Q.GASのスクリプトが動かないときはどうすればよいですか?
A.Apps Scriptエディタの「実行ログ」を確認してください。よくある原因は、トリガーの設定漏れ(フォーム送信時トリガーが未設定)、シート名の不一致(「勤怠管理」と全角半角が合っていない)、初回実行時のGoogleアカウント承認が未完了の3点です。特に初回は「このアプリを承認しますか?」というダイアログで「許可」をクリックする必要があります。
Q.スマホ以外にPCやタブレットからも打刻できますか?
A.はい。GoogleフォームはWebブラウザで動作するため、スマホ・PC・タブレットのいずれからでも打刻できます。オフィス勤務の社員はPCブラウザから、外出先の社員はスマホからと、デバイスを問わず利用可能です。
Q.残業時間の集計や深夜勤務にも対応できますか?
A.日付をまたぐ深夜勤務(たとえば22時出勤・翌6時退勤)にはこのスクリプトのままでは対応できません。日付またぎに対応するには、スクリプト内の勤務時間計算ロジックをDateオブジェクトベースに書き換える必要があります。残業時間の集計は、所定労働時間(例:8時間)を超えた分をカウントするロジックを追加すれば実現可能です。
まとめ
- Googleフォーム+GAS+スプレッドシートで、初期費用ゼロのスマホ打刻勤怠システムが構築できる
- フォームは「氏名(プルダウン)」「打刻種別」「備考」の3項目だけでシンプルに設計する
- GASでフォーム送信時に自動で出退勤データを整形し、月次集計まで自動化できる
- 社員50名程度までならGASの無料枠で十分に運用できる
- GPS打刻やシフト管理が必要になったら市販SaaSへの移行を検討する
GASでシステムを拡張する際、Slackや給与計算サービスへの通知を追加したい場合は、GASのAPI連携機能(UrlFetchApp)の使い方と認証の実装方法を参照してください。
2026年4月