フィットネス・健康

シフト表のテンプレート小さなジム・整体院のエクセルの作り方

小さなジム・ピラティススタジオ・整体院のシフト表を、ExcelとGoogleスプレッドシートで作る手順です。記号と時刻の設定、時間帯ごとの人数、月の時間と日数、連勤、希望休、予約表とのつなぎ方まで。

この記事の結論:小さなジムや整体院のシフト表は、ExcelかGoogleスプレッドシートに「シフト設定(記号と時刻)」と「月のシフト表(縦にスタッフ、横に日付)」を分けて作ります。マスには早・遅・休・有のような記号だけを入れ、時刻と時間はシフト設定の側に持たせます。こうすると、時間帯ごとの人数、1人ずつの出勤日数と月の時間、最少人数を下回る時間帯、連勤の日数を式で数えられます。希望休はマスに書かずに別の一覧に書いてもらい、シフトとの食い違いを式で出します。予約表と同じファイルに置けば、予約の一覧から担当のその日のシフトを読み、シフトの外に入れた予約に「シフト外」と出せます。列と式はこの記事にすべて載せました。式は計算のライブラリで動かして確かめたもので、ExcelとGoogleスプレッドシートの実物では未実行です。

この記事の内容のご相談は株式会社bundlyzeへbundlyzeのHP・LP制作について見てみる

この記事は、スタッフが2〜10人の小さなパーソナルジム・ピラティススタジオ・整体院の経営者と、シフトを組む方に向けて、紙やホワイトボードのシフト表を表計算に移す作り方を書きます。予約を受けて並べる表は予約表のテンプレートの記事に、予約システムの側でシフトから空き枠を出す考え方はシフトと予約枠の連動の記事に分けています。ここで扱うのは、月に1回組んで、毎日見るシフト表の形です。関連する記事の一覧はジム・スタジオの業種別ガイドと整体院・サロンの業種別ガイドにあります。

シフト表は、記号の表と記号の意味の2つに分ける

シフト表を表計算で作るときは、マスに入れる記号と、その記号が何時から何時かを分けて持ちます。マスに 9-15 や 14:00〜22:00 と時刻を書き込む形にすると、見た目は分かりやすいのですが、数えることができません。10時に何人いるか、月に何時間入ったかを出すには、マスの文字から時刻を読み取る必要があり、書き方が1つずれるだけで数えられなくなるからです。

シート 1行の単位 手で入れるもの 式で出すもの
シフト設定 記号1つ 記号、開始、終了、休憩、最少人数、連勤の上限、枠の長さ、最初と最後の枠 記号ごとの時間
シフト スタッフ1人の1か月 月の初日、名前、1日〜31日の記号 日付と曜日、出勤日数、時間、休と有の日数、最大の連勤、確認
人数 30分の枠1つ 見たい月の初日 時間帯ごとの人数、1日の出勤人数、最少人数を下回る枠の数
希望休 希望1件 名前、日付、希望(休か有)、受けた日 入ったシフト、確認

毎月触るのは、シフトのシートの記号と、希望休のシートです。人数のシートは、記号を入れると式で埋まり直します。

「有」は、この記事では有給休暇の日の記号として使います。休と有を分けておくと、月ごとの日数を別々に数えられます。記号の数や字は店で決めてかまいません。ただし、曜日の字(月・火・水・木・金・土・日)は、各月の2行目の曜日と紛れるので、記号にはしません。

シフト設定のシート

シフト設定のシートには、記号の意味と、表の形を決める値を入れます。セルの位置を式が指しているので、この位置のまま入れます。

列 項目 例(2行目〜)
A 記号 早、遅、通、半、休、有
B 開始 9:00、14:00、10:00、10:00、空、空
C 終了 15:00、22:00、19:00、14:00、空、空
D 休憩 0:45、1:00、1:00、空、空、空
E 時間 式
F メモ 「早番」「遅番」など、記号の読み方

記号は2行目から9行目までの8つまで入れられます。休みの記号(休、有)は、開始と終了を空にします。開始と終了が空の記号を、式は休みとして数えます。時刻は半角の 9:00 の形で入れます。日をまたぐシフト(22時から翌朝など)は、この形では扱えません。

E列には、記号ごとの時間を出す式を入れ、E9までコピーします。

E2(時間)
=IF(OR(A2="",NOT(ISNUMBER(B2)),NOT(ISNUMBER(C2))),0,ROUND((C2-B2-IF(ISNUMBER(D2),D2,0))*24,2))

開始から終了までの長さから休憩を引き、24を掛けて時間の数にします。早 なら9時から15時の6時間から45分を引いて、5.25です。休みの記号は0になります。E列の表示形式は数値にします。

H列とI列には、表の形を決める値を入れます。

セル 入れる値 例
H1、I1 最少人数、1つの枠にいてほしい最少の人数 2
H2、I2 連勤の上限、何日まで続けて出勤してよいか(これを超えると知らせる) 5
H3、I3 枠の長さ、人数を数える1マスの時間 0:30
H4、I4 最初の枠、1日の最初の枠の開始 9:00
H5、I5 最後の枠、1日の最後の枠の開始 21:30

I1とI2の数は、計算を確かめるための例です。何人いてほしいか、何日まで続けてよいかは、店で決めて入れます。

月のシフト表は、12行で1か月にする

シフトのシートは、1か月を12行の塊にして、上から月の順に積んでいきます。1行目が日付、2行目が曜日、3行目から12行目がスタッフ10人分です。次の月は13行目から始まります。

A B C D E … AG
1 2026/11/1 日付 11/1 11/2 11/3 … (空)
2 (式) 曜日 日 月 火 …
3 (式) トレーナーA 休 早 早 …
4 (式) トレーナーB 早 休 遅 …
…
13 2026/12/1 日付 12/1 12/2 12/3 … 12/31

1か月を1枚のシートにせず縦に積むのは、予約表や希望休から「その日のシフト」を探すときに、月をまたいでも同じ式で探せるようにするためです。11月の末から12月の頭に続く連勤も、この形なら数えられます。

列の割り当て

列 項目 入れ方
A 月 塊の1行目だけ、その月の1日を 2026/12/1 の形で入れる。2行目から12行目は式
B 名前 1行目は 日付、2行目は 曜日 と入れる。3行目から12行目にスタッフの名前
C〜AG 1日〜31日 スタッフの行に記号を入れる。1行目と2行目は式
AH 出勤 式。出勤した日数
AI 時間 式。月の予定の時間
AJ 休 式
AK 有 式
AL 最大の連勤 式
AM 希望休に出勤 式
AN 確認 式
AO キー 式。月と名前をつないだ文字
AP〜BT 連勤の数え 式。31列。見る必要はないので列ごと非表示にしてよい

スタッフが10人より少ない月は、余った行の名前を空にしておきます。名前が空の行は、式が何も出しません。ただし、人数のシートは名前が空の行の記号も数えるので、余った行の記号も消しておきます。

1行目と2行目、A列の式

塊の1行目のC1と、2行目のC2に次の式を入れ、AG列までコピーします。月の日数を超えた列は空欄になります。

C1(日付)
=IF(COLUMN()-3>=DAY(EOMONTH($A1,0)),"",$A1+COLUMN()-3)

C2(曜日)
=IF(C1="","",MID("月火水木金土日",WEEKDAY(C1,2),1))

WEEKDAY の種類2は、月曜日を1、日曜日を7として数えます。その数の位置の字を "月火水木金土日" から1字取り出して、曜日にしています。

A2には =A1 と入れ、A12までコピーします。どの行のA列にも、その塊の月の1日が入ります。式が「この行は何月の行か」を知るための列です。

スタッフの行の式

AH3からAO3に次の式を入れ、12行目までコピーします。

AH3(出勤)
=IF($B3="","",SUMPRODUCT(COUNTIF($C3:$AG3,'シフト設定'!$A$2:$A$9&"")*('シフト設定'!$A$2:$A$9<>"")*('シフト設定'!$E$2:$E$9>0)))

AI3(時間)
=IF($B3="","",SUMPRODUCT(COUNTIF($C3:$AG3,'シフト設定'!$A$2:$A$9&"")*('シフト設定'!$A$2:$A$9<>"")*'シフト設定'!$E$2:$E$9))

AJ3(休)
=IF($B3="","",COUNTIF($C3:$AG3,"休"))

AK3(有)
=IF($B3="","",COUNTIF($C3:$AG3,"有"))

AL3(最大の連勤)
=IF($B3="","",MAX(AP3:BT3))

AM3(希望休に出勤)
=IF($B3="","",COUNTIFS('希望休'!$A:$A,$B3,'希望休'!$B:$B,">="&$A3,'希望休'!$B:$B,"<="&EOMONTH($A3,0),'希望休'!$G:$G,"出勤になっている"))

AO3(キー)
=IF($B3="","",$A3&"_"&$B3)

AH3とAI3は、シフト設定の記号を1つずつ取り出して、その行に何回出てくるかを COUNTIF で数え、記号ごとの時間を掛けて足しています。時間が0より大きい記号だけを足したものが出勤の日数です。'シフト設定'!$A$2:$A$9&"" の &"" は、記号の欄が空の行を空の文字として扱うための書き方で、空の欄の行は <>"" の条件で0にしています。

ここで出る時間は、シフト設定に書いた予定の時間です。遅刻、早退、残業を入れた実際の時間ではありません。

AN列の確認の式は、後の節に載せます。

1か月を足すときは、12行をコピーする

翌月の分は、前の月の12行を選んで、すぐ下の行にコピーします。新しい塊の1行目のA列を翌月の1日に書き換え、スタッフの行の記号を消して入れ直します。式の参照は行に合わせてずれるので、書き換えるのはA列の1か所と記号だけです。

月は、上から古い順に積みます。連勤の式は、前の月の塊を上の行から探すからです。12行の塊を33個積んでも396行で、2年分を超えても1枚のシートに収まります。

連勤は、隠した列で1日ずつ数える

連勤は、AP列からBT列の31列で、その日までに何日続けて出勤しているかを1日ずつ数えます。AP列が1日、AQ列が2日で、BT列が31日です。AP3とAQ3に次の式を入れ、AQ3をBT3までコピーしてから、AP3からBT3を12行目までコピーします。

AP3(1日の連勤)
=IF($AO3="","",IF(C3="",0,IF(COUNTIFS('シフト設定'!$A$2:$A$9,C3,'シフト設定'!$E$2:$E$9,">0")=0,0,IFERROR(INDEX($AP$1:$BT2,MATCH((EOMONTH($A3,-2)+1)&"_"&$B3,$AO$1:$AO2,0),DAY(EOMONTH($A3,-1))),0)+1)))

AQ3(2日の連勤)
=IF($AO3="","",IF(D3="",0,IF(COUNTIFS('シフト設定'!$A$2:$A$9,D3,'シフト設定'!$E$2:$E$9,">0")=0,0,AP3+1)))

その日の記号が出勤の記号なら前の日の数に1を足し、休みの記号か空なら0に戻します。1日の列は、前の月の塊から同じ名前の行を探し、前の月の末日の数を引き継ぎます。11月26日から30日まで5日続けて出勤した人が12月1日も出勤すると、12月1日の数は6になります。前の月の塊がないときは、0から数えます。

1日の式の $AP$1:$BT2 と $AO$1:$AO2 は、自分の行より上だけを探す範囲です。範囲に自分の行を含めると、式が自分自身を参照する形になるので、上の行だけにしています。

AL列の最大の連勤は、この31列の一番大きい数です。前の月から続いた分も入ります。空のマスで数が0に戻るので、記号を入れ忘れた日があると、連勤が実際より短く出ます。後の確認の列で「未入力あり」と出ている行は、先に埋めます。

確認の列で、記号の誤りと連勤と希望休を見る

AN列には、その行で直すことを1つ出します。AN3に次の式を入れ、12行目までコピーします。

AN3(確認)
=IF($B3="","",IF(COUNTA($C3:$AG3)>SUMPRODUCT(COUNTIF($C3:$AG3,'シフト設定'!$A$2:$A$9&"")*('シフト設定'!$A$2:$A$9<>"")),"記号を確認",IF(COUNTIF($AO$1:$AO2,$AO3)>0,"名前が重複",IF(AL3>'シフト設定'!$I$2,"連勤が上限を超える",IF(AM3>0,"希望休に出勤",IF(COUNTA($C3:$AG3)<DAY(EOMONTH($A3,0)),"未入力あり",""))))))

上にあるものほど先に出ます。

表示 意味 直し方
記号を確認 シフト設定にない字が入っている(日、早 のような後ろの空白など) プルダウンから選ぶ
名前が重複 同じ月の塊に同じ名前の行が2つある 1人1行にする
連勤が上限を超える 最大の連勤が、シフト設定のI2の日数を超えている 休みの日を入れる
希望休に出勤 希望休の日に出勤の記号が入っている 本人と話して、どちらかに直す
未入力あり 月の日数より入っている記号が少ない 空のマスを埋める

「名前が重複」は、2つ目の行に出ます。予約表や希望休から探す式は、上の行を見つけた時点で止まるので、2つ目の行の記号は読まれません。同じ人の名前は、月が変わっても1字も変えずに書きます。トレーナーA と トレーナー A は別の人として扱われます。

時間帯ごとの人数と、最少人数を下回る枠

人数のシートは、縦に30分の枠、横に1日〜31日を並べ、その時間に何人いるかを出します。B1に見たい月の1日を入れると、その月の塊を読みます。

A B C D …
1 月 2026/12/1
2 12/1 12/2 12/3 …
3 火 水 木 …
4 9:00 1 0 1 …
5 9:30 1 0 1 …
6 10:00 2 1 2 …
…
32 1日の出勤人数 3 2 3 …
33 最少を下回る枠 8 16 8 …

A1に 月、A32に 1日の出勤人数、A33に 最少を下回る枠 と入れます。B2、B3、A4に次の式を入れ、B2とB3はAF列まで、A4はA31までコピーします。

B2(日付)
=IF(COLUMN()-2>=DAY(EOMONTH($B$1,0)),"",$B$1+COLUMN()-2)

B3(曜日)
=IF(B2="","",MID("月火水木金土日",WEEKDAY(B2,2),1))

A4(時刻)
=IF('シフト設定'!$I$4+(ROW()-4)*'シフト設定'!$I$3>'シフト設定'!$I$5+1/1440,"",'シフト設定'!$I$4+(ROW()-4)*'シフト設定'!$I$3)

B4、B32、B33に次の式を入れます。B4はB31までコピーし、B4からB33をAF列までコピーします。

B4(その枠の人数)
=IF(OR(B$2="",$A4=""),"",SUMPRODUCT(COUNTIFS('シフト'!$A:$A,$B$1,'シフト'!$B:$B,"<>曜日",'シフト'!C:C,'シフト設定'!$A$2:$A$9&"")*('シフト設定'!$A$2:$A$9<>"")*('シフト設定'!$B$2:$B$9<$A4+1/1440)*('シフト設定'!$C$2:$C$9>$A4+1/1440)))

B32(1日の出勤人数)
=IF(B$2="","",SUMPRODUCT(COUNTIFS('シフト'!$A:$A,$B$1,'シフト'!$B:$B,"<>曜日",'シフト'!C:C,'シフト設定'!$A$2:$A$9&"")*('シフト設定'!$A$2:$A$9<>"")*('シフト設定'!$E$2:$E$9>0)))

B33(最少を下回る枠)
=IF(B$2="","",IF(B32=0,"全員休み",SUMPRODUCT((LEN($A$4:$A$31)>0)*(B$4:B$31<'シフト設定'!$I$1))))

B4の 'シフト'!C:C は、$ を付けていない列の参照です。人数のシートのB列(1日)がシフトのシートのC列(1日)を見て、右へコピーすると1日ずつずれていきます。人数のシートの列とシフトのシートの列は、1つずれた位置で対応しています。

B4は、記号ごとに「その月の塊で、その日にその記号が入っている人の数」を数え、その記号の開始が枠より前で、終了が枠より後なら足します。予約表の記事と同じく、枠の開始ちょうどではなく1分後の時点で比べています。表計算の時刻は1日を1とした小数で持たれ、9:00 に30分を足していった値と、手で打った時刻が、目に見えない桁でずれることがあるからです。

33行目は、人数が最少人数より少ない枠の数です。定休日のように全員が休みの日は「全員休み」と出します。最初の枠を一番早く開ける曜日に合わせているので、遅く開ける曜日は、開ける前の枠も少ないと数えます。曜日で開ける時刻が違う店は、33行目の数より、色の付いたマスの位置で見ます。

人数の少ないマスに色を付ける

人数のシートのB4からAF31を選び、条件付き書式のカスタム数式を =AND(ISNUMBER(B4),B4<2) にします。2 はシフト設定のI1と同じ数を書きます。条件付き書式の式で別のシートを指す書き方は、Googleスプレッドシートでは INDIRECT が要るので、ここでは数を直接書いています。I1を変えたら、この数も変えます。

会社サイトの関連ページ予約管理システムの選び方

希望休は、別の一覧に書いてもらう

希望休は、シフトのマスに書いてもらわずに、希望休のシートに1行1件で書いてもらいます。マスに書いてもらうと、シフトを組む人が記号を入れた時点で希望が消え、誰が何日に休みたかったかが後から分からなくなるからです。

列 項目 入れ方
A 名前 シフトのシートと1字も違わない名前
B 日付 休みたい日
C 希望 休 か 有
D 受けた日 希望を書いた日、または受けた日
E メモ 半日だけ、などの補足
F 入ったシフト 式
G 確認 式

F2とG2に次の式を入れ、希望が入る見込みより多めに下へコピーします。

F2(入ったシフト)
=IF(OR(A2="",NOT(ISNUMBER(B2))),"",IFERROR(IF(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B2,-1)+1)&"_"&A2,'シフト'!$AO:$AO,0),DAY(B2))&""="","未入力",INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B2,-1)+1)&"_"&A2,'シフト'!$AO:$AO,0),DAY(B2))),"表にない"))

G2(確認)
=IF(OR(F2="",F2="表にない",F2="未入力"),"",IF(COUNTIFS('シフト設定'!$A$2:$A$9,F2,'シフト設定'!$E$2:$E$9,">0")>0,"出勤になっている",IF(AND(C2="有",F2<>"有"),"有になっていない","")))

F列は、希望の日付の月の1日と名前をつないだキーで、シフトのシートのAO列から行を探し、その日の列の記号を出します。その月の塊がまだないときや、名前が違うときは「表にない」、記号を入れる前は「未入力」です。G列は、入った記号が出勤の記号なら「出勤になっている」、有給休暇を希望したのに有でない休みなら「有になっていない」と出します。

シフトのシートのAM列は、このG列の「出勤になっている」を、名前と月で数えています。シフトを組み終えたら、AN列に「希望休に出勤」が出ていないかを見ます。

希望のある日のマスに色を付ける

シフトを組む人が、マスを埋めながら希望に気づけるように、シフトのシートのC1からAG400に条件付き書式を付けます。

条件付き書式のカスタム数式
Googleスプレッドシート =AND(COLUMN(C1)-3<DAY(EOMONTH($A1,0)),COUNTIFS(INDIRECT("'希望休'!A:A"),$B1,INDIRECT("'希望休'!B:B"),$A1+COLUMN(C1)-3)>0)
Excel =AND(COLUMN(C1)-3<DAY(EOMONTH($A1,0)),COUNTIFS('希望休'!$A:$A,$B1,'希望休'!$B:$B,$A1+COLUMN(C1)-3)>0)

$A1+COLUMN(C1)-3 は、その行の月の1日に、列の位置から日数を足して、マスの日付を出しています。前半の COLUMN(C1)-3<DAY(EOMONTH($A1,0)) は、30日までの月の31日の列のように、月の日数を超えた列を除く条件です。これがないと、11月の31日の列が12月1日の希望で色付きになります。マスに何の記号を入れても、色は希望がある限り残ります。

連勤の上限を超えた日にも色を付けるなら、同じ範囲に =AND(ISNUMBER(AP1),AP1>5) の書式を足します。5 はシフト設定のI2と同じ数を書きます。C列のマスが、同じ行のAP列(1日の連勤)を見る位置関係です。

希望を集める決まり

式は食い違いを見つけるだけなので、集め方は店で決めます。

決めること 例
締め切り 前の月の15日まで
書く人 本人が書く。書けない人はシフトを組む人が代わりに書き、D列に受けた日を入れる
1か月の上限 希望休は月に何日まで、のように決めているなら、全員に同じ数を伝える
締め切り後の希望 行を足し、E列に「締め切り後」と書く。シフトを直すかは組む人が決める
断ったとき 行は消さず、E列に理由を書く

予約表とつなぐ

予約表のテンプレートの記事の予約表を使っている店は、シフトの4枚を同じファイルに足すと、予約の一覧からシフトを読めます。予約表の記事では、休憩とシフトの外の時間を「枠止め」の行として入れていました。シフト表とつなぐと、シフトの外は式で見つけられるので、枠止めの行で入れるのは、休憩、研修、掃除のようなシフトの中の止めだけになります。

予約表のシートは「設定」「予約」「週」「月の数字」「回数券」で、シフトの側は「シフト設定」「シフト」「人数」「希望休」なので、名前はぶつかりません。予約表の設定のシートにある担当の名前は、シフトのシートの名前と1字も違わないようにします。

予約の一覧に2列を足す

予約のシートのQ列の右に、R列「その日のシフト」とS列「シフト確認」を足します。R2とS2に次の式を入れ、M列からQ列と同じ行まで下へコピーします。

R2(その日のシフト)
=IF(OR(I2="取消",I2="枠止め",NOT(ISNUMBER(B2)),E2=""),"",IFERROR(IF(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B2,-1)+1)&"_"&E2,'シフト'!$AO:$AO,0),DAY(B2))&""="","未入力",INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B2,-1)+1)&"_"&E2,'シフト'!$AO:$AO,0),DAY(B2))),"表にない"))

S2(シフト確認)
=IF(R2="","",IF(R2="表にない","シフト表にない",IF(R2="未入力","シフト未入力",IF(COUNTIF('シフト設定'!$A$2:$A$9,R2)=0,"記号を確認",IF(NOT(ISNUMBER(INDEX('シフト設定'!$B$2:$B$9,MATCH(R2,'シフト設定'!$A$2:$A$9,0)))),"休みの日",IF(OR(NOT(ISNUMBER(C2)),NOT(ISNUMBER(D2))),"",IF(OR(C2<INDEX('シフト設定'!$B$2:$B$9,MATCH(R2,'シフト設定'!$A$2:$A$9,0))-1/1440,D2>INDEX('シフト設定'!$C$2:$C$9,MATCH(R2,'シフト設定'!$A$2:$A$9,0))+1/1440),"シフト外","")))))))

R列は、予約の日付(B列)と担当(E列)から、その日の記号を出します。取消と枠止めの行は見ません。S列に出る言葉と直し方は、次のとおりです。

表示 意味 直し方
シフト表にない その月の塊がない、または担当の名前がシフトのシートにない 翌月の塊を足す。名前をそろえる
シフト未入力 その日の記号がまだ入っていない シフトを入れる
記号を確認 シフト設定にない記号が入っている シフトのマスを直す
休みの日 担当がその日は休か有 予約を別の担当か別の日に動かす
シフト外 予約の開始がシフトの開始より前か、終了がシフトの終了より後 時刻を動かすか、シフトを直す

時刻の比べ方は、ここでも1分の幅をとっています。早(9時〜15時)の日に14時から15時の予約は何も出ず、14時30分から15時30分の予約は「シフト外」になります。

予約の確認の列(M列)と同じく、S列が空でないときに色を付けます。範囲をS2からS列の下までにして、カスタム数式を =$S2<>"" にします。シフトを後から変えたときも、変えた日の予約にすぐ「シフト外」や「休みの日」が出るので、入っている予約との食い違いに気づけます。

週の表の空き枠を、シフトの中だけで数える

予約表の週のシートの27行目と28行目は、空いている枠をすべて数える式でした。シフトの外の時間を枠止めの行で入れないなら、B27とB28を次の式に替えて、シフトの時刻の中だけを数えます。V列までコピーするのは前と同じです。

B27(空き(30分))
=IF(B$1="","",IFERROR(SUMPRODUCT((LEN(B3:B26)=0)*(LEN($A3:$A26)>0)*($A3:$A26>INDEX('シフト設定'!$B$2:$B$9,MATCH(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B$1,-1)+1)&"_"&B$2,'シフト'!$AO:$AO,0),DAY(B$1)),'シフト設定'!$A$2:$A$9,0))-1/1440)*($A3:$A26<INDEX('シフト設定'!$C$2:$C$9,MATCH(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B$1,-1)+1)&"_"&B$2,'シフト'!$AO:$AO,0),DAY(B$1)),'シフト設定'!$A$2:$A$9,0))-1/1440)),"表にない"))

B28(60分を始められる)
=IF(B$1="","",IFERROR(SUMPRODUCT((LEN(B3:B25)=0)*(LEN(B4:B26)=0)*(LEN($A4:$A26)>0)*($A3:$A25>INDEX('シフト設定'!$B$2:$B$9,MATCH(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B$1,-1)+1)&"_"&B$2,'シフト'!$AO:$AO,0),DAY(B$1)),'シフト設定'!$A$2:$A$9,0))-1/1440)*($A4:$A26<INDEX('シフト設定'!$C$2:$C$9,MATCH(INDEX('シフト'!$C:$AG,MATCH((EOMONTH(B$1,-1)+1)&"_"&B$2,'シフト'!$AO:$AO,0),DAY(B$1)),'シフト設定'!$A$2:$A$9,0))-1/1440)),"表にない"))

長い式ですが、前の式に「枠の開始がシフトの開始より後」と「枠の開始がシフトの終了より前」の2つの条件を掛けただけです。休みの日は0、その月の塊がない日と、シフト設定にない記号の日は「表にない」と出ます。記号が入っていない日は、Excelでは「表にない」になる見込みですが、Googleスプレッドシートでは0になることがあります(後の「確かめていないこと」)。シフトの終わりが枠の刻みにない(13時45分など)ときは、終わりをまたぐ13時30分の枠も空きに数えるので、シフトの時刻は枠の刻みにそろえておきます。

週の表のマスそのものには、シフトの外の時間も空欄で出ます。シフトの外を表の上で色や文字で見せたい店は、シフトの外を引き続き枠止めの行で入れる形のほうが確実です。

作る手順は、6つ

作る順番は、シートを名前だけ先に作り、シフト設定、シフト、希望休、人数の順に式を入れます。予約表とつなぐ店は、最後に予約のシートのR列とS列を足します。

手順1. 店のアカウントでファイルを作り、シートを4枚作る

個人のアカウントではなく、店で持つアカウントでファイルを作ります。予約表を使っている店は、予約表のファイルにシートを足します。シートの名前は「シフト設定」「シフト」「人数」「希望休」です。1文字でも違うと式がエラーになります。

手順2. シフト設定のシートに記号と値を入れる

前の節の表のとおりに入れ、E2の式をE9までコピーします。

手順3. シフトのシートに最初の月の12行を作る

A1に月の1日、B1に 日付、B2に 曜日 を入れ、C1、C2、A2の式を入れてコピーします。3行目から12行目に名前を入れ、AH3からBT3の式を入れて12行目までコピーします。C3からAG12の範囲に、「データ」の「データの入力規則」でシフト設定のA2からA9をプルダウンにします。AP列からBT列は非表示にします。

手順4. 希望休のシートに見出しと式を入れる

1行目に7列の見出しを入れ、F2とG2の式を下へコピーします。B列とD列の表示形式は日付にします。C列は 休,有 をプルダウンにします。

手順5. 人数のシートに式を入れる

B1に月の1日を入れ、B2、B3、A4、B4、B32、B33の式を入れてコピーします。A列の表示形式は時刻、2行目は日付にします。条件付き書式もここで付けます。

手順6. 架空のシフトで試してから使い始める

前の月と今の月の2つの塊を作り、架空のシフトで次の場面を作ります。前の月の末から今の月の頭に続く連勤、希望休の日に出勤の記号、記号でない字(日 など)、空のマス、全員が休みの日、予約表とつなぐ店はシフトの外の予約と休みの日の予約。確認の列と人数のシートが意図どおりかを見ます。スタッフの本物の名前で試してもかまいませんが、確かめたら架空の記号は消します。

印刷して貼る・配る

シフト表は、印刷して休憩室に貼る、写真で送る、といった使い方が多い表です。ただし、元はファイルの中の記号です。紙に手で書き直した交代は、その日のうちにファイルへ戻します。

場面 すること
印刷する範囲 その月の12行のうち、B列からAG列(名前と31日)。必要ならAH列からAK列の出勤・時間・休・有まで
印刷する時刻 月のシフトを確定したときと、変更を入れたとき
版の分け方 紙の上に「12月分 11月20日版」のように書く
紙で交代を受けた 線で消して書き、その日のうちにファイルの記号を直す
古い紙 新しい版を貼ったら、前の版は外して処分する

印刷の設定は、次の場所にあります。

Googleスプレッドシート Excel
向き 印刷の設定の「ページの向き」で「横向き」 印刷の画面の「設定」で調整する
一部だけ印刷 範囲を選び、印刷対象を「選択中のセル」 範囲を選び、印刷の画面で選択した範囲を印刷する

31日分を横に並べるので、列の幅を記号1字が入る幅まで狭くしておくと、横向きの1枚に収まりやすくなります。人数のシートは、半月ずつ2枚に分けて印刷すると数字が読みやすくなります。

共有と、編集できる人

シフト表は、全員が見て、組む人だけが書く表です。共有の仕方は2つあります。

形 共有の権限 希望休の集め方 向く店
見るだけで共有する 組む人は編集者、ほかの人は閲覧者 本人から聞いて、組む人が希望休のシートに書く 2〜4人で、口頭やメッセージで希望を聞ける
希望休だけ書ける 全員を編集者にして、シフト設定・シフト・人数のシートを保護する 本人が希望休のシートに書く 5人以上で、希望を集める手間が大きい

Googleスプレッドシートでは、「データ」の「シートと範囲を保護」から、シートごとに編集できる人を限定できます。シフト設定・シフト・人数のシートを組む人だけにし、希望休のシートは保護しません。ヘルプには、保護はセキュリティ対策ではないことと、保護したスプレッドシートのコピーは印刷や書き出しができることが書かれています。保護は書き間違いを防ぐためのもので、見せたくない情報を隠す役には立ちません。Excelにもシートの保護がありますが、ヘルプには、シートの保護はセキュリティ機能として意図されたものではないとあります。

予約表と同じファイルに置くときは、シフトを見るために共有した人は、お客様の名前の入った予約の一覧も見られます。担当として予約を見る人だけでファイルを共有できる店は同じファイルに置き、予約を見せない人(業務委託の受付など)がいる店は、シフト表を別のファイルにします。別のファイルにすると、この記事の予約の一覧のR列・S列と週の表の式は使えないので、シフトの外は予約表の記事のとおり枠止めの行で入れます。

どちらの形でも、「リンクを知っている全員」が開ける共有にはしません。Googleのヘルプには、その設定ではログインしていない人も開けるとあります。Excelのパソコンのアプリで複数の人が同時に書くには、ヘルプでは Microsoft 365 のサブスクリプションと、OneDrive か SharePoint への保存が必要とされています。

動かして確かめた結果

この記事の式は、2026年11月8日に、Node.js 24.22.1 の上で HyperFormula 3.5.0 を使って計算しました。HyperFormula は表計算の関数を計算するライブラリで、ExcelやGoogleスプレッドシートそのものではありません。日付は 2026/12/1、時刻は 9:00 のように、人が打つのと同じ文字で入れ、ライブラリに日付と時刻として読ませました。式を下や横へコピーした形は、プログラムで参照をずらして作りました。予約表の側の式(週の表のB3、予約のシートのP列とQ列など)は、予約表の記事の式をそのまま使いました。

本文の例のデータ

本文の例は、2026年11月と12月の塊、スタッフ4人(トレーナーA・B・C、受付D)の架空のシフトで動かしました。12月の塊の集計は次のとおりです。

名前 出勤 時間 休 有 最大の連勤 希望休に出勤 確認
トレーナーA 21 135.25 10 0 9 0 連勤が上限を超える
トレーナーB 22 139.5 9 0 3 1 希望休に出勤
トレーナーC 21 139.75 8 1 5 0 未入力あり
受付D 21 168 9 0 3 1 記号を確認

トレーナーAは、11月23日から30日まで8日続けて出勤し、12月1日も出勤した例で、12月1日の連勤が9になりました。12月の中だけなら上限を超えていませんが、前の月から引き継いで「連勤が上限を超える」と出ています。受付Dは、12月7日に 日 と打った例で、12月31日の有の希望に 通 を入れた食い違いもありますが、確認の列には上にある「記号を確認」が先に出ました。

人数のシートの12月1日(火)は、早のA、遅のB、通のCの3人で、9時台が1人、10時から13時30分が2人、14時台が3人、15時から18時30分が2人、19時から21時30分が1人でした。最少人数2で、最少を下回る枠は9時台の2つと19時以降の6つの8です。

予約のシートに足した2列は、次のとおりに出ました。

予約 その日のシフト シフト確認
12/1 10:00〜11:00 トレーナーA 早 (空)
12/1 14:30〜15:30 トレーナーA 早 シフト外
12/2 11:00〜12:00 トレーナーB 休 休みの日
12/3 11:00〜12:00 トレーナーC 遅 シフト外
12/3 12:00〜13:00 トレーナーC(枠止め) (空) (空)
12/4 18:00〜19:00 トレーナーA(取消) (空) (空)
12/4 20:00〜21:00 トレーナーE 表にない シフト表にない
11/30 19:00〜20:00 トレーナーC(来院) 遅 (空)

11月30日の行は、11月の塊から読めています。週の表の空き枠の数は、12月1日のトレーナーAが、10時から15時の10枠から、10時〜11時の2枠と14時30分の1枠を引いた7、シフトのない12月2日のトレーナーBが0でした。希望休のシートでは、12月5日に早が入ったトレーナーBの行と、12月31日に通が入った受付Dの行に「出勤になっている」、2027年2月の行に「表にない」が出ました。

乱数の架空データとの比べ合わせ

次に、乱数で架空のシフトを作り、式の結果を、式を使わずにPythonで別に書いた計算と比べました。2026年11月から2027年1月の3か月の塊、月ごとに2〜10人、希望休を20〜60行、予約を40〜120行です。半分の組では、マスの3%ほどに 日、X、後ろに空白の付いた 早 、5%ほどに空のマスを混ぜ、ときどき同じ月に同じ名前の行を2つ作り、月によってスタッフの並び順を変えました。

データ 組 比べたセル 不一致
乱数の架空データ 40 53,315 0

比べたのは、シフトのシートのAH列からAN列、人数のシートの4行目から33行目、希望休のシートのF列とG列、予約のシートのR列とS列、週のシートの27行目と28行目です。数の答えだけでなく、確認の列のどの言葉が出るかも比べました。条件付き書式の式は、セルに入れた式として、本文の例の5つのマスで希望の有無を、1つのマスで連勤の数を確かめました。希望のマスの式の、月の日数を超えた列を除く条件は、公開前の照合で足したもので、別に書いた計算で確かめました。

HyperFormula の、とても近い2つの数を同じと見なす設定を切った状態でも、40組の不一致は0でした。1分の幅をとって比べているので、時刻の小数の目に見えない差の影響を受けていません。

式の形を変えた所

ライブラリで動かす中で、最初に書いた式が動かず、形を変えた所があります。

最初の形 ライブラリで起きたこと この記事の形
COUNTIF($C3:$AG3,'シフト設定'!$A$2:$A$9) 記号の欄が空の行で、条件の誤りのエラー &"" を付けて、空の欄は <>"" の条件で0にする
INDEX('シフト'!$C:$AG,0,DAY(B$2)) で日の列を取り出す 行番号0に対応しておらずエラー 人数のシートの列と、シフトのシートの列をずらして対応させる
キーを縦棒の記号でつなぐ COUNTIF の条件に縦棒が入ると、同じ文字でも数えなかった _ でつなぐ
VLOOKUP(…,FALSE) FALSE を関数としてでなく名前として読み、エラー INDEX と MATCH で引く

どの形も、ExcelやGoogleスプレッドシートで動かないと確かめたものではありません。ライブラリと実物の両方で同じに動く見込みが高い形に寄せています。

確かめていないこと

ExcelとGoogleスプレッドシートの実物では、どの式も動かしていません。特に次の点は、実物で違うことがあります。

  • SUMPRODUCT の中で、COUNTIF や COUNTIFS の条件に記号の範囲をそのまま渡す書き方。ライブラリでは記号ごとの数が並んで計算されましたが、ヘルプにこの使い方の例はありません
  • Googleスプレッドシートの条件付き書式で INDIRECT を使う式。ライブラリに INDIRECT がないため、INDIRECT を使わない形だけを確かめました
  • Excelの条件付き書式で、別のシートを直接指す式が使えるか。ヘルプでは確かめていません
  • 週の表のB27・B28で、記号が空の日の扱い。Excelでは「表にない」になる見込みですが、Googleスプレッドシートでは、シフト設定の空の行に一致して0になることがあります
  • 9:00 や全角の 9:00 のような入力が、時刻になるか文字のままか。アプリや設定で違うことがあるので、半角にそろえます
  • 予約が120行、シフトが3か月分のとき、ライブラリでは1組の計算が0.2秒ほどでした。何年分も積んだときの実物での速さは測っていません

プルダウン、条件付き書式、印刷の設定、シートの保護、共有の設定、複数の人の同時の書き込みも試しておらず、手順はヘルプによるものです。名前とシフトはすべて架空です。使う前に、手順6のとおり架空のシフトで確かめてください。

会社サイトの関連ページパーソナルジムのWeb集客と予約の仕組み

ExcelとGoogleスプレッドシートで詰まる所

シフト表はどちらでも同じ形で作れます。違いが出るのは、条件付き書式の書き方、同時の書き込み、保護の仕方です。

詰まる所 Googleスプレッドシート Excel
使っている関数 そのまま使える この記事の式は、MINIFS のような新しい関数を使っていない。予約表とつなぐときは、予約表の記事のとおり Excel 2019 以降
条件付き書式で別のシートを指す INDIRECT で書く シート名をそのまま書く形を本文に載せた(実物では未確認)
複数の人が同時に書く 共有した人どうしで書ける Microsoft 365 で、OneDrive か SharePoint に保存して共同編集する
編集できる人を絞る 「シートと範囲を保護」 「校閲」タブの「シートの保護」
時刻の入れ方 半角の 9:00 半角の 9:00
ファイルの置き場 店のアカウントのドライブ 1か所に置き、メールやUSBメモリで回さない

やってはいけないこと

シフト表で、後から直すのに手間がかかる失敗です。

ポイント1. マスに時刻を直接書く

10-16 や 早(10時) のように書くと、人数も時間も数えられません。マスには記号だけを入れ、違う時刻のシフトが要るなら、シフト設定に記号を1つ足します。

ポイント2. 月ごとに名前の書き方を変える

トレーナーA と A は別の人として扱われ、連勤も予約表とのつなぎも途切れます。名前は最初に決めた書き方のまま使います。

ポイント3. 希望休をマスに書いてもらう

シフトを入れた時点で希望が消えます。希望休のシートに書いてもらいます。

ポイント4. 前の月の塊を消す

連勤の引き継ぎと、過ぎた予約のシフトの確認ができなくなります。古い月は消さずに残し、見づらければ行をグループにして畳みます。

ポイント5. 店の中に2つのシフト表を作る

組む人の手元のファイルと、共有したファイルが別々に直されると、どちらが正しいかが分からなくなります。ファイルは店に1つにします。

シフト管理のツールや予約システムへ移る線

シフト表から、シフト管理のツールや、シフトと予約をつないだ予約システムへ移る線は、人数より、手で埋めている作業で決めます。10人までなら、この記事の形で表として足ります。先に来るのは次のことです。

起きていること 表で足りない理由 移る先
希望休の集めと反映に毎月何時間もかかる 表は希望を集めて締め切る仕組みを持たない スタッフが自分のスマートフォンから希望を出せるシフト管理のツール
シフトの変更を全員に知らせるのに毎回連絡が要る 表は変わったことを知らせない 変更が本人に届くツール
打刻の記録とシフトを毎月照らし合わせている 表の時間は予定で、実際の時間を持たない 打刻とシフトを同じ所で持つ勤怠のツール
シフトが変わるたびに、予約の受付時間を手で直している 表は予約の入口とつながっていない シフトから空き枠を出す予約システム
2店舗目を出す、掛け持ちのスタッフがいる 店をまたぐと、12行の塊が店ごとに分かれる 店舗とスタッフを分けて持つツール

予約システムの側でシフトから空き枠を出す考え方は、シフトと予約枠の連動の記事に書きました。専用の予約システムを比べる段階なら、ジム・スタジオの予約システムの選び方と整体院の予約システムの選び方に、業態ごとに要る機能を書いています。Excelやスプレッドシートの管理が限界に近いときの全体の見方は、会社のExcelの業務管理が限界になったときのサインのコラムにあります。

移るときも、シフト表は無駄になりません。月、名前、日ごとの記号、記号ごとの時刻がそろっていれば、そのまま移す材料になります。列の対応や照合の進め方はExcelから業務システムへのデータ移行の記事にまとめています。

使い始める前のチェックリスト

シフト表を本番で使う前に、次の項目を確かめます。

  • ファイルのオーナーが店のアカウントで、共有は必要な人だけに絞っている
  • 4枚のシートを、名前のとおりに作った
  • シフト設定の記号に、開始・終了・休憩を入れ、休みの記号は開始と終了を空にした
  • 記号に曜日の字を使っていない
  • 最少人数と連勤の上限を店で決めて入れた
  • 月の塊を、上から古い順に積んでいる
  • 名前の書き方を決め、予約表の担当の名前とそろえた
  • 記号のマスにプルダウンを付けた
  • 希望休の締め切りと、書く人を決めた
  • 確認の列、希望のある日、人数の少ないマスに色が付く
  • 予約表とつなぐなら、予約の一覧にR列とS列を足し、シフトの外の枠止めの行をやめるか決めた
  • 架空のシフトで、連勤の引き継ぎ、確認の列、人数のシートを確かめた

労働時間や休日の決まりは、社会保険労務士などの専門家に確かめてください。

自社でやる場合と、任せる場合

自社でやる場合は、この記事の列と式で形にできます。続けるのに要るのは、毎月の決まった日に希望休を締め切って組む人と、交代が出たらその日のうちにファイルの記号を直す決まりです。2〜3人の店では、組む人がほかの業務の合間に組むことになるので、組む日を決めておきます。最少人数を何人にするか、連勤を何日までにするかは、任せる場合でも店でしか決められません。

任せる場合、株式会社bundlyzeは、Web・システムのことは何でも対応できます。シフトと予約の持ち方の整理から、既製のシフト管理や予約サービスの設定、ホームページへの組み込み、シフトと予約をつなぐシステムの開発まで受け持ちます。ジム・スタジオ・整体院の相談はフィットネス・健康業界向けのご案内から受け付けています。

出典(一次情報)

ExcelとGoogleスプレッドシートの機能についての説明は、次の公式の資料に基づいています。確認日はどれも2026年11月8日です。ヘルプは更新されることがあるので、作業の前に最新のものを確かめてください。

記号と時刻を分ける形、12行で1か月にして縦に積む形、列の項目、連勤の数え方、確認の列の言葉、希望休を別の一覧にする形、予約の一覧に足す2列、1分の幅で比べる書き方、共有の2つの形、移る線の表、チェックリストは、この記事で決めた進め方で、上の資料が示した手順ではありません。動かした結果は架空のデータによるもので、実際の店のシフトや数字ではありません。

よくある質問

シフト表のテンプレートは、何から作ればよいですか?

「シフト設定」「シフト」「人数」「希望休」の4枚のシートを作るところから始めます。シフト設定には、早・遅・休・有のような記号と、それぞれの開始と終了の時刻を書きます。シフトのシートは、縦にスタッフ、横に1日〜31日を並べた表で、マスには記号だけを入れます。時刻を記号の側に持たせておくと、時間帯ごとの人数や月の時間を式で数えられます。

希望休は、シフト表にどう書いてもらえばよいですか?

シフト表のマスに直接書いてもらわず、「希望休」のシートに1行1件で書いてもらいます。シフトを組む人がマスに別の記号を入れても、希望の行は残ります。希望休のシートには、その日に入ったシフトを式で出し、出勤の記号になっていれば「出勤になっている」と出します。シフト表の側では、希望のある日のマスに色を付けます。

月の勤務時間と出勤日数は、どう数えますか?

シフト設定のシートで、記号ごとに開始、終了、休憩から時間を出しておき、シフトの行で記号の数とその時間を掛けて足します。時間が0より大きい記号の日を出勤日数として数えます。ここで出るのはシフトの予定の時間で、打刻した実際の時間ではありません。

シフト表と予約表は、どうつなぎますか?

同じファイルの中に置き、予約の一覧に「その日のシフト」と「シフト確認」の2列を足します。予約の日付と担当から、その日の記号をシフト表で探し、休みの日なら「休みの日」、シフトの時刻の外なら「シフト外」と出します。週の予約表の空き枠の数も、シフトの時刻の中だけを数える式に替えられます。休憩などシフトの中の止めは、これまでどおり枠止めの行で入れます。

シフト表からシフト管理のツールや予約システムに移るのは、どの時点ですか?

人数より、手で埋めている作業で決めます。希望休の集めと反映に毎月何時間もかかる、シフトの変更を全員に知らせるのに毎回連絡が要る、打刻の記録と照らし合わせる作業が続く、シフトが変わるたびに予約の受付時間を手で直している、のどれかが毎月起きるなら移る時期です。

この記事の書き方と確認の方針