【コピペOK】GASでGoogleフォームの勤怠データを自動集計する方法

GAS・自動化
この記事でわかること
  • 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日の朝に自動集計するトリガーを設定します。

  1. スクリプトエディタ左側の時計アイコン(トリガー)をクリック
  2. 「トリガーを追加」
  3. 以下のように設定
項目設定値
実行する関数calcMonthlySummary
イベントのソース時間主導型
種類月ベースのタイマー
日にち1日
時刻午前9時〜10時

注意点・カスタマイズポイント

列番号の調整

フォームの質問の順番を変えた場合は、コード冒頭の COL オブジェクトの番号を合わせてください。実際のスプレッドシートの列番号(A列=1)と対応しています。

時刻データの扱い

Googleフォームの「時刻」形式はスプレッドシートに 1899/12/30 09:00:00 のような形で入ります。コード内で new Date() に変換して計算しているので、フォームの時刻形式を変えないでください。


まとめ

  • Googleフォーム×GAS×スプレッドシートで勤怠管理が無料で実現できる
  • 月次集計は毎月1日に自動実行できる
  • 集計結果をSlackに自動通知すれば確認の手間もゼロ

専用システム不要で、Googleアカウントさえあれば今日から使えます。ぜひ試してみてください。


GASを使った勤怠・HR系の自動化のご相談はお問い合わせフォームからどうぞ。

コメント

タイトルとURLをコピーしました