AIにシフト表を作らせたら楽になるのか。2026年9月20日に、8人・31日分の条件を対話型のAI(私はClaudeを使った)に渡して作らせ、返ってきた表を条件と1つずつ突き合わせた。結果は、1回目が10か所の違反、違反を伝えて直させた2回目が7か所。直った場所もあれば、直したせいで壊れた場所もあった。
渡した条件はこれだ。配布しているシフト表テンプレートのサンプルと同じ8人で、2026年10月の1か月分。
10月のシフト表を作って。区分は早・中・遅・夜。
必要人数: 平日は早1・中1・遅1・夜1、土日祝(3,4,10,11,12,17,18,24,25,31日)は早2・中1・遅1・夜1。
スタッフ(できる区分、月の上限日数、連勤の上限、固定休):
山田 早中 22日 5連勤まで
佐藤 遅中 22日 5連勤まで 水曜休み
鈴木 夜のみ 18日 4連勤まで
高橋 早中遅 20日 5連勤まで
田中 全部 22日 5連勤まで 土曜休み
伊藤 早遅 16日 4連勤まで
渡辺 夜遅 22日 6連勤まで
中村 中遅 12日 3連勤まで 日曜休み
休み希望: 山田3,4日 / 佐藤8日 / 鈴木15,16日 / 中村20,21,22日
決まっている勤務: 高橋1,2日は早 / 佐藤10日は有給
1人が1日に2つの区分に入ることはできない。日ごとに「早=誰、中=誰、遅=誰、夜=誰」の形で31日分書いて。
1回目は、規則正しく、10か所間違っていた
返ってきたのは「夜勤は鈴木と渡辺で1日おき」「早番は平日が山田、土日祝は高橋と伊藤」「中番は佐藤が月火木金、中村が水土」のような規則で埋めた表だった。規則が先にあって、表はそれを展開したものになっている。突き合わせた結果はこうだ。
| 違反の種類 | 1回目 | 2回目 |
|---|---|---|
| 必要人数の不足 | 4 | 0 |
| 1人が同じ日に2区分 | 2 | 5 |
| 休み希望の日に勤務 | 3 | 0 |
| 固定休の曜日に勤務 | 0 | 1 |
| 月の上限日数超え | 1 | 0 |
| 連勤の上限超え | 0 | 1 |
| 合計 | 10 | 7 |
不足の4か所は、日曜の中番が4回とも空いていたこと。中番の担当を「佐藤が月火木金、中村が水土」と曜日で決めたので、日曜が誰にも当たらない。規則の作り方がそのまま穴になっている。
2区分の重なりは、渡辺が10日と24日に遅番と夜勤の両方に入っていた。土曜の遅番は渡辺、偶数日の夜勤も渡辺、という2つの規則が同じ日にぶつかった。表を日ごとに読めば分かるが、AIは規則を2つ作った時点で満足している。
休み希望は、佐藤の8日、鈴木の15日、中村の21日に勤務が入っていた。3人とも依頼文に書いてある日だ。上限超えは伊藤で、16日までのところ18日。平日の遅番と土日祝の早番を両方受け持たせると、数えれば分かる。数えていない。
返ってきた表の最初の1週間は、こういう形だった。
1日(木): 早=高橋 中=佐藤 遅=田中 夜=鈴木
2日(金): 早=高橋 中=佐藤 遅=伊藤 夜=渡辺
3日(土): 早=高橋・伊藤 中=中村 遅=渡辺 夜=鈴木
4日(日): 早=高橋・伊藤 中= 遅=田中 夜=渡辺
5日(月): 早=山田 中=佐藤 遅=伊藤 夜=鈴木
6日(火): 早=山田 中=佐藤 遅=田中 夜=渡辺
7日(水): 早=山田 中=中村 遅=高橋 夜=鈴木
4日の中番は空欄のままで、注記もない。この1週間だけ見ると、1日と2日に高橋の固定勤務が入り、3日と4日の山田の休み希望も守られていて、条件を読んでいることは分かる。崩れるのは、規則が重なる日と、数えないと分からない上限のほうだ。
依頼文に「自分で数えて確認してから出して」と足す方法は、今回は試していない。数えられない仕組みに数えさせても、数えたふりの文が増えるだけだと思っているが、確かめてはいない。
2回目は10か所を直して、7か所を壊した
10か所を列挙して「直して」と頼んだ。返ってきた表は、10か所すべて直っていた。佐藤の8日は中村に、鈴木の15日は渡辺に、日曜の中番には田中が入り、伊藤の早番2日分は山田に移した。
代わりに7か所が壊れた。田中は日曜の遅番を持ったまま中番を足されたので、4つの日曜すべてで2区分。渡辺の代わりに10日の遅番に入った田中は、土曜が固定休。24日の遅番に入った高橋は、その日の早番も持っている。山田は24日と25日の早番を引き受けた結果、19日から30日まで12連勤になった。上限は5日。
直した場所の周りだけ見て、表全体を見直していない。人間が急いで直すときと同じ壊れ方だが、AIは「直しました」と言い切る。表を受け取る側が数えない限り、気づけない。
なぜ表を作る段階で崩れるのか
対話型のAIは、文章を先頭から順に書いていく。31日×8人の表を書いている間、「田中は今何日働いたか」「今日の遅番はもう埋まったか」を数え続ける仕組みを持っていない。規則を決めて、それに沿って書く。規則同士がぶつかる日や、規則の外にある例外は、書いている途中では見えない。
シフトの割当は、条件を全部同時に満たす組み合わせを探す問題で、規則を1つずつ足していく問題ではない。人間が手で組むときも、途中で数えては戻る。AIは戻らない。だから、条件が少ない表(4人・1週間、区分2つ)なら通ることもあるが、8人・31日・区分4つ・固定休と希望休あり、という現場の規模では、私が試した範囲で違反ゼロにはならなかった。
AIが役に立ったのは、表を作る前と後だった
同じやり取りの中で、助かった場面が3つある。
条件の整理。最初に私が口頭で伝えた「佐藤さんは水曜がだめで、月に22日くらいまで」のような文を、上の依頼文の形に整えてくれた。抜けていた項目(連勤の上限、有給を出勤に数えるか)を質問で返してきたのもAIだった。
割り当ての規則の提案。「上限日数に対する消化率が低い人から入れる」「同率なら日ごとに順番を回す」という規則は、AIとの会話で出てきたものだ。私はこの規則を、後述の数式版に使っている。
検算の式。AIの表をExcelに貼って、条件との突き合わせをする式は、AIに書かせて私が実際のExcelで確かめた。次の節の式がそれだ。
AIの表をExcelで検算する式
AIの表を、1行が1人、C列からAG列が1日から31日、A列が氏名の形でシートに貼る。同じ形で「希望」シートに×を入れる。次の3つの式を右端に置くと、上の表の違反がそのまま数字で出る。2026年9月20日にMicrosoft 365のExcel(バージョン16)で、1回目の表に対して確かめた。
出勤日数(有給を除く): =COUNTIF(C2:AG2,"<>")-COUNTIF(C2:AG2,"有")
休み希望との衝突の数: =SUMPRODUCT((C2:AG2<>"")*(C2:AG2<>"有")*(希望!C2:AG2="×"))
その日の不足(早の例): =MAX(0,2-COUNTIF(C$2:C$9,"早"))
出勤日数は伊藤が18、衝突は佐藤・鈴木・中村が1ずつ、中番の不足は合計4と出て、手で数えた結果と一致した。夜勤の不足が2と出たのは、渡辺の2区分重なりを1人1行の表に写すと、遅番か夜勤のどちらかが消えるからだ。重なりは表に写した時点で穴になる。
連勤は補助行を1つ足す。その人の行の下に、1日目は =IF(C2<>"",1,0)、2日目以降は =IF(D2<>"",C3+1,0) のように前日の値に1を足す式を並べ、右端で =MAX(C3:AG3) を取る。1回目の表では山田が5、伊藤が4で上限内、2回目の山田は12と出る。
この3つの式を貼るだけで、AIの表を受け取ったあとの確認は5分で終わる。私はこの確認を通らない表は使わない。
私は割当を数式で解いている
1回目と2回目を合わせて40分かかった。同じ条件を、数式だけで割り当てる版のシフト表に入れると、不足0で31日分が埋まる。日付の順に、区分の順に、その日に働ける人の中から消化率の低い人を入れる、という規則を465個のセルの式にしたものだ。AIに規則を作らせて、実行はExcelにやらせている。
数式版も万能ではない。条件が厳しすぎる月は不足が赤く出るので、上限日数か必要人数をこちらが動かす。ただ、数えるのはExcelなので、数え間違いはない。この版は自動割当つきのシフト表として有料で配布していて、無料版のシフト表に希望休と必要人数の考え方を足したものになっている。
AIに任せるのは、条件を文章から表に直すところと、検算の式を書くところ。割当そのものは、数式かソルバーにやらせる。この線引きにしてから、シフトを作る時間は月に3時間から1時間になった。



