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

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

記事
IT・テクノロジー

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

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

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


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

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

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


■ 初期設定と必要な権限

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

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


■ 実際の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の相談や導入サポートを見たい方へ

この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。

■ 関連サービス

GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す