GASで作る出欠管理スプレッドシート

GASスプレッドシート業務自動化
GASで作る出欠管理スプレッドシートのサムネイル

はじめに:GASで出欠管理をスマートに

こんにちは、GASおじです。中小企業の経営者さんやフリーランスの皆さん、出欠管理って意外と面倒じゃないですか?紙やExcelで管理していると、集計ミスや入力漏れも起こりがち。そこで今回はGoogle Apps Script(GAS)を使って、スプレッドシート上で効率的に出欠管理を行う方法を紹介します。

おじさんが特にこだわるのは「既存データをその場で消さないこと」と「業務に無駄なコストをかけないこと」。GASはGoogleアカウントの利用枠内で追加の専用SaaS料金なしで使えますが、quotaや実行上限はあるので賢く使いましょう。

出欠管理スプレッドシートの設計ポイント

まず、出欠管理の基本的な仕組みから。元のシートにはメンバー名や日付、出欠の入力欄があるとします。このデータは絶対に消さずに残しつつ、新しいシートに集計結果やバックアップを作成する形にしましょう。

  • 入力検証:出欠は「出席」「欠席」「遅刻」などの選択肢から選べるようにデータ検証を設定します。
  • バックアップ:処理前に元データを日時付きの新規シートにコピーして保管。
  • 集計処理:出席数や欠席数を計算し、新規の日時付き集計シートに書き込み。

この方法なら元シートは不変。トラブル時の復元も簡単です。

初期設定と必要な権限

スクリプトを動かすには、以下を確認してください。

  1. Googleスプレッドシートの編集権限が必要です。
  2. スクリプトの初回実行時にスプレッドシートの閲覧・編集権限を求められます。
  3. 個人情報(名前や出欠状況)を扱うため、社内ルールに基づき適切に管理してください。
  4. 定期実行したい場合は、「installable trigger」で時間主導型トリガーを設定しましょう(例:毎朝9時に集計)。
  5. 万が一失敗した場合は、バックアップシートから元データを参照して復元可能です。

実際のGASコード例

ここからは具体的なコードを紹介します。元の「AttendanceData」シートのデータをコピーしてバックアップ用の新規シートを作成し、出欠をカウントして別の新規シートに集計結果を書き出す例です。

function backupAndAggregateAttendance() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = ss.getSheetByName("AttendanceData");
  if (!sourceSheet) {
    Logger.log("AttendanceDataシートが見つかりません");
    return;
  }

  // バックアップシート名(日時付き)
  const backupName = "Backup_" + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd_HHmmss");
  // 集計シート名(日時付き)
  const aggregateName = "Aggregate_" + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd_HHmmss");

  // 元データの範囲取得
  const dataRange = sourceSheet.getDataRange();
  const dataValues = dataRange.getValues();

  // バックアップ用シート作成とデータコピー
  const backupSheet = ss.insertSheet(backupName);
  backupSheet.getRange(1, 1, dataValues.length, dataValues[0].length).setValues(dataValues);

  // 集計用シート作成
  const aggregateSheet = ss.insertSheet(aggregateName);
  
  // メンバー名は1列目、出欠は2列目以降の日付列にある想定
  // 出欠ステータスは「出席」「欠席」「遅刻」など

  // 出欠カウント用マップ
  let attendanceSummary = {};
  
  // 1行目はヘッダー行
  const headers = dataValues[0];
  // メンバー名は1列目(index 0)
  // 日付列は2列目以降(index 1〜)

  // メンバーごとに出欠を集計
  for (let i = 1; i < dataValues.length; i++) {
    const row = dataValues[i];
    const member = row[0];
    if (!member) continue;

    if (!attendanceSummary[member]) {
      attendanceSummary[member] = { 出席: 0, 欠席: 0, 遅刻: 0, その他: 0 };
    }

    for (let j = 1; j < row.length; j++) {
      const status = row[j];
      if (status === "出席") attendanceSummary[member].出席++;
      else if (status === "欠席") attendanceSummary[member].欠席++;
      else if (status === "遅刻") attendanceSummary[member].遅刻++;
      else if (status && status !== "") attendanceSummary[member].その他++;
    }
  }

  // 集計結果を書き込み
  // ヘッダー作成
  const aggregateHeaders = ["メンバー", "出席", "欠席", "遅刻", "その他"];
  aggregateSheet.getRange(1, 1, 1, aggregateHeaders.length).setValues([aggregateHeaders]);

  // データ作成
  const aggregateData = [];
  for (const member in attendanceSummary) {
    const counts = attendanceSummary[member];
    aggregateData.push([member, counts.出席, counts.欠席, counts.遅刻, counts.その他]);
  }

  aggregateSheet.getRange(2, 1, aggregateData.length, aggregateHeaders.length).setValues(aggregateData);
}

このスクリプトは、元のデータを消すことなくバックアップを作成し、出欠の集計結果を新しいシートに書き込みます。もし何か問題があってもバックアップからいつでも復元可能です。

導入で期待できるコスト削減のイメージ

一般的に、手作業で出欠管理や集計を1ヶ月あたり10時間かけている場合、GASで自動化できれば7割程度の時間削減が期待できます。仮に時給2,000円の担当者が10時間かけていたとすると、

削減時間 = 10時間 × 0.7 = 7時間
削減コスト = 7時間 × 2,000円 = 14,000円/月

年間にすると約168,000円の人件費削減効果が見込めます。ただし、これはあくまで仮定であり、導入効果は業務内容や運用状況によって異なります。

なお、GASはGoogleアカウントの利用枠内で追加の専用SaaS料金不要で使えますが、quotaや実行上限はあるので大量データや頻繁な実行には注意が必要です。

まとめと次のステップ

今回紹介したスクリプトはあくまで基本形。実際の運用では、入力フォームの作成やメール通知、Slack連携などを追加することで、さらに便利にできます。

GASは一度覚えれば業務の自動化や効率化に非常に役立つツールです。特に中小企業やフリーランスの方がコストをかけずに業務を改善したい場合、最適解の一つと言えます。

もっとたくさんの便利なツールを手に入れて、業務自動化を加速させたい方はぜひこちらのメンバーシップへどうぞ!

GASおじラボで500ツール使い放題 →