月次シフト管理をLINEで完全自動化【旅館業・完全ガイド】
希望収集から確定通知・欠員対応・月次集計まで一本化する方法
STEP1〜5の全体像+スタッフ向け提出手順+Googleスプレッドシート設定まで、この1記事で完結
目次
月次シフト管理フロー全体像
Lメッセージを使った月次シフト管理は以下5ステップで毎月自動で回ります。担当者が手動で動くのは「シフト表の確定」だけです。
この記事の読み方
まずSTEP1〜5の流れをつかみたい方は各STEPの冒頭(LINE画面イラスト)だけを追ってください。実際に作りたい方は、各STEPの「スプレッドシート連携の設定手順」や「Lメッセージ設定のポイント」まで読み進めると、そのまま構築できます。
シフト希望の収集
毎月15日頃、全スタッフのLINEに希望収集メッセージが自動で届きます。スタッフはボタンをタップするだけで希望シフトを提出でき、締切前には未回答者だけに自動催促が届きます。紙・メール・電話での個別確認が完全に不要になります。
- 紙・メール・電話での個別確認が完全に不要になる
- 未回答者だけを自動検出して締切前リマインドを配信
- 回答データはGoogleスプレッドシートに自動記録
希望収集メッセージ → スタッフの回答 → 受付完了の流れ
毎月15日にLメッセージが全スタッフのLINEへ自動配信します。スタッフは4週分の早番・遅番ボタンをタップするだけで希望提出が完了します。締切前には未回答者だけに自動催促が届き、提出漏れをゼロにします。
毎月15日に自動配信される希望収集メッセージ。4週分の早番・遅番ボタンをタップするだけで希望提出完了。受付完了メッセージも自動で届きます
締切3日前:未回答スタッフへの自動催促
締切の3日前になっても希望を提出していないスタッフだけに、自動催促メッセージが届きます。すでに回答済みのスタッフには届きません。Lメッセージがタグで自動判別して配信するため、担当者が一人ひとり確認する必要はありません。
締切3日前になっても未回答のスタッフだけに自動催促が届きます。回答済みのスタッフには届きません。ボタンも再掲され、そのままタップして提出できます
実際のスマホ画面でわかる!月次スケジュールの流れ
「15日・17日・20日に何が起きるの?」をスマホ画面で確認しましょう。担当者がすることは何もありません。スマホを見ているだけで毎月自動で回ります。
🟦 15日:LINEが自動で「来月のシフト希望を教えてください」と全員に送る
🟧 17日:まだ返事していない人だけに「締切3日前ですよ」と自動でリマインド
🟥 20日:締切。担当者がスプレッドシートを見てシフトを組む
毎月15日の自動配信から20日の締切まで、希望収集・催促・記録がすべて自動で進みます。担当者は最後にシフト表を確定するだけです
🎉 担当者がすることは「シフトを組むだけ」
| 日付 | LINEで自動で起きること | 担当者の作業 |
|---|---|---|
| 15日 | 全スタッフに希望収集メッセージを自動配信 | なし ✅ |
| 17日 | 未回答の人だけに自動催促を配信 | なし ✅ |
| 20日 | 締切。全員の希望がスプレッドシートに自動で揃う | シフト表を組む 📋 |
スタッフ向け:シフト希望の送り方
スタッフの提出方法は、旅館の運用に合わせて2方式から選べます。シフトが「早番・遅番の2択」で足りる旅館は方式A、時間を細かく決めたい旅館は方式Bがおすすめです。
方式A:早番・遅番の2択で選ぶ
カレンダーで出勤できる日を選び、日ごとに「🌅 早番」か「🌇 遅番」をタップ。両方タップ=「どちらでも入れます」。ボタン操作だけで完結し、スマホが苦手な方でも迷いません。
方式B:希望時間を入力する
カレンダーで出勤できる日を選び、日ごとに「9時〜15時」「終日OK」「13時以降ならOK」など希望時間を自由に入力。時間の融通が利く旅館向けで、細かい希望まで拾えます。
Q. カレンダーで間違った日を選んでしまいました
選んだ日をもう一度タップすると青が消えて選択解除できます。「次へ」をタップする前なら何度でもやり直せます。
Q. 日によって希望が違っても大丈夫ですか?
はい。日ごとに入力欄が分かれているので、1日は「早番」、4日は「遅番」というように別々に選べます。
Q. 送信したあとで内容を変更したくなりました
このLINEのトークに「11月4日の希望を早番に変更してください」とメッセージを送ってください。担当者が修正します。
Q. 締切(20日)を過ぎてしまいました
締切を過ぎるとフォームが使えなくなります。このLINEのトークに「11月○日 早番希望です」と直接メッセージを送ってください。締切3日前(17日頃)にリマインドも届きます。
スプレッドシート連携の設定手順(希望収集)
スタッフがLINEのボタンをタップした瞬間、Googleスプレッドシートに「誰が・いつ・どの週に・何を希望したか」が自動で書き込まれます。担当者はスプレッドシートを「見るだけ」でシフトが組めるようになります。所要時間は約20〜30分。一度設定すれば毎月自動で記録され続けます。
- ブラウザで sheets.google.com を開き「+ 新規作成」をクリックします。
- 左上の「無題のスプレッドシート」をクリックし、ファイル名を 「KSR旅館 月次シフト管理」 に変更します。
- 画面下の左端にあるシートタブ名(初期は「シート1」)をダブルクリックし、「希望収集」に変更します。※STEP5の集計関数がこのタブ名を参照します。
- 1行目のA1セルをクリックし、以下の7項目を入力します(入力→Tabキーで隣のセルへ移動、を繰り返す)。
| 列 | 見出し | 入る内容(2行目以降は自動) |
|---|---|---|
| A | 提出日時 | ボタンをタップした日時 |
| B | LINE名 | スタッフのLINE登録名 |
| C | スタッフ名 | フォームで入力された本名 |
| D | 第1週希望 | 第1週(1〜7日)の早番・遅番希望 |
| E | 第2週希望 | 第2週(8〜14日)の早番・遅番希望 |
| F | 第3週希望 | 第3週(15〜21日)の早番・遅番希望 |
| G | 第4週希望 | 第4週(22〜30日)の早番・遅番希望 |
※ 手入力するのは1行目の見出しだけ。2行目以降はスタッフがタップするたびに自動で追加されます。1行目を選択して背景を緑にすると見やすくなります(任意)。Googleスプレッドシートは自動保存なので保存ボタンは不要です。
- Lメッセージ管理画面の左メニュー「設定(⚙)」→「外部連携」をクリックします。
- 「Googleスプレッドシート」を選択します。
- 「Googleアカウントで連携する」ボタンをクリックし、シフト管理用のGmailでログインします。
- 「許可する」をクリックして完了です。
※ この「許可する」は、Lメッセージがスプレッドシートに書き込む権限を与える操作です。個人情報が外部に漏れるわけではありません。連携はLメッセージ全体で1回だけ行えば、STEP1〜5すべてで共通して使えます。
- Lメッセージ管理画面 →「シナリオ」→ 希望収集シナリオを開きます。
- 「第1週・早番ボタン」のアクション設定を開き、「スプレッドシートに書き込む」を追加して対象シート:KSR旅館 月次シフト管理/書き込む列:D列/内容:早番 希望を設定します。
- 同様に残り7ボタンを設定します(下表)。A列・B列(提出日時・LINE名)はLメッセージが自動記録するので設定不要です。
- 「保存する」をクリックして完了です。
| LINEのボタン | 書き込む列 | 書き込む内容 |
|---|---|---|
| 🌅 早番(第1週) | D列 | 早番 希望 |
| 🌇 遅番(第1週) | D列 | 遅番 希望 |
| 🌅 早番(第2週) | E列 | 早番 希望 |
| 🌇 遅番(第2週) | E列 | 遅番 希望 |
| 🌅 早番(第3週) | F列 | 早番 希望 |
| 🌇 遅番(第3週) | F列 | 遅番 希望 |
| 🌅 早番(第4週) | G列 | 早番 希望 |
| 🌇 遅番(第4週) | G列 | 遅番 希望 |
- 自分のスマホでKSR旅館のシフト管理LINEを開き「🌅 早番 希望(第1週)」をタップします。
- スプレッドシートをPCで開き、D列に「早番 希望」が自動で入っているか確認します(反映に1〜2分かかる場合あり)。
- 「🌇 遅番 希望(第2週)」もタップし、E列に「遅番 希望」が入るか確認します。
- 両方確認できたら設定完了です。テストで入れたダミー行は削除しておきましょう。
| 提出日時 | LINE名 | スタッフ名 | 第1週 | 第2週 | 第3週 | 第4週 | 提出状況 |
|---|---|---|---|---|---|---|---|
| 10/15 07:42 | 田中さくら | 田中 さくら | 🌅 早番 | — | 🌇 遅番 | — | ✅ 提出済み |
| 10/15 09:15 | 鈴木太郎 | 鈴木 太郎 | — | 🌇 遅番 | 🌇 遅番 | 🌅 早番 | ✅ 提出済み |
| 10/15 19:32 | 佐藤さくら | 佐藤 さくら | 🌅 早番 | 🌅 早番 | — | 🌇 遅番 | ✅ 提出済み |
| 10/17 21:14 | 山田けんじ | 山田 けんじ | 🌅 早番 | — | — | — | ⚡ 催促後提出 |
| (未提出) | 中村はな | 中村 はな | — | — | — | — | ⚠ 未提出 |
STEP1 Lメッセージ設定のポイント
・毎月15日の自動配信 → Lメッセージの「定期配信」機能で日付・時刻を指定
・週別ボタンは「第1週早番」「第1週遅番」…と計8ボタンを設定
・ボタンタップ時のアクションに「提出済みタグを付与」を設定
・締切3日前の催促は「未提出タグを持つスタッフへのセグメント配信」で設定
・回答データはGoogleスプレッドシートの外部連携で自動記録
シフト確定・通知
担当者がシフト表を確定したら、Lメッセージのセグメント配信で各スタッフに個人名入りの確定シフトを送付します。今まで一人ひとりに電話・個別LINEでシフトを伝えていた作業が、ボタン1回で全スタッフに自動配信されます。スタッフは「確認しました」ボタンをタップするだけで既読管理が完了します。
個人名・週別日付・時間帯・合計日数入りの確定シフトカードが自動送付されます。「確認しました」ボタンのタップが既読管理の証拠になります
担当者がすることは3つだけ
STEP1で集まった希望をもとに、スプレッドシートで来月のシフト表を組みます。ここに入力した内容がそのまま各スタッフへのLINEに反映されます。
「配信管理」→「確定シフト通知テンプレート」を選んで「配信する」を押すだけ。個人名・日付・時間帯はスプレッドシートから自動で差し込まれるので、担当者が個別に打ち込む必要はありません。
配信した瞬間、全スタッフのスマホに確定シフトが届きます。スタッフが「確認しました」をタップすると、別タブ「確認管理」のC列に「確認済み」と自動記録されます(このタブ名もSTEP5の集計関数が参照します)。担当者は後で一覧を確認するだけです。
| スタッフ名 | 配信日時(自動) | 確認ボタンの状況 | 担当者がすること |
|---|---|---|---|
| 田中 さくら | 10/23 20:00 配信 | ✅ 確認済み(20:07) | 何もしなくてOK |
| 鈴木 太郎 | 10/23 20:00 配信 | ✅ 確認済み(21:44) | 何もしなくてOK |
| 山田 けんじ | 10/23 20:00 配信 | ⏳ まだ未確認 | → LINEで一言フォロー |
| 佐藤 さくら | 10/23 20:00 配信 | ✅ 確認済み(22:33) | 何もしなくてOK |
緑(確認済み)は放置でOK。赤(未確認)の人だけLINEで一言送ればOKです。「変更希望・相談がある」ボタンが押された場合は担当者のスマホに自動アラートが届き、LINEチャットで直接やり取りして解決できます(電話不要)。
Q. 全員に同じメッセージではなく、本当に個人別に届きますか?
はい。田中さくらさんには「田中さくらさんのシフト」、鈴木太郎さんには「鈴木太郎さんのシフト」が届きます。他のスタッフの情報は届かないのでプライバシーも守られます。
Q. スタッフが「確認しました」を押し忘れたら?
スプレッドシートの確認状況が「⏳ 未確認」のままになります。担当者が未確認のスタッフへ「シフト確認しましたか?」と一言送ってフォローします。
出勤リマインド
確定シフトをもとに、出勤前日の18時と当日朝の7時に自動でリマインドが届きます。スタッフの出勤忘れ・無断欠勤を防ぎます。担当者は最初に一度だけ設定すれば、あとは毎月・毎日自動で送られ続けます。
(左)前日18時:集合場所・時間帯入りのリマインドが届き、「出勤を確認」ボタンで応答。(右)当日朝7時:「おはようございます」の一言+チェックイン機能で出勤確認が自動記録されます
前日リマインドと当日リマインドの違い
| 比較項目 | ⏰ 前日リマインド(18:00) | ☀️ 当日リマインド(7:00) |
|---|---|---|
| 配信タイミング | 出勤前日の夜18:00 | 出勤当日の朝7:00 |
| 目的 | 出勤忘れを前もって防ぐ | 時間・場所の再確認・遅刻防止 |
| 返答ボタン | ✅ 明日の出勤を確認しました/😢 急遽出勤できなくなりました | ✅ 今日の出勤 準備OK!/😢 本日出勤できなくなりました |
| 欠勤ボタン時 | 担当者に緊急アラート(前日なので調整の時間がある) | 担当者に緊急アラート(当日なので即欠員募集へ) |
どちらも担当者の操作ゼロで自動配信されます。前日リマインドは「明日出勤する人だけ」に届き、休みのスタッフには届きません(シフト表から自動判別)。時刻(18時・7時)はLメッセージのシナリオ設定で旅館の営業時間に合わせて変更できます。
「出勤できなくなりました」ボタンが押されたとき
スプレッドシート連携の設定手順(出勤管理)
3種類のボタン(前日確認・当日チェックイン・欠勤報告)がタップされるたびに、対応する列に自動記録されます。STEP2とは目的が異なるため、同じスプレッドシートファイル内に別タブ「出勤管理」を作るのがおすすめです。
別タブ「出勤管理」を作り、1行目にA〜H列の見出しを入力します。
| 列 | 見出し | 記録内容 |
|---|---|---|
| A・B | スタッフ名/出勤日 | 自動入力 |
| C・D | 前日確認状況/前日確認日時 | 前日ボタン |
| E・F | 当日チェックイン/チェックイン日時 | 当日ボタン |
| G・H | 欠勤報告/欠勤報告日時 | 欠勤ボタン |
連携はLメッセージ全体で1回だけ。STEP1で「連携済み」と表示されていれば操作不要です。
- 前日確認ボタン:C列に「前日確認済み」/D列にタップ日時(自動)の2アクションを追加。
- 当日チェックインボタン:E列に「チェックイン済み」/F列にタップ日時(自動)の2アクションを追加。
- 欠勤ボタン(前日・当日の両シナリオ):G列に「欠勤(前日/当日報告)」/H列にタップ日時(自動)に加えて、「担当者に通知する」アクションを必ず追加します。これを忘れると欠勤に気づけません。
欠員・交代募集
スタッフが急病などで当日欠勤になった場合、担当者がLメッセージから「欠員募集」を1回送るだけで全スタッフに一斉配信されます。スタッフは「入れます!」ボタンに加えて、入れる時間帯を時間単位で指定して回答することもできます。電話で一人ひとり確認する手間が不要になり、今まで30分以上かかっていた作業が5〜10分で解決します。
緊急欠員募集→手挙げ→担当者自動アラートの一連の流れ。時間帯選択(早番のみ/遅番も可)や「時間を指定して入れます」で細かい希望まで把握でき、電話での個別確認が不要になります
スタッフの回答パターンは3種類
パターンA:時間帯ボタンで選ぶ
「🙋 今日入れます!」に加えて「🌅 早番のみ」「🌇 遅番も可」をタップ。ボタン操作だけで完結し、スマホが苦手な方でも簡単。
パターンB:時間を指定して入れます
「9:00〜13:00」など開始・終了時間を入力。「募集の全時間は無理だけど一部なら入れる」という柔軟な回答ができる。
パターンC:今日は難しいです
担当者への通知なしで完結。断りやすい環境をつくることで、回答率そのものを上げる。
パターンBの最大のメリット
今まで「全部は無理だから断った」スタッフが手を挙げやすくなる。完全に埋まらなくても、複数人の時間指定を組み合わせて被害を最小限にできる。
| スタッフ名 | 回答パターン | 入れる時間 | カバー時間 |
|---|---|---|---|
| 鈴木 太郎 | A(早番全部) | 7:00〜13:00 | 6時間(全部) |
| 佐藤 さくら | B(時間指定) | 9:00〜13:00 | 4時間(一部) |
| 中村 はな | B(時間指定) | 11:00〜13:00 | 2時間(一部) |
担当者には全員の回答が一覧で届きます。鈴木さんに全部お願いするか、佐藤さん+中村さんの2人でカバーするか、状況を見て選べます。欠員発生から解決まで最短5〜10分、電話ゼロです。
スプレッドシート連携の設定手順(欠員管理)
別タブ「欠員管理」を作り、3パターンの回答を列ごとに記録します。パターンごとに記録先の列が分かれます。
| 回答 | 記録列 | 書き込む内容 |
|---|---|---|
| A:今日入れます!/早番のみ/遅番も可 | C・D列 | 手挙げ(全部OK/早番のみ/遅番も可)+日時 |
| B:時間を指定して入れます | E・F列 | フォーム入力(例:9:00〜13:00)+日時 |
| C:今日は難しいです | G・H列 | 今日は難しい+日時(担当者通知は不要) |
- パターンA:「今日入れます!」「早番のみ」「遅番も可」の各ボタンに、C列(手挙げ内容)+D列(日時)の2アクションを設定。C列に書き込む文字だけボタンごとに変えます。
- パターンB:フォーム送信をトリガーに、E列(開始〜終了時間)+F列(日時)を設定。
- パターンC:「今日は難しいです」ボタンに、G列(今日は難しい)+H列(日時)を設定。
- 自分のスマホで3パターンをテストし、C・E・G列に記録されるか確認。テストデータは削除します。
※ Googleとの連携がSTEP1〜3で済んでいれば、連携操作はスキップできます。
月次集計・連携
STEP1〜4のすべてのアクションが、Googleスプレッドシートにリアルタイムで自動記録されます。月末には「今月は何人が何日働いたか」「欠員は何件あったか」まで自動で集計され、担当者は手入力ゼロ・電卓ゼロで全体状況を把握できます。
STEP1〜4のすべての記録がスプレッドシートに自動蓄積。月末には稼働スタッフ数・充足率・緊急対応件数・未提出者数が自動集計されます
4つのシートタブと「月次集計シート」
STEP1〜4で作成した4つのシートタブ(①希望収集 ②確認管理 ③出勤管理 ④欠員管理)にデータが日々自動で蓄積されます。月が終わると⑤月次集計シートを開くだけで、Googleスプレッドシートの関数が4タブのデータを読み込んで自動集計してくれます。
=COUNTIF(確認管理!C:C,"確認済み") と入れると「確認済みが何個あるか」を自動で数えます。一度入力すれば翌月から自動更新。難しく聞こえますが、コピー&ペーストするだけで使えます。
- 画面下の「+」で新しいシートを追加し、タブ名を「⑤月次集計」に変更します。
- A列に集計項目名、B列に関数を入力します(下表)。式を一度入れれば翌月以降は自動更新されます。
- B列に数字が出れば完成。「#REF!」などのエラーが出たらシート名のスペルが式と一致しているか確認します。
| A列:集計項目 | B列:関数(コピペ) | 結果例 |
|---|---|---|
| 希望提出スタッフ数 | =COUNTA(希望収集!A:A)-1 | 12 |
| シフト確認済み数 | =COUNTIF(確認管理!C:C,”確認済み”) | 11 |
| 当月総出勤日数 | =COUNTA(出勤管理!A:A)-1 | 87 |
| 欠勤件数 | =COUNTIF(出勤管理!G:G,”欠勤*”) | 3 |
| 欠員発生件数 | =COUNTA(欠員管理!A:A)-1 | 2 |
集計結果を翌月のシフトに活かす
希望未提出が多い場合
締切を3日早める/催促を前倒しにする/個別にLINEで一言送る。
特定の曜日に欠勤が多い場合
その曜日を1名多めに配置する/担当スタッフに事前確認を入れる。
Googleスプレッドシートは共有リンクを送るだけで、オーナーや上司にも「閲覧のみ」で見てもらえます。月次の報告資料としてそのまま活用できます。STEP5自体に新しいLメッセージ設定は不要で、やることは「集計シートを追加して関数を入れるだけ」です。
さらに自動化する(上級者向け)
ここまではエルメ(Lメッセージ)のノーコード連携だけで完結します。ここから先は「エルメだけでは届かない部分」をGoogle Apps Script(GAS)で自動化したい方向けの発展編です。①はエルメを使わずLINE Messaging APIで土台から組む構成、②③は送信(push)だけなのでエルメ運用にそのまま足せます。コピペで動きますが、LINE Developersの登録が前提です。
GASは「スプレッドシートの拡張機能 → Apps Script」から開けます。認証情報(トークン)はコードに直書きせず、スクリプトプロパティに保存して呼び出すのが安全です。
- Apps Scriptエディタ左側の ⚙️ プロジェクトの設定 を開きます。
- 「スクリプト プロパティ」で以下の2つを追加します。
LINE_TOKEN:LINE公式アカウントのチャネルアクセストークン(長期)ADMIN_UID:通知を受け取る担当者のLINE userId
- 保存します。以降、コードからは名前で呼び出すだけです。
※ トークンをコードに直書きすると、コピー共有時に漏れる危険があります。スクリプトプロパティに置けば、コード本体を見せても認証情報は隠れたままです。
①〜③のすべてで使い回す送信用の関数です。まずこれを貼り付けておきます。
// ▼ 共通:指定ユーザーにLINEメッセージを送る(①〜③で使い回す)
function pushLine(to, text) {
const token = PropertiesService.getScriptProperties()
.getProperty('LINE_TOKEN');
UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + token },
payload: JSON.stringify({
to: to,
messages: [{ type: 'text', text: text }]
})
});
}
エルメを使わず、LINE Messaging APIで直接組む場合の土台です。スタッフがボタン(postback)をタップすると、その内容が該当タブに1行追加されます。ウェブアプリとしてデプロイし、そのURLをLINE DevelopersのWebhookに設定します。
// ▼ ①LINEのボタン回答を受け取り、対応するタブに記録する
function doPost(e) {
const ev = JSON.parse(e.postData.contents).events[0];
if (!ev) return ContentService.createTextOutput('no event');
const uid = ev.source.userId;
const ss = SpreadsheetApp.getActiveSpreadsheet();
if (ev.type === 'postback') {
// 例:action=希望&week=1&shift=早番
const p = parseData_(ev.postback.data);
if (p.action === '希望') {
ss.getSheetByName('希望収集')
.appendRow([new Date(), uid, '', p.week, p.shift]);
} else if (p.action === '確認') {
ss.getSheetByName('確認管理')
.appendRow([new Date(), uid, '確認済み']); // C列に「確認済み」
}
}
return ContentService
.createTextOutput(JSON.stringify({ ok: true }))
.setMimeType(ContentService.MimeType.JSON);
}
// data文字列を { action, week, shift } に分解する補助関数
function parseData_(data) {
const o = {};
data.split('&').forEach(function (kv) {
const a = kv.split('=');
o[a[0]] = decodeURIComponent(a[1] || '');
});
return o;
}
確定シフト表(担当者がSTEP2で完成させる一覧。A列:勤務日/B列:userId/C列:氏名/D列:時間帯)を読み、翌日・当日に出勤するスタッフだけへ自動でリマインドを送ります。時間主導型トリガーで前日18時・当日7時に実行します。
// ▼ ②-1 前日18時リマインド(トリガー:毎日18:00)
function sendPrevDayReminder() {
remindByDate_(1,
'【明日の出勤リマインド🏨】\n明日 %DATE% は %TIME% 出勤です。\n' +
'お気をつけてお越しください。');
}
// ▼ ②-2 当日7時リマインド(トリガー:毎日07:00)
function sendSameDayReminder() {
remindByDate_(0,
'【本日の出勤🏨】\nおはようございます!本日 %TIME% 出勤です。\n' +
'気をつけてお越しください。');
}
// 指定日数後に出勤するスタッフへLINEを送る共通処理
function remindByDate_(offsetDays, template) {
const rows = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('確定シフト').getDataRange().getValues();
const target = Utilities.formatDate(
new Date(Date.now() + offsetDays * 86400000),
'Asia/Tokyo', 'yyyy/MM/dd');
for (let i = 1; i < rows.length; i++) {
const day = Utilities.formatDate(
new Date(rows[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
if (day !== target) continue; // 対象日でなければスキップ
const uid = rows[i][1];
const time = rows[i][3];
pushLine(uid,
template.replace('%DATE%', day).replace('%TIME%', time));
}
}
毎月1日の朝に先月分を自動集計し、「月次集計ログ」タブ(1行=1か月の履歴。STEP5の縦型集計シートとは別に作る)に1行追記したうえで、担当者のLINEへサマリーを送ります。STEP5の関数(COUNTIF/COUNTA)をGAS側でまとめて実行し、結果を通知まで一気通貫にします。
// ▼ ③毎月1日の朝に先月分を集計し、記録+担当者へ通知(トリガー:毎月1日9:00)
function monthlyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 指定タブの列から件数を数える補助関数
const cnt = function (sheet, col, keyword) {
const vals = ss.getSheetByName(sheet)
.getRange(col + '2:' + col).getValues().flat();
return vals.filter(function (v) {
return keyword ? String(v).indexOf(keyword) === 0 : v !== '';
}).length;
};
const kibou = cnt('希望収集', 'A', ''); // 希望提出スタッフ数
const kakunin = cnt('確認管理', 'C', '確認済み'); // シフト確認済み数
const kekkin = cnt('出勤管理', 'G', '欠勤'); // 欠勤件数
const ketuin = cnt('欠員管理', 'A', ''); // 欠員発生件数
const ym = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年M月');
ss.getSheetByName('月次集計ログ')
.appendRow([ym, kibou, kakunin, kekkin, ketuin]);
const admin = PropertiesService.getScriptProperties()
.getProperty('ADMIN_UID');
pushLine(admin,
'📊 ' + ym + 'のシフト集計\n' +
'・希望提出:' + kibou + '名\n' +
'・確認済み:' + kakunin + '名\n' +
'・欠勤:' + kekkin + '件\n' +
'・欠員募集:' + ketuin + '件');
}
- Apps Scriptエディタ左側の ⏰ トリガー を開き「トリガーを追加」をクリックします。
- 実行する関数に
sendPrevDayReminderを選び、イベントのソース=「時間主導型」→「日付ベースのタイマー」→「午後6時〜7時」に設定します。 - 同様に
sendSameDayReminderを「午前7時〜8時」、monthlyReportを「月ベースのタイマー/1日/午前9時〜10時」で追加します。
※ 時刻はトリガーの時間帯で指定します(分単位の厳密指定は不可)。厳密な時刻が必要な場合は毎分トリガー+時刻判定で調整します。
まとめ|Lメッセージで必要な設定一覧
月次シフト管理 LINE構築の要点(STEP1〜5)
- STEP1:毎月15日に希望収集を自動配信。未回答者には締切前に自動催促
- STEP2:確定シフトを個人名・日別・時間帯入りで個人別通知。確認ボタンで既読管理
- STEP3:出勤前日18時・当日朝7時に自動リマインド。チェックインボタンで出勤確認
- STEP4:急な欠員は全スタッフへ一斉配信。3パターン回答+担当者自動アラート
- STEP5:全データをスプレッドシートに自動記録。月次集計まで完全自動化
Lメッセージで必要な主な設定
① 毎月15日の定期自動配信シナリオ(STEP1 希望収集)
② 未回答タグを持つスタッフへのセグメント配信設定(催促)
③ 確定シフト個人別差し込み送信テンプレート(STEP2)
④ 出勤前日・当日朝の遅延配信シナリオ+欠勤アラート(STEP3)
⑤ 急な欠員募集用テンプレート+3パターン回答+担当者アラート(STEP4)
⑥ 全ステップのGoogleスプレッドシート外部連携設定(STEP1〜5共通)




