この記事でわかること
- Googleフォームで勤怠を収集してGASで自動集計する仕組み
- 月次の合計時間を自動計算するコード全文
- Slackへの集計結果通知もまとめて自動化
なぜGoogleフォーム×GASで勤怠管理するのか
専用の勤怠システムを導入するほどではないが、Excelで手集計するのは手間がかかる。そんな場合、Googleフォーム+スプレッドシート+GASの組み合わせが軽量で使いやすいです。
- 初期費用ゼロ:Googleアカウントがあれば即使える
- スマホから打刻できる:フォームをブックマークするだけ
- 自動集計:GASが計算してくれるので手作業ゼロ
全体の仕組み
スタッフがGoogleフォームに入力
↓
スプレッドシートに自動記録
↓
GASが月次集計を自動計算
↓
集計結果をSlackに通知(オプション)
Googleフォームの設計
勤怠フォームに必要な項目はシンプルにこれだけです。
| 項目 | 形式 |
|---|---|
| 氏名 | プルダウン(名前一覧) |
| 日付 | 日付 |
| 開始時間 | 時刻 |
| 終了時間 | 時刻 |
| 休憩時間(分) | 記述式(数字) |
| 業務内容メモ | 記述式(任意) |
GASのコード全文
スプレッドシートの「拡張機能」→「Apps Script」でスクリプトエディタを開き、以下を貼り付けてください。
// ===== 設定 =====
const SLACK_WEBHOOK_URL = "ここにWebhook URLを貼る"; // 不要な場合は空文字のまま
const SHEET_NAME = "フォームの回答 1"; // 回答シート名
const SUMMARY_SHEET_NAME = "月次集計"; // 集計シート名(なければ自動作成)
// ================
// 列の定義(フォームの順番に合わせて変更してください)
const COL = {
TIMESTAMP: 1, // タイムスタンプ
NAME: 2, // 氏名
DATE: 3, // 日付
START: 4, // 開始時間
END: 5, // 終了時間
BREAK: 6, // 休憩時間(分)
MEMO: 7 // 業務メモ
};
// 月次集計を実行する
function calcMonthlySummary() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dataSheet = ss.getSheetByName(SHEET_NAME);
// 集計シートを取得または作成
let summarySheet = ss.getSheetByName(SUMMARY_SHEET_NAME);
if (!summarySheet) {
summarySheet = ss.insertSheet(SUMMARY_SHEET_NAME);
}
summarySheet.clearContents();
// 対象月(当月)
const now = new Date();
const targetYear = now.getFullYear();
const targetMonth = now.getMonth(); // 0始まり
// データ取得
const lastRow = dataSheet.getLastRow();
if (lastRow < 2) {
console.log("データがありません");
return;
}
const data = dataSheet.getRange(2, 1, lastRow - 1, COL.MEMO).getValues();
// 名前ごとに集計
const summary = {};
data.forEach(function(row) {
const dateVal = new Date(row[COL.DATE - 1]);
if (dateVal.getFullYear() !== targetYear || dateVal.getMonth() !== targetMonth) return;
const name = row[COL.NAME - 1];
const start = new Date(row[COL.START - 1]);
const end = new Date(row[COL.END - 1]);
const breakMin = Number(row[COL.BREAK - 1]) || 0;
// 実働時間(時間)
const workHours = (end - start) / (1000 * 60 * 60) - breakMin / 60;
if (workHours <= 0) return;
if (!summary[name]) {
summary[name] = { totalHours: 0, days: 0 };
}
summary[name].totalHours += workHours;
summary[name].days += 1;
});
// 集計シートに書き出し
const targetMonthStr = `${targetYear}年${targetMonth + 1}月`;
summarySheet.appendRow([`【${targetMonthStr} 勤怠集計】`]);
summarySheet.appendRow(["氏名", "出勤日数", "合計時間", "平均時間/日"]);
let slackText = `📋 *${targetMonthStr} 勤怠集計*\n\n`;
Object.keys(summary).sort().forEach(function(name) {
const d = summary[name];
const avg = d.days > 0 ? (d.totalHours / d.days).toFixed(1) : 0;
const totalStr = `${Math.floor(d.totalHours)}時間${Math.round((d.totalHours % 1) * 60)}分`;
summarySheet.appendRow([name, d.days, totalStr, `${avg}時間`]);
slackText += `*${name}*:${d.days}日 ${totalStr}\n`;
});
console.log("集計完了");
// Slackに通知(URLが設定されている場合)
if (SLACK_WEBHOOK_URL) {
const message = {
username: "勤怠集計Bot",
icon_emoji: ":calendar:",
text: slackText
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(message)
});
}
}
自動実行のトリガー設定
毎月1日の朝に自動集計するトリガーを設定します。
- スクリプトエディタ左側の時計アイコン(トリガー)をクリック
- 「トリガーを追加」
- 以下のように設定
| 項目 | 設定値 |
|---|---|
| 実行する関数 | calcMonthlySummary |
| イベントのソース | 時間主導型 |
| 種類 | 月ベースのタイマー |
| 日にち | 1日 |
| 時刻 | 午前9時〜10時 |
注意点・カスタマイズポイント
列番号の調整
フォームの質問の順番を変えた場合は、コード冒頭の COL オブジェクトの番号を合わせてください。実際のスプレッドシートの列番号(A列=1)と対応しています。
時刻データの扱い
Googleフォームの「時刻」形式はスプレッドシートに 1899/12/30 09:00:00 のような形で入ります。コード内で new Date() に変換して計算しているので、フォームの時刻形式を変えないでください。
まとめ
- Googleフォーム×GAS×スプレッドシートで勤怠管理が無料で実現できる
- 月次集計は毎月1日に自動実行できる
- 集計結果をSlackに自動通知すれば確認の手間もゼロ
専用システム不要で、Googleアカウントさえあれば今日から使えます。ぜひ試してみてください。
GASを使った勤怠・HR系の自動化のご相談はお問い合わせフォームからどうぞ。


コメント