介護施設が職員から毎月集める勤務の希望をフォームで受け、Apps Script と AI で希望の食い違い・夜勤の回数の偏り・人手の足りない日を拾ってシフトの作成者に返す
職員が翌月の勤務の希望を Google フォームで出すと、Apps Script が日ごとの選択を表にし、AIが備考と選択の食い違いを判定します。締切の翌朝には、人手の足りない日と夜勤の回数の偏りをまとめて、シフトの作成者に返します。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 介護/医療/宿泊
- 対象部門
- 人事
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 主任が月初に翌月の希望表を配り、10日までに回収する。メッセージで届いた希望は印刷するか書き写す
- 1人ずつ希望表を読み、勤務表の希望の欄に転記する
- 余白の事情を読み、表の記号と合っているかを確かめる
- 法人の決まり(希望休の日数、夜勤の回数、夜勤の後の休み)に合わない希望に印を付ける
- 日ごとに、勤務できる職員の数と夜勤ができる職員の数を数える
- 食い違いのある希望や、人手の足りない日について、職員に聞き直す
- 返事を待って勤務表を直し、シフトを組み始める
- 人主任が月初に、翌月の日付を入れた希望のフォームを職員に知らせる
- 人職員がスマートフォンからフォームに答える(日ごとの選択、夜勤の希望回数、備考)
- 自動回答のたびに Apps Script が動き、回答を職員ごと・日ごとの表に直す
- 自動法人の決まり(希望休の日数、夜勤の回数、夜勤の後の休み)との合わなさを数で確かめる
- 自動備考がある回答は、選択の表と備考を Claude API に渡し、食い違いの有無を JSON で受け取る
- 自動結果を確認の一覧に書き、食い違いや合わなさがあれば、職員への聞き直しの文案を付ける
- 自動締切の翌朝に、日ごとの勤務できる人数・夜勤ができる人数と、必要な人数との差をまとめる
- 自動夜勤の希望回数の偏りと、未回答の職員の一覧を作る
- 人主任が確認の一覧を見て職員に聞き直し、人手の足りない日の調整を始める
- 人確定した希望で、シフトを組む
各工程の詳しい説明を読む
- 主任が月初に翌月の希望表を配り、10日までに回収する。メッセージで届いた希望は印刷するか書き写す
- 1人ずつ希望表を読み、勤務表の希望の欄に転記する
- 余白の事情を読み、表の記号と合っているかを確かめる
- 法人の決まり(希望休の日数、夜勤の回数、夜勤の後の休み)に合わない希望に印を付ける
- 日ごとに、勤務できる職員の数と夜勤ができる職員の数を数える
- 食い違いのある希望や、人手の足りない日について、職員に聞き直す
- 返事を待って勤務表を直し、シフトを組み始める
(a)備考と記号が食い違う。 「14日は通院のため午前は無理」と書いて、14日に何も書いていない。「夜勤は今月は少なめに」と書いて、夜勤の希望回数の欄は空のまま。どちらに従うかを主任が推し量って転記すると、シフトが出た後で「書いたのに」と言われます。
(b)決まりに合わない希望を見落とす。 希望休を5日書いている、夜勤の翌日に別の勤務の希望を入れている。1枚ずつなら気づけますが、120枚を数日で見ると落ちます。
(c)人手の足りない日に気づくのが遅い。 日ごとに勤務できる人を数えるのは、全員分の転記が終わってからです。連休や地域の行事の日に希望休が重なっていると分かるのは、締切の数日後になります。 そこから聞き直すと、職員の側も予定を動かしにくくなっています。
(d)主任によって扱いが違う。 3施設の主任が、それぞれのやり方で確認しています。同じ法人の決まりなのに、ある施設では希望休5日が通り、別の施設では断られる、ということが起きます。
- 【人】 主任が月初に、翌月の日付を入れた希望のフォームを職員に知らせる
- 【人】 職員がスマートフォンからフォームに答える(日ごとの選択、夜勤の希望回数、備考)
- 【自動】 回答のたびに Apps Script が動き、回答を職員ごと・日ごとの表に直す
- 【自動】 法人の決まり(希望休の日数、夜勤の回数、夜勤の後の休み)との合わなさを数で確かめる
- 【自動】 備考がある回答は、選択の表と備考を Claude API に渡し、食い違いの有無を JSON で受け取る
- 【自動】 結果を確認の一覧に書き、食い違いや合わなさがあれば、職員への聞き直しの文案を付ける
- 【自動】 締切の翌朝に、日ごとの勤務できる人数・夜勤ができる人数と、必要な人数との差をまとめる
- 【自動】 夜勤の希望回数の偏りと、未回答の職員の一覧を作る
- 【人】 主任が確認の一覧を見て職員に聞き直し、人手の足りない日の調整を始める
- 【人】 確定した希望で、シフトを組む
3番目から6番目が回答のたびに動くことが、この設計の要です。 食い違いは、職員がまだ予定を覚えているうちに聞き直すのがいちばん早く片づきます。締切を待たずに、出た日のうちに主任の一覧に載ります。
5番目で AI に渡すのは、備考と選択の表だけです。 決まりとの照合(4番目)と人数の集計(7番目・8番目)はスクリプトが数で行い、AIの判定結果が人数の数え方に入り込まないようにしています。
02今回想定するシステム構成
職員のスマートフォン │ Google フォーム(日ごとの選択・夜勤の希望回数・備考) ▼【トリガー】フォームの送信(回答をスプレッドシートに記録) Google Apps Script(回答のたび) ├──▶ 職員ごと・日ごとの表に直す(同じ職員の再回答は最新を採る) ├──▶ 法人の決まりとの照合(希望休の日数・夜勤の回数・夜勤の後の休み) ▼ Claude API ── 備考と選択の表の食い違いを判定し、JSON で返す ▼ 確認の一覧(スプレッドシート)── 食い違い・合わなさ・聞き直しの文案 ▼【トリガー】締切の翌朝(時間主導型のトリガー) Google Apps Script ── 日ごとの人数と必要人数の差、夜勤の偏り、未回答 ▼ 【人】主任が聞き直し、人手の足りない日を調整し、シフトを組む
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | Claude API(Messages API、構造化出力) | OpenAI API |
| 受付 | Google フォーム(回答をスプレッドシートに記録) | - |
| 保管 | Google スプレッドシート(回答、希望の表、決まり、必要人数、確認の一覧、処理ログ) | - |
新しく足すのは、フォームと Apps Script と、いくつかのシートだけです。 勤務表とシフトの組み方は変えません。この構成は勤務表に書き込みません。 希望の表は勤務表とは別のシートに作り、主任が見ながら勤務表に写します。
決まりの表には、法人の決まりと法律の決まりを分けて持ちます。 労働基準法の第35条は、使用者は毎週少なくとも1回の休日を与えなければならず、4週間を通じ4日以上の休日を与える場合はこの限りでないと定めています。第32条の2は、労使協定か就業規則で1か月以内の一定の期間を平均して1週間あたりの労働時間が40時間を超えない定めをしたときは、特定の週・日に法定の時間を超えて働かせられると定めています。これらは組んだシフトが満たすべきもので、希望の段階で見るのは参考です。 制度の設計は人事担当と社会保険労務士が決めることで、この構成は法人が決めた数字を決まりの表から読むだけにします。
職員には18歳未満がいないことを前提にします。 夜勤を含む勤務の希望を集める題材で、介護の現場では高校生のアルバイトが早番の補助に入ることもあります。その場合はフォームの対象から外し、別に扱ってください。 18歳未満が使いうるサービスでの利用を規約で禁じている生成AIもあるため、代替候補から Gemini API を外しています。
03どうやって実装するのか
処理の起点を決める
2つのトリガーを使います。 1つは、フォームの回答がスプレッドシートに記録されたときに動くフォームの送信のトリガー、もう1つは、締切の翌朝に動く時間主導型のトリガーです。どちらもインストール型で作ります。
公式のページでは、フォームの送信のトリガーには Google フォームに付けるものと、フォームの回答を受けるスプレッドシートに付けるものの2種類があるとされています。この構成ではスプレッドシートの側に付けます。 公式のイベントの説明では、スプレッドシートの側のイベントは namedValues(質問の名前と回答の組)と values(スプレッドシートの列の順の配列)、range(記録された範囲)を持つとされており、回答の行をそのまま受け取れます。
インストール型のトリガーは、作った人のアカウントで動きます。 主任個人ではなく、法人本部のシフト受付用のアカウントでトリガーを作ります。 トリガーが失敗すると、Apps Script から失敗のまとめのメールが届きます。その宛先も同じアカウントになり、本部の人事担当が毎朝見る運用にします。
締切の翌朝のトリガーは、時刻がずれうることを前提に朝6時台に置きます。 公式のページでは、9時に設定すると9時から10時のあいだに動くとされています。主任が出勤する前に一覧ができていれば足ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| フォームの回答 | 送信の日時、回答者のアカウント、施設、日ごとの選択(休み希望・日勤のみ・夜勤できない・どれでもよい)、夜勤の希望回数、備考 | 回答のシート |
| 職員台帳 | 職員の番号、アカウント、施設、職種、夜勤の可否、雇用の形(常勤・非常勤)、月の勤務の上限日数 | 職員台帳のシート |
| 法人の決まり | 希望休の上限日数、夜勤の上限回数、夜勤の翌日・翌々日の扱い、連続の夜勤の可否 | 決まりのシート |
| 必要人数 | 施設・日ごと・勤務の種類ごとに要る人数(行事や入浴の日は多めに) | 必要人数のシート |
フォームは、回答者のアカウントを記録する設定にします。 名前を手で入れさせると、「佐藤」「佐藤 花子」「さとう」が混ざり、職員台帳と結べません。職員台帳はアカウントで引きます。
日ごとの選択は、日付を行、選択肢を列にした表の形の質問にします。 1日に1つだけ選ぶ形にしておくと、「休み希望」と「夜勤できない」を同じ日に重ねる矛盾がフォームの側で起きません。
必要人数のシートは、主任が月初に入れます。 行事の日や入浴の日は日勤を多めにするなど、施設ごとの事情はこの表に持たせ、スクリプトには書きません。
データの取得方法を決める
回答は、トリガーのイベントで1行ずつ受け取ります。ただし、受け取った値だけで判断せず、回答のシートからその職員の最新の回答を読み直します。 職員が一度出した後で出し直すことがあり、最新の回答だけを採る必要があるためです。
| 取るもの | どう取るか | 何に使うか |
|---|---|---|
| 今回の回答 | イベントの namedValues | 誰の回答かと、日ごとの選択 |
| その職員の過去の回答 | 回答のシートをアカウントで引く | 最新の回答だけを採る |
| 職員の属性 | 職員台帳をアカウントで引く | 夜勤の可否、勤務の上限日数 |
| 決まり・必要人数 | 決まりと必要人数のシート | 照合と集計 |
同時に何人も送信したときに備えて、書き込みは1人ずつにします。 公式のページでは、LockService はコードの一部への同時のアクセスを防ぐもので、getScriptLock() はどの利用者が動かしたかにかかわらず同時の実行を止めるとされています。締切の直前は送信が重なるので、希望の表と確認の一覧に書く部分をスクリプトのロックで囲みます。 ロックは waitLock か tryLock を呼んで初めて取れるとされています。
AIへ渡す前に整形する
- 回答者を結ぶ … 回答者のアカウントで職員台帳を引きます。台帳に無いアカウントは、確認の一覧に「台帳に無い」と出して止めます
- 最新の回答を採る … 同じ職員の回答が複数あれば、送信の日時がいちばん新しいものだけを使い、古いものには「差し替え済み」の印を付けます
- 日ごとの表にする … 日付ごとに「休」「日」「夜×」「可」の1文字にそろえます
- 決まりと照らす … 希望休の日数、夜勤の希望回数と上限、夜勤ができると答えた日の並び(夜勤の翌日に「日」がないか)を数で確かめます
- 職員の属性と照らす … 台帳で夜勤をしない職員が夜勤の希望回数を書いている、非常勤の職員の勤務できる日が上限を超えている、などを確かめます
- 備考を整える … 前後の空白を除き、氏名や家族の名前が書かれていれば記号に置き換えます。備考が空なら AI には渡しません
- AIに渡す表を作る … 日付と1文字の選択の並び、夜勤の希望回数、備考だけを渡します。職員の番号はその月だけの記号に置き換えます
4番目と5番目は、AI に渡しません。 「希望休が5日ある」は数えれば分かることで、判定の材料に推測が入る余地を残さないためです。
6番目は、備考に書かれやすい事情のためです。 通院、家族の介護、子どもの学校の行事など、職員の私生活に関わることが書かれます。 AIに渡すのは文面だけにし、誰の備考かは分からない形にします。
AIに処理させる
させるのは、備考の1つ1つの記述について、選択の表と合っているかを判定することです。
| 判定の種類 | 例 | 返す値 |
|---|---|---|
| 選択と食い違う | 「10日は行事で休みたい」なのに10日が「可」 | conflict |
| 選択に表れていない | 「第2週は夜勤なしで」なのに第2週に「夜×」がない | not_reflected |
| 日付が特定できない | 「月末の土日」「連休あたり」 | unclear_date |
| 条件付きの希望 | 「人が足りなければ出られます」 | conditional |
| 選択と合っている | 「14日は通院」で14日が「休」 | consistent |
| 勤務と関係のない記述 | あいさつ、お礼 | no_request |
conditional を分けているのは、主任にとって大事な情報だからです。 「足りなければ出られる」という一言は、人手の足りない日を埋めるときの最初の手がかりです。選択の表には表れないので、AIが拾わないと見落とされます。
| させないこと | 理由 |
|---|---|
| 希望を通すか断るかの判断 | 主任が職員と話して決めること |
| 決まりとの照合・人数の数え | スクリプトが数で行う |
| 事情の重さを推し量る | 「通院だから優先」のような順位を付けない |
| 健康や家庭の状態を推し量る | 備考に書かれていないことを書かない |
| 選択の表を書き換える | 食い違いは記録し、直すのは職員本人 |
4行目がいちばん大事な禁止です。 「通院」と書かれた備考から病気の種類を推し量ったり、「家族の介護」から家庭の事情を書き足したりすると、職員の私生活に関わる推測が、主任の見る一覧に残ります。
指示内容を固定する
あなたは介護施設のシフトの担当を補助する立場です。
職員が翌月の勤務の希望として出した「選択の表」と「備考」を読み、
備考に書かれた記述が選択の表と合っているかを判定してください。
【選択の表の記号】
休 … 休み希望 日 … 日勤のみ 夜× … 夜勤できない 可 … どれでもよい
夜勤の希望回数 … 数字。空欄は「指定なし」
【判定の種類】
- conflict ....... 備考の記述と、その日の選択が食い違う
- not_reflected .. 備考に希望があるのに、選択の表に表れていない
- unclear_date ... 備考の日付が特定できない(「月末」「連休あたり」など)
- conditional .... 条件付きの申し出(「足りなければ出られる」など)
- consistent ..... 備考の記述と選択が合っている
- no_request ..... 勤務の希望と関係のない記述
【厳守事項】
- 備考を記述ごとに分け、1つずつ判定してください。
- 日付は、備考に書かれた日付と、対象の年月から特定できるものだけを
dates に入れてください。曜日だけの記述は、対象の年月の暦から日付に直し、
直したことを note に書いてください。特定できなければ unclear_date です。
- 希望を通すべきか、断るべきかを書かないでください。
- 事情の重さを比べたり、優先の順位を付けたりしないでください。
- 健康状態・病名・家庭の事情を推し量って書かないでください。
備考に書かれた言葉を evidence にそのまま写すだけにしてください。
- 選択の表の値を直した案を出さないでください。
- question には、主任が職員本人に確かめるための短い質問を1文で書いてください。
事情を詳しく尋ねる質問にしないでください(「理由を教えてください」は不可)。
【対象の年月】{target_month}(暦:{calendar})
【選択の表】{choices}
【夜勤の希望回数】{night_count}
【備考】{note}
「理由を教えてください」を禁じているのは、聞き直しの文案がそのまま職員に届くためです。 確かめたいのは「10日は休みと勤務のどちらですか」であって、行事の中身ではありません。 事情を聞く文案が出ると、主任が気づかずにそのまま送ってしまいます。
曜日を日付に直すときに暦を渡しているのは、AIに暦を計算させないためです。 「第2週の土日」を正しい日付に直すには、その月の1日が何曜日かが要ります。スクリプトが対象の月の暦を作って渡し、AIはそれを引くだけにします。
出力形式を固定する
Claude API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、output_config.format に type: "json_schema" を指定し、オブジェクトには additionalProperties: false を付けることとされています。
{
"request_key": "R-1024",
"items": [
{
"kind": "conflict | not_reflected | unclear_date | conditional | consistent | no_request",
"dates": ["2026-11-10"],
"evidence": "10日は子どもの行事で休みたいです",
"note": "",
"question": "11月10日は休み希望と勤務できる日のどちらでしょうか。"
}
],
"needs_review": ""
}
1つ目の理由は、判定を日付で表に戻せることです。 dates を使って、確認の一覧の該当する日の欄に印を付けます。主任は、どの日の希望に確認が要るかを表の上で見られます。
2つ目は、evidence をスクリプトで照合できることです。 evidence が備考の中にそのまま含まれているかを確かめ、含まれていなければ AI が言い換えたか作った記述として、確認待ちにします。
| 検査 | 合わないとき |
|---|---|
evidence が備考に含まれる | 確認待ち(言い換え・作文の疑い) |
dates が対象の月の日付 | 確認待ち(日付の取り違え) |
conflict の日付の選択が本当に備考と違う | スクリプトで選択の表を見直す |
question に「理由」「事情」「なぜ」がない | 文案を出さず、主任が書く |
needs_review が空 | 確認待ち |
3つ目は、種類の値を決めておけることです。 公式のページでは、列挙型の値は大文字小文字だけ違う形で返ることがあるとされているので、比べるときは大文字小文字を区別しません。 構造化出力は数値の最小値・最大値の制約に対応していないため、夜勤の回数のような数の範囲はスクリプトの側だけで見ます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google フォーム | 回答をスプレッドシートに記録 | 職員の希望を受ける |
| 回答のシート | フォームの送信のトリガー | 回答のたびに点検を動かす |
| Claude API | UrlFetchApp.fetch | 備考の判定を受け取る |
| 希望の表・確認の一覧 | Apps Script の書き込み(ロックで囲む) | 職員ごと・日ごとの希望と確認の印 |
| 集計のシート | 締切の翌朝のトリガー | 日ごとの人数と必要人数の差、夜勤の偏り、未回答 |
API の呼び出しでは muteHttpExceptions を true にします。 公式のページでは、これを true にすると失敗の応答でも例外を投げないとされています。失敗したら備考の判定だけを「未判定」にし、決まりとの照合と希望の表への反映は先に済ませます。 AIが動かなくても、希望の受付そのものは止めません。
締切の翌朝の集計は、日ごとに次の3つを並べます。
| 列 | 中身 |
|---|---|
| 勤務できる人数 | その日に「休」でない職員の数(日勤・早番・遅番・夜勤の別) |
| 必要人数との差 | 必要人数のシートとの差。マイナスの日に色を付ける |
| 条件付きで出られる人 | 備考の判定が conditional の職員の記号 |
夜勤の偏りは、職員ごとに「夜勤ができる日の数」と「夜勤の希望回数」を並べます。 夜勤ができる職員が少ない月は、一部の職員に夜勤が集まりやすくなります。誰に何回入れるかは主任が決めますが、偏りの材料は数で出しておきます。
人が確認する
主任が確認の一覧を、回答が届いた日のうちに見ます。
- 台帳に無い・未判定を先に片づける … アカウントの取り違えや API の失敗です。多くは本部の人事担当が台帳を直せば解決します
conflictとnot_reflectedを聞き直す … 文案を使って職員に確かめます。文案に事情を尋ねる言葉がないかを読んでから送ります- 決まりとの合わなさを話す … 希望休が上限を超えている、夜勤の後の休みと合わないなど。通すか断るかは主任が決めます
- 締切の翌朝、人手の足りない日を見る …
conditionalの職員から先に相談します - 判定が違っていたら記録する … AIが
conflictとしたが実は合っていた、など。種類と一言を残します
1人4分を目安にします。 聞き直しの要らない職員は一覧で流し見て数十秒、聞き直しが要る職員は文案を確かめて送るまで数分です。4分を超える月が続くなら、フォームの質問の作りに原因があります。
職員本人が出し直せるようにしておきます。 聞き直しへの答えは、職員がフォームを出し直す形にすると、最新の回答だけを採る前処理がそのまま効きます。 主任が手で希望の表を直すと、記録と表が食い違います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 回答者が職員台帳に無い | 希望の表に入れず、「台帳に無い」と一覧に出す |
| 同じ職員が何度も出し直す | 最新だけを採り、古い回答に「差し替え済み」の印を付ける |
| 締切の後に回答が届く | 受け付けて表に入れ、一覧に「締切後」と印を付ける |
| 送信が重なって書き込みがぶつかる | スクリプトのロックで1人ずつ書く。取れなければ数秒待ってやり直す |
| 備考に氏名や病名が書かれている | 記号に置き換えて渡す。一覧にも病名を写さない |
| API が応答しない | 備考だけ「未判定」にし、照合と表への反映は済ませる |
| 未回答の職員がいる | 締切の翌朝に一覧にし、主任が声をかける |
| 1回の実行が時間切れになる | 回答のたびの処理は1人分なので収まる。締切の翌朝の集計だけを施設ごとに分ける |
最後の行は、Apps Script の上限から来ます。 公式の上限の表では、スクリプトの実行時間は1回あたり6分、トリガーで動かした合計の実行時間は個人のアカウントで1日90分、Google Workspace のアカウントで1日6時間です。回答のたびの処理は1人分で短く済みますが、締切の直前に数十人が送ると合計の時間が積み上がります。職員1人あたりの回数が多くならないよう、出し直しは聞き直しへの答えのときに限るよう伝えます。 同時の実行はユーザーごとに30までとされているので、ロックで待たせる形と合わせて収まります。
記録を残す
- 回答の日時、回答者のアカウント、採った回答と差し替えた回答
- 希望の表(職員ごと・日ごと)と、そのとき使った決まりと必要人数
- 決まりとの照合の結果
- AIに渡した選択の表と備考(置き換えた後のもの)、AIが返した JSON の全文
- 検査の結果と、確認待ちにした理由
- 主任が聞き直した日、職員の答え、判定が違っていた記録
2つ目で「そのときの決まり」を残すのは、決まりが変わるためです。 希望休の上限や夜勤の回数は、人手の状況で年に何度か見直されます。後から「なぜこの希望が断られたのか」と聞かれたとき、その月の決まりで説明できます。
ログの保存の期間と、見られる人を決めておきます。 備考には私生活の事情が含まれます。本部の人事担当と、その施設の主任だけが見られるシートに置き、 翌月のシフトが確定して一定の期間が過ぎたら、備考の本文を消します。
04実装レベルの3段階
最小構成では120人をさばけません。 書き直す手間がかかるので、確かめるための段階です。 本記事の想定は半自動化です。 1人15分が4分になるのはこの段階です。差が大きいのは、①の転記がなくなり、②③がスクリプトと AI に移るからです。聞き直しは主任が文案を確かめてから行います。 本格構成は、文案の質が数か月安定してからにします。 聞き直しが自動で職員に届くと、事情を尋ねる文面が1通でも混ざったときに、職員との信頼を損ないます。
05工数削減シミュレーション
導入後 120件 × 4分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 日勤・早番・遅番・夜勤を組み合わせて24時間を回す介護施設や病棟で、毎月、職員全員から翌月の勤務の希望を集めてからシフトを作っている事業所。希望を紙やメッセージで受けていて、シフトの作成者が転記と確認に追われている場合。Google Workspace を使っており、職員がスマートフォンからフォームに答えられる場合。
- 職員が十数人で、希望を口頭で聞けば足りる事業所。勤務表の専用の仕組みに希望の受付と点検の機能があり、職員がそれを使えている場合。希望を集めずに固定の勤務で回している場合。なお、シフトそのものを組むこと、人員配置基準を満たしているかの判断、労働時間の制度の設計はこの構成の対象外です。
07最小構成で試す方法
- 先月の紙の希望表から20人分を選ぶ(備考が書かれたもの、食い違いがあったと分かっているものを入れる)
- 1人ずつ、日ごとの記号を「休・日・夜×・可」の並びに書き直し、備考の氏名を記号に置き換える
- 手元の Claude の画面に、第7章のプロンプトと、1人ずつ選択の並びと備考を貼る
- 出てきた判定を、主任が当時聞き直した内容と突き合わせる
- 聞き直しの文案を、主任が読んで「このまま職員に送れるか」を見る
20人は備考のあるものから選んでください。 備考の無い希望表では、AIの役目そのものが試せません。
| 出てきた内容 | 判断 |
|---|---|
| 主任が聞き直した食い違いが出た | フォームとスクリプトにつなぐ段階に進む |
| 曜日の記述を違う日付に直す | 暦を渡す。構成は有効 |
| 事情を詳しく尋ねる文案を出す | 禁止の書き方を強め、検査の語を足す |
| 主任が見落としていた食い違いが出た | それがこの構成の効き目です |
4行目が出ることは珍しくありません。 当時は気づかずに転記し、シフトが出てから職員に言われていたものです。試しの段階でそれが見つかれば、主任の側も構成を受け入れやすくなります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 出し直した古い回答が残る | 最新だけを採り、古いものに印を付ける |
| 送信が重なって表が崩れる | スクリプトのロックで書き込みを1人ずつにする |
| 曜日の記述を違う日付に直す | スクリプトが暦を作って渡す |
| 聞き直しの文案が事情を尋ねる | 指示で禁じ、「理由」「事情」の語で止める |
| 備考に病名がそのまま書かれる | フォームに「理由は書かなくてよい」と添える。渡す前に置き換える |
| 名前で回答させて台帳と結べない | 回答者のアカウントを記録する設定にする |
| 決まりの数字がスクリプトに書かれている | 決まりのシートに出す。 見直しのたびにスクリプトを直さない |
| AIが希望を通す・断るを書く | 指示で禁じ、出力の項目にもその欄を作らない |
| 担当者のアカウントでトリガーを作る | 作成者のアカウントで動く。本部の受付用のアカウントで作る |
| AIが止まると受付も止まる | 判定だけを未判定にし、受付と照合は先に済ませる |
上の2行が、この構成の失敗のほとんどです。 どちらも「希望の表が職員の最新の希望と違う」状態を作り、AIの判定がどれだけ正しくても、元の表が違えば意味がありません。
4行目と5行目は、件数は少なくても重い失敗です。 介護の現場は、職員どうしの信頼で回っています。勤務の希望を出したら事情を根掘り葉掘り聞かれた、と感じさせる仕組みは、 どれだけ時間を減らしても使われなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 職員の氏名とアカウント、勤務の希望、そして備考に書かれる通院・家族の介護・子どもの行事などの私生活の事情です。
- 外部へ渡す範囲を、判定に必要なものまでに限る … Claude API に渡すのは、その月だけの記号、選択の並び、夜勤の希望回数、置き換えた後の備考だけです。氏名・アカウント・施設・職種は渡しません
- 事情を書かせない作りにする … フォームの備考の欄に「休みたい日と時間帯だけを書いてください。理由は書かなくてかまいません」と添えます。書かれない情報は、漏れようがありません
- AIに推し量らせない … 健康や家庭の状態を推し量ることを指示で禁じ、
evidenceが備考の写しであることを検査で確かめます - 聞き直しを自動で送らない … 文案は主任が読んでから使います。職員に届く言葉は人が選びます
- 見られる人を絞る … 回答のシートと確認の一覧は、本部の人事担当とその施設の主任だけが見られるようにします。他の施設の主任や職員どうしで見えないようにします
- 労働時間の判断を代替しない … 第35条や第32条の2に照らして組んだシフトが適法かは、人事担当と社会保険労務士が確かめることです。 この構成は希望の段階の点検に限ります
- API キーをスクリプトに直接書かない … スクリプトのプロパティに置き、編集できる人を本部の担当に限ります
誤りが起きた場合のリスクは、職員の希望を取り違えてシフトに入れることと、職員の私生活の事情が必要以上に扱われることの2つです。前者は最新の回答と食い違いの判定で、後者は書かせない・渡さない・推し量らせないの3つで防ぎます。
10まず何から始めるか
1週目:決まりの表と職員台帳を整える
法人の決まり(希望休の上限、夜勤の上限、夜勤の後の扱い)を1つの表にし、3施設の主任で読み合わせます。 職員台帳に Google のアカウントの列を足します。
2週目:20人で試す
先月の紙の希望表から備考のある20人分を選び、手元の Claude の画面で判定させます。聞き直しの文案に事情を尋ねる言葉がないかを最優先で見ます。
3週目:フォームを作る
翌月の日付を行にした表の形の質問と、夜勤の希望回数、備考の欄を持つフォームを作ります。1施設の職員だけで、紙と並行して出してもらいます。
4週目:回答のたびの点検をつなぐ
フォームの送信のトリガーで、希望の表への反映と決まりとの照合、備考の判定までを動かします。この月は聞き直しを主任が手で書き、文案は参考にだけ使います。
2か月目: 締切の翌朝の集計を足し、日ごとの人数と必要人数の差を出します。3施設に広げます。3か月目以降: 1人あたりの確認時間を測り、判定が違っていた記録を見て、プロンプトとフォームの質問を直します。紙の希望表を配らずに翌月のシフトが組めた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| フォームの送信のトリガーに Google フォーム用とスプレッドシート用の2種類があること。時間主導型のトリガーの時刻がずれうること(9時の設定が9〜10時)。インストール型のトリガーが作成者のアカウントで動くこと。失敗時にまとめのメールが届くこと | Google: Installable triggers | 2026-10-15 |
スプレッドシートのフォームの送信のイベントが namedValues・range・triggerUid・values を持つこと | Google: Event objects | 2026-10-15 |
LockService がコードの一部への同時のアクセスを防ぐこと。getScriptLock() が利用者にかかわらず同時の実行を止めること。ロックは tryLock/waitLock を呼んで取れること | Google: Class LockService | 2026-10-15 |
| 実行時間が1回6分、トリガーの合計実行時間が個人1日90分・Workspace 1日6時間、同時の実行がユーザーごとに30であること | Google: Quotas for Google Services | 2026-10-15 |
muteHttpExceptions を true にすると、失敗の応答でも例外を投げないこと | Google: Class UrlFetchApp | 2026-10-15 |
構造化出力を output_config.format の json_schema で指定し、additionalProperties: false が必要なこと。数値の最小値・最大値の制約に対応しないこと。列挙型の値が大文字小文字だけ違って返りうること | Claude: Structured outputs | 2026-10-15 |
| 第32条(1週40時間・1日8時間)、第32条の2(1か月以内の期間を平均して週40時間を超えない定めによる変形労働時間制)、第35条(毎週1回の休日。4週間を通じ4日以上の休日を与える場合は適用しない) | e-Gov 法令API: 労働基準法 | 2026-10-15 |
組んだシフトが労働時間や休日の決まり、人員配置基準を満たしているかは、人事担当と社会保険労務士に確かめてください。 本記事は、勤務の希望を組む前に点検する部分に絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1663)についてのご相談はこちらから。
