Math.randomで勤怠管理を効率化!GASで実現するランダム出勤シフト
勤怠管理システムの構築、特にシフト作成は多くの企業にとって悩みの種です。従業員の希望、スキル、公平性、そして何よりランダム性。これらを考慮しながら手作業でシフトを作成するのは時間と労力がかかります。そこで、Google Apps Script(GAS)とMath.random()
を組み合わせることで、これらの課題を解決し、より効率的で公平なシフト作成を実現できます。
Math.random()関数の基本
Math.random()
は、0以上1未満の擬似乱数を返すJavaScriptの組み込み関数です。GASでもJavaScriptの機能を利用できるため、この関数を使って様々なランダム処理を実装できます。この関数は、完全に予測不可能な乱数を生成するわけではありませんが、多くの業務効率化の場面で十分なランダム性を提供します。
勤怠管理におけるMath.random()の実装方法
勤怠管理、特にシフト作成において、Math.random()
は以下のような場面で活用できます。
- ランダムな出勤日の割り当て
- 特定の役割をランダムに割り当てる(例:リーダー、サブリーダー)
- 休憩時間のランダムな割り当て
実用的なコード例1:ランダムな出勤日の割り当て
このコードは、従業員リストと出勤日数を指定すると、ランダムに出勤日を割り当てるスクリプトです。
function assignRandomWorkdays(employees, workdays) {
// 出勤日を割り当てる従業員を格納する配列
const assignedEmployees = [];
//従業員リストをシャッフル
const shuffledEmployees = employees.sort(() => Math.random() - 0.5);
for (let i = 0; i < workdays; i++) {
assignedEmployees.push(shuffledEmployees[i % employees.length]);
}
return assignedEmployees;
}
// 使用例
function example() {
const employees = ["田中", "佐藤", "鈴木", "高橋"];
const workdays = 20;
const assigned = assignRandomWorkdays(employees, workdays);
Logger.log(assigned);
}
実用的なコード例2:特定の役割のランダム割り当て
このコードは、特定の役割(例:リーダー、サブリーダー)を従業員にランダムに割り当てるスクリプトです。
function assignRandomRoles(employees, roles) {
const assignments = {};
const shuffledEmployees = employees.sort(() => Math.random() - 0.5);
for (let i = 0; i < roles.length; i++) {
assignments[roles[i]] = shuffledEmployees[i];
}
return assignments;
}
// 使用例
function example2() {
const employees = ["田中", "佐藤", "鈴木", "高橋"];
const roles = ["リーダー", "サブリーダー"];
const assignments = assignRandomRoles(employees, roles);
Logger.log(assignments);
}
実用的なコード例3:休憩時間のランダムな割り当て
このコードは、従業員に休憩時間をランダムに割り当てるスクリプトです。休憩時間帯、休憩時間(分)、従業員数を指定することで、休憩時間を割り当てます。
function assignRandomBreakTimes(employees, breakStart, breakEnd, breakLength) {
const assignments = {};
employees.forEach(employee => {
// 開始時間と終了時間の間でランダムな休憩時間を生成
const startTimeMinutes = breakStart * 60;
const endTimeMinutes = breakEnd * 60 - breakLength;
const randomMinutes = Math.floor(Math.random() * (endTimeMinutes - startTimeMinutes + 1)) + startTimeMinutes;
// 分を時間に変換
const breakHour = Math.floor(randomMinutes / 60);
const breakMinute = randomMinutes % 60;
// 休憩時間を割り当て
assignments[employee] = breakHour + ":" + (breakMinute < 10 ? "0" : "") + breakMinute;
});
return assignments;
}
// 使用例
function example3() {
const employees = ["田中", "佐藤", "鈴木", "高橋"];
const breakStart = 12; // 12時
const breakEnd = 14; // 14時
const breakLength = 45; // 休憩45分
const assignments = assignRandomBreakTimes(employees, breakStart, breakEnd, breakLength);
Logger.log(assignments);
}
よくある問題とトラブルシューティング
- 偏りが発生する:
Math.random()
は擬似乱数であるため、完全にランダムではありません。偏りを減らすためには、十分な試行回数やシャッフルのアルゴリズムを工夫する必要があります。 - 同じ人に連続して割り当てられる: ランダムに割り当てた結果、同じ人に特定の役割や出勤日が集中してしまうことがあります。これを避けるためには、割り当ての履歴を保持し、偏りを検知して調整する仕組みを導入する必要があります。
- 従業員の希望を考慮したい: 完全なランダムではなく、従業員の希望をある程度反映させたい場合は、希望をポイント化し、
Math.random()
の結果に加味するなどの工夫が必要です。
カスタマイズ方法と応用例
- 特定の条件に基づいて確率を調整する: 例えば、特定のスキルを持つ従業員を優先的に割り当てる場合、
Math.random()
の結果に条件に応じた重み付けを行うことで、割り当て確率を調整できます。 - スプレッドシートとの連携: 従業員リストやシフト情報をスプレッドシートで管理し、GASで読み込んで処理することで、より柔軟なシフト管理システムを構築できます。
- UIの追加: Google Apps ScriptのHTMLサービスを利用して、シフト作成や管理を行うための簡単なWebインターフェースを作成できます。
まとめ
Math.random()
とGASを組み合わせることで、勤怠管理におけるシフト作成を効率化し、より公平な割り当てを実現できます。今回紹介したコード例はあくまで基本的なものですが、カスタマイズ次第で様々な業務課題を解決できます。ぜひ、GASとMath.random()
を活用して、よりスマートな勤怠管理システムを構築してみてください。
CodeCampは、現役エンジニアからマンツーマンで学べるオンラインプログラミングスクールです。WebデザインやWebサービス開発、転職支援など、目的に合わせた多様なコースが選べます。
朝7時〜夜23時40分まで、365日レッスンが受けられるため、忙しい方でも自分のペースで学習を進めることが可能です。通過率8%の厳しい選考を通過した質の高い講師陣が、あなたのキャリアチェンジを強力にサポートします。
さらに、未経験者向けのカリキュラムや、学習開始から20日以内の全額返金保証制度もあるため、プログラミング学習に不安を感じている方でも安心して始めることができます。
CodeCampで理想の働き方を実現しよう