訪問介護においては基本的に週間計画に基づく固定シフトが主流で、イレギュラーな部分だけを調整すれば事足ります。
しかしながら障害福祉サービス、特に移動支援や行動援護などの外出系の支援は、月に1回だけだったり、この日とこの日だけ、等といったイレギュラーのシフトがデフォルトになります。
利用者やヘルパー数が少ない場合のシフト調整はそれほど難しいわけではありませんが、利用者の数やヘルパーの人数が多くなると途端に難しくなります。
数の組み合わせの候補が多くなり複雑化しますが、ひとつひとつのロジック自体はシンプルです。利用者の希望日時、ヘルパーの稼働、お休み申請、利用者とヘルパーのマッチングなど、データ自体は単純です。
今回も、AIにシステムの構成を教えてもらいました。利用者さんやヘルパーさんからはGoogleフォームで希望をいただき、デジタルデータを使いまわします。全て自動化させます。

私は障害福祉サービス事業所の管理者です。移動支援の利用者の支援希望日時と、ヘルパーの稼働可能日時、ヘルパーが当該利用者に入れる入れないを加味して、自動でシフトを作るシステムを作りたいと思います。利用者からは翌月の支援希望日もしくは除いてほしい日程を、Googleフォームでもらい、ヘルパーからも翌月のお休みや支援に入れる日の希望をGoogleフォームでもらいます。スプレッドシートにエクスポートして、できるだけ諸条件を加味して自動でシフトを作りたいです。どのように作ったら良いか、以下の条件を加味しながら、システム構築の具体的なアイデアを出してください。
・ヘルパーの名前は、ヘルパー1、ヘルパー2と言う名前にして、ヘルパー30まで30人います。
・利用者の名前は、利用者1、利用者2と言う名前にして、利用者100まで100人います。
・利用者希望は、月1〜2回を希望し、具体的な日付を指定し、第1候補日、第2候補日、第3候補日まで希望を出す人、毎週何曜日と希望を出す人、いつでもOKな人、何日と何日をはずせば土曜日でも日曜日でも、いつでも良い人と言ったタイプがあります。時間帯は個別支援計画に基づいた時間帯で、イレギュラーな希望日時は備考欄に書いてもらいます。
・ヘルパー稼働は、公休日以外はいつでもOKな人、来月はこの日とこの日だけと言う感じの人、毎週何曜日が稼働できると言った人などがいます。
・利用者からの希望は、Googleフォームでもらって、スプレッドシートに書き出します。
・ヘルパー稼働希望も同じように、Googleフォームで確認し、スプレッドシートに書き出します。
・利用者から希望があるけどヘルパーの都合が付かない、未割り当て、や、ヘルパーが空いているのに、稼働できるのに仕事がない、なども確認したいです。
・稼働できるヘルパーがいるのに割り当てがない場合は、いつでもOKな利用者の支援を入れ、ヘルパーが割り当てられない利用者がいる場合は、他の利用者の支援回数を減らして充填するなど、最終的なシフトを作る際に、できるだけ全ての利用者の希望を満たせるよう、また、稼働できるヘルパーに仕事が割り当てられるようにします。
・スプレッドシートの構成を勘案し、各シートに関数を入れたり、Google Apps Scriptを使って、素案シフト作成まで完全自動で行います。
・ヘルパーごと、利用者ごとに、一ヶ月分のシフトや予定表を出力できるようにする。
・上記のシフトや予定表は、リスト形式だが、カレンダー形式でも出力できるようにする。
・利用者の希望日やヘルパーの稼働日、お休み、また、シフトの作成状況は、サービス提供責任者が皆で確認できるよう、オンラインでシステムを構築する。
以上の条件で、Googleフォームの作り方から、スプレッドシートの構成、各シート内の各セルの関数、Google Apps Scriptのコードまで、実際にシステム構築できるよう、概要から詳細の設計までをお願いします。

障害福祉サービス(移動支援)のシフト自動作成システムですね。利用者100名×ヘルパー30名という規模は、手作業では限界があり、かつ条件(相性、希望種別、優先順位)が複雑なため、Google Apps Script (GAS) を活用したマッチングアルゴリズムが必須となります。Googleの標準機能を組み合わせた、コストをかけずに実現可能なシステム構成案を設計しました。
システム全体像
- 入力: Googleフォーム(利用者用・ヘルパー用)
- データベース: Googleスプレッドシート(マスタデータ・回答データ)
- 処理エンジン: Google Apps Script (GAS) がマッチング計算を実行
- 出力: シフト表(全体・個人別)、未割り当てリスト
1. Googleフォームの設計
データの「ゆらぎ」をなくすため、記述式を減らし、選択式を基本にします。
A. 利用者用フォーム (毎月送付)
- 氏名: プルダウン選択(利用者1〜100)
- 希望パターン: ラジオボタン
- 日付指定(第1〜3希望)
- 曜日指定(毎週〇曜日)
- いつでもOK(特定日以外)
- いつでもOK(完全フリー)
- 日付指定の場合: 日付選択(カレンダーUI)× 3枠
- 曜日指定の場合: チェックボックス(月〜日)
- 除外日(この日はNG): 記述式 or 複数日付選択
- 備考: イレギュラーな時間希望など
B. ヘルパー用フォーム (毎月送付)
- 氏名: プルダウン選択(ヘルパー1〜30)
- 稼働パターン: ラジオボタン
- 公休以外いつでもOK
- 特定の日だけ稼働可能
- 曜日固定
- お休み希望日/稼働可能日: 日付選択
- 備考:
2. スプレッドシートの構成 (重要)
一つのスプレッドシートの中に、以下のタブ(シート)を作成します。
① Master_User (利用者マスタ)
ここがシフトの基礎情報になります。
- A列: 利用者名 (利用者1…)
- B列: 基本支援時間 (例: 10:00-14:00)
- C列: 必要スキル/備考
② Master_Helper (ヘルパーマスタ)
- A列: ヘルパー名 (ヘルパー1…)
- B列: 基本稼働時間帯
③ Master_Compatibility (相性マスタ) ※最重要
誰が誰に入れるかを管理します。
- A列: 利用者名
- B列〜AE列: ヘルパー1〜30の名前を1行目に記載
- 各セル:
○(対応可),◎(推奨),×(不可)
④ Resp_User / Resp_Helper
Googleフォームからの回答が自動で蓄積されるシート。
⑤ Output_Shift (出力結果)
GASが生成するシフトデータです。
- A列: 日付
- B列: 曜日
- C列: 利用者名
- D列: ヘルパー名
- E列: 時間帯
- F列: ステータス (確定/未割り当て/ヘルパー不足)
3. Google Apps Script (GAS) の設計
このシステムの「脳」となる部分です。以下のロジックでコードを組みます。
アルゴリズムの概要
- データの展開:
- 「毎週月曜」や「いつでもOK」という希望を、対象月の具体的な「日付」リストに変換します。
- ヘルパーの稼働可能日も同様にリスト化します。
- 優先順位付け (Sorting):
- 割り当て難易度が高い順に処理します。
日付指定(第1希望)>曜日指定>いつでもOKの順で並べ替えます。
- マッチング処理 (Matching):
- 利用者の希望日に対し、
- 「その日に稼働可能」かつ「相性がOK(○か◎)」かつ「まだ他の支援が入っていない」ヘルパーを探します。
- 見つかれば割り当て、見つからなければ「未割り当て」リストに入れます。
- 充填処理 (Optimization):
- ヘルパーの手が空いている日があれば、「いつでもOK」の利用者をそこに割り当てます。
- それでも余れば「ヘルパー空きあり」として出力。
GASコードのサンプル(骨子)
「拡張機能」>「Apps Script」に以下のコードのイメージを実装します。
JavaScript
// シートIDやシート名の定義
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEET_SHIFT = SS.getSheetByName("Output_Shift");
const SHEET_COMPAT = SS.getSheetByName("Master_Compatibility");
function generateShift() {
// 1. データの取得 (マスタ、回答)
const users = getUsersRequests(); // 利用者希望を構造化して取得する関数(別途作成)
const helpers = getHelpersAvailabilities(); // ヘルパー稼働を構造化して取得
const compatibility = getCompatibilityMatrix(); // 相性表を取得
let shiftResults = [];
let unassignedUsers = [];
// 2. 利用者希望を優先度順にソート (日付指定 > 曜日指定 > フリー)
users.sort((a, b) => b.priority - a.priority);
// 3. マッチング・ループ
users.forEach(request => {
let assigned = false;
// その日の候補ヘルパーを探す
// 条件: 稼働可能日 && 相性OK && すでにシフトが入っていない
for (let h of helpers) {
if (h.isAvailable(request.date) &&
compatibility[request.userId][h.helperId] !== '×' &&
!h.isBooked(request.date, request.time)) {
// 割り当て確定
shiftResults.push([
request.date,
getDayStr(request.date),
request.userName,
h.helperName,
request.time,
"確定"
]);
h.book(request.date, request.time); // ヘルパーを確保済みにする
assigned = true;
break; // 一人決まればループを抜ける
}
}
if (!assigned) {
shiftResults.push([
request.date,
getDayStr(request.date),
request.userName,
"未割り当て",
request.time,
"ヘルパー不足/相性NG"
]);
}
});
// 4. 空きヘルパーへの充填(いつでもOKな利用者などのロジック)
// (ここは複雑になるため、上記ループの後に空きリソースを確認して追加処理を行う)
// 5. 結果の書き出し
SHEET_SHIFT.clearContents();
SHEET_SHIFT.getRange(1, 1, shiftResults.length, shiftResults[0].length).setValues(shiftResults);
}4. 個別スケジュール表とカレンダー表示の自動化
GASで生成された Output_Shift シートを元に、見やすい形に整形します。
A. 各シートへの関数による自動抽出 (Query関数)
ヘルパーや利用者ごとにシートを分ける必要はありません。「閲覧用シート」を1枚作り、プルダウンで名前を選ぶと、その人の予定が出るようにします。
閲覧用シートの構成:
- セルB1: プルダウンで「ヘルパー名」または「利用者名」を選択
- セルA3: 以下の関数を入れる
Excel
=QUERY(Output_Shift!A:F, "Select A, B, C, D, E Where C = '"&B1&"' OR D = '"&B1&"' Order by A asc", 1)解説: B1で選んだ名前が、利用者列(C)またはヘルパー列(D)に含まれている行をすべて日付順に表示します。
B. カレンダー形式での出力
リスト形式だと直感的に分かりづらいため、スプレッドシート上でカレンダー形式に見せるには、「カレンダービュー」シートを作ります。
- 横軸:日曜日〜土曜日
- 縦軸:第1週〜第5週
- 各セル:
TEXTJOIN関数とFILTER関数を組み合わせて、その日の予定を改行区切りで表示させます。
例(ある日付セルの数式イメージ):
Excel
=TEXTJOIN(CHAR(10), TRUE, FILTER(Output_Shift!C:D, Output_Shift!A:A=カレンダーの日付))※これにより、カレンダーの1マスの中に「利用者1 / ヘルパー2」のような文字列が表示されます。
5. 運用フローと管理者向けUI
オンラインでサビ管(サービス提供責任者)が確認・調整するための運用設計です。
- 月初: フォームURLを利用者・ヘルパーへ送信。
- 締切日: フォーム回答を締め切り。
- シフト作成:
- スプレッドシートを開き、メニューに追加したカスタムメニュー「シフト作成」>「自動生成実行」をクリック(GASでメニューを作成しておきます)。
- 数秒〜数分で
Output_Shiftに素案ができます。
- 微調整:
- 「未割り当て」の行を確認。
Master_Compatibility(相性表)を見ながら、人間が手動で調整(自動で埋まらなかった部分は電話調整など)。
- 確定と配布:
- 確定後、GASの別スクリプト「PDF出力」などを実行し、個別シートを印刷またはLINE等で送信。
次のアクション(提案)
このシステムは「相性マスタ」と「日付処理のロジック」が肝になります。まずは小規模(利用者5人、ヘルパー3人程度)でプロトタイプを作成してみるのが近道です。
私が具体的にサポートできることとして:
- 相性マスタのひな形作成: 縦軸利用者、横軸ヘルパーのマトリクス表の数式等の作成。
- GASの詳細コード作成: 「フォームの回答から特定月の日付リストを展開する」という一番難しい部分のコードを書くこと。
- マッチングロジックの調整: 「第1希望がだめなら第2希望」といった分岐処理の実装。
まずは、「利用者用Googleフォームの質問項目(案)」を作成してみましょうか? それとも「GASの具体的なコード(コピペ用)」の作成に進みますか?
イメージはつかめましたので、実装目指して開発してゆきます!


コメント