旅館の採用・シフト・勤怠をLINEだけで自動化する方法

【保存版】旅館のLINE業務自動化 完全ガイド|採用・シフト・勤怠をLmessageで一元化
LINE公式アカウント Lmessage(エルメ) Googleスプレッドシート×GAS

旅館のLINE業務自動化
完全ガイド

採用の応募受付からシフト希望収集、日々の出退勤打刻・給与計算の元データ作成まで。
旅館スタッフがすでに使い慣れているLINEだけで、バックオフィス業務を丸ごと自動化します。
設定手順・リッチメニューの自動切替・GASコードのコピペ設定を1記事に集約しました。

対象システム
Lmessage 有料プラン
対象業務
採用 / シフト / 勤怠
難易度
初級〜中級
目次(タップで開閉)
0

事前準備・確認事項

共通
📋

設定を始める前に4つを準備

すべて揃ったら設定スタートです

準備するもの内容
📱 LINE公式アカウント旅館のアカウントが作成済みであること(LINE公式サイトから無料で作成可)
💻 Lmessageアカウント有料プランに契約済みで l-message.com にログイン可能なこと
📊 Googleアカウントスプレッドシート連携に使うGoogleアカウント
📝 スプレッドシート「応募者管理」「シフト希望」「勤怠記録」の3シートを作成しておく
まだLINE公式アカウントを作っていない場合は、先に「LINE Official Account Manager」でアカウントを作成してからLmessageにログインしてください。
1

Lmessageにログイン・LINE連携する

共通
🔑

Lmessageにログインする

パソコンでブラウザを開いてアクセス

  • 1
    ブラウザのアドレスバーに「l-message.com」と入力してアクセス
  • 2
    メールアドレスとパスワードを入力して「ログイン」
  • 3
    「アカウント連携」から旅館のLINE公式アカウントを選択して連携
ログインすると左側に縦メニューが並びます。これがLmessageの管理画面です。以降のすべての設定はこの画面から行います。
2

タグ設計 ― 最初に全部まとめて作る

共通
🏷️

採用・シフト・勤怠のタグを一括作成

「友だち管理」→「タグ管理」→「+タグを追加」

タグはスタッフや求職者に貼る「名札」です。タグを使うと「出勤中の人だけにLINEを送る」「未回答者だけにリマインド」といったピンポイント配信ができます。あとの設定がスムーズになるよう、最初にまとめて作っておきましょう。

🟢 採用系タグ

応募者未選考選考中 採用済不採用 職種:フロント職種:客室職種:料理補助

🔵 シフト系タグ

スタッフフロント担当客室担当 料理補助担当希望収集済シフト確定済本日出勤

🟡 勤怠系タグ(状態タグ)

出勤中退勤済休憩中 未打刻欠勤
特に重要なタグ使うタイミング
応募者 / 未選考友だち追加時に自動付与。採用フローの起点
スタッフ採用決定時に付与。リッチメニューの表示切替に使用(後述)
希望収集済シフト希望を回答したら自動付与。未回答者へのリマインドに使用
本日出勤当日出勤予定者に付与。勤怠メニュー切替・出勤リマインドに使用
出勤中 / 休憩中 / 退勤済 / 未打刻打刻ボタンを押すたびに自動で切り替わる状態タグ
タグは一度作れば何度でも使い回せます。「本日出勤」タグの付与・削除の自動化は PART 4のGAS連携 で解説します。
3

Googleスプレッドシート連携(1回だけ)

共通
🔗

LmessageとGoogleスプレッドシートをつなぐ

設定 → 外部連携 → Googleスプレッドシート

Lmessage 設定→外部連携 Googleスプレッドシート 認証 Googleアカウント で認証 応募者管理 シフト希望 勤怠記録 3シートに 自動記録
  • 1
    左メニュー「設定」→「外部連携」→「Googleスプレッドシート」→「Googleアカウントで認証」
  • 2
    旅館のGoogleアカウントでログインして認証を完了する(認証は一度だけでOK)
  • 3
    各フォームの完了アクションに「スプレッドシートへ書き込み」を追加し、下記シートの列にマッピングする

3つのシートの役割

シート名記録される内容連動する機能
応募者管理氏名・年齢・雇用形態・希望職種・面接日程採用フォーム(PART 1)
シフト希望受信日時・スタッフ名・担当・希望休日シフト希望フォーム(PART 2)
勤怠記録日付・氏名・出勤/退勤時刻・休憩・実働時間打刻ボタン(PART 3)
各シートの具体的な列マッピングや実働時間の自動計算式は、それぞれのPARTで詳しく解説します。認証さえ済ませておけば、あとはフォーム側で「書き込む」を選ぶだけです。
PART 1 — 採用管理

採用をLINEで完全自動化する

友だち追加から面接確定まで全自動。管理者の手作業は合否連絡のみ。

4

採用リッチメニュー設定

採用管理
📱

求職者向けメニュー(6ボタン)

採用LINEを友だち追加した人に表示される

  • 1
    左メニュー「リッチメニュー」→「+新規作成」
  • 2
    メニュー名「採用メニュー」、表示「常時」、レイアウト「2行×3列」を選択
  • 3
    下表のとおり6ボタンを設定して「保存して公開」
ボタン種別送信キーワード
📋 求人情報テキスト送信求人情報
✏️ 今すぐ応募テキスト送信応募する
📅 面接確認テキスト送信面接確認
🏨 旅館紹介URL遷移旅館HPのURL
💰 給与・待遇テキスト送信給与待遇
💬 質問するテキスト送信質問する
採用が決まってタグ「スタッフ」を付与すると、この採用メニューが自動的にスタッフ向けメニューへ切り替わります。仕組みは PART 4 で解説します。
5

あいさつシナリオ(友だち追加時)

採用フロー
👋

友だち追加した瞬間に自動でメッセージが届く

管理者は何もしなくてOK

  • 1
    「シナリオ配信」→「+新規作成」
  • 2
    トリガー「友だち追加時(followイベント)」、タイミング「即時(0分後)」
  • 3
    「メッセージを追加」→「テキスト」で下の文面を入力
  • 4
    「アクションを追加」→「タグ付与」で「応募者」「未選考」を設定
📨 友だち追加時に自動で届くメッセージ
採用LINEへようこそ!
ご応募いただきありがとうございます。

ご希望の職種を番号でお知らせください。

【1】フロントスタッフ
【2】客室スタッフ
【3】料理補助スタッフ
6

職種分岐〜応募完了シナリオ

採用フロー
🔀

「1」「2」「3」の返信で職種ごとに自動分岐

番号を送ると自動でその職種の案内が届く

「1」を送信 求職者 キーワード応答 1→フロント / 2→客室 3→料理補助 に自動分岐 職種案内+タグ付与 氏名・年齢・雇用形態 面接日程選択 応募完了!

求職者が「1」「2」「3」のいずれかを送ると、Lmessageが自動でその職種の案内を送信。続けて氏名・年齢・雇用形態をフォームで聞き、面接日程を選んでもらいます。

  • 1
    「キーワード応答」→「+追加」→ キーワード「1」→ 職種タグ付与+フロントシナリオへ移行
  • 2
    同様に「2」→客室、「3」→料理補助のキーワード応答を設定
  • 3
    各職種でフォーム機能により「氏名・年齢・雇用形態・面接日程」を順番に収集
  • 4
    完了アクション:確定メッセージ送信+管理者通知+「応募者管理」シートへ書き込み
📨 応募完了後に自動で届くメッセージ
ご応募ありがとうございます!
〇月〇日(月)10:00 に面接を承りました。

場所:旅館フロント
当日は10分前にお越しください。

前日と当日朝にリマインドをお送りします。
7

面接リマインド設定

採用フロー
⏰

前日と当日朝に自動でリマインドが届く

面接のすっぽかしを防げる

面接が決まったら、前日18時と当日朝8時に自動でリマインドが届きます。「ステップ配信」で設定すれば、何人応募が来ても全自動です。

  • 1
    「ステップ配信」→「+新規作成」→ トリガー「タグ付与時(面接:〇月〇日)」
  • 2
    STEP1:タグ付与から〇日後 18:00に「前日リマインド」を送信
  • 3
    STEP2:タグ付与から〇日後 08:00に「当日リマインド」を送信
「ステップ配信」は「◯◯が起きてから△時間後にメッセージを送る」機能です。一度設定すれば以降は自動で動き続けます。
PART 2 — シフト管理

シフト希望収集をLINEで自動化する

毎月20日に全スタッフへ自動配信。希望収集から未回答リマインドまで自動。

8

シフト希望収集 タイマー配信

シフト管理
📅

毎月20日に全スタッフへ自動でLINEが届く

締切前日に未回答者へリマインドも自動送信

毎月20日の正午に全スタッフへ希望収集のLINEが自動で届きます。返信していない人には25日夜にリマインドも自動送信されます。

  • 1
    「ステップ配信」→「+新規作成」→ トリガー「日時指定(繰り返し)」
  • 2
    繰り返し設定:毎月20日 12:00、配信対象:タグ「スタッフ」全員
  • 3
    STEP2:毎月25日 20:00、対象:タグ「希望収集済」を持たないスタッフ(=未回答者のみ)
📨 毎月20日に届くメッセージ
{name}さん、お疲れ様です!
来月のシフト希望を受け付けます。

休みたい日をすべてお知らせください。
例:「7日、14日、21日」

締切:今月25日(日)23:59
{name} はLmessageの差し込みタグです。各スタッフの登録名(「田中さん」「山田さん」)が自動で入るので親しみやすい印象になります。
9

シフト希望受付シナリオ

シフト管理
📝

「希望申請」と送るとフォームが自動起動

入力するとスプレッドシートに自動記録

「希望申請」 フォーム起動 希望休を入力 完了後 自動処理 ① 受付完了メッセージ ② タグ「希望収集済」付与 ③ スプレッドシート記録 シフト希望 シートに追記
  • 1
    「キーワード応答」→ キーワード「希望申請」(部分一致)を設定
  • 2
    アクション:フォーム「シフト希望収集フォーム」を起動
  • 3
    完了アクション①:タグ「希望収集済」を付与
  • 4
    完了アクション②:「シフト希望」シートへ自動書き込み

「シフト希望」シートの列マッピング

Lmessageフォーム項目列
受信日時(自動)A列
LINEユーザーID(自動)B列
スタッフ名(自動)C列
タグ「〇〇担当」D列
質問1(希望休日)E列
回答ステータス(自動:回答済)F列
データが溜まったら、管理者がシフト表を作成してスタッフへ配信します。シフト確定後は「シフト確定済」タグを付与しておくと、後の管理がしやすくなります。
PART 3 — 勤怠管理

出退勤・休憩の打刻をLINEで自動化する

1タップで打刻・集計。実働時間の計算から給与計算の元データ作成まで全自動。

10

勤怠管理システムの全体像

勤怠管理

スタッフがすでに使い慣れているLINEを活用することで、専用アプリのインストールや操作研修なしに勤怠管理を導入できます。

📱
追加アプリ不要
LINEをそのまま利用。導入ハードルほぼゼロ。
⚡
打刻は1タップ
ボタンを押すだけで出勤・退勤・休憩を即時記録。
🤖
完全自動応答
シナリオが自動で返信・タグ更新・記録を処理。
📊
自動集計
スプレッドシートへ自動転記。勤務時間を自動計算。
📱
スタッフのLINE
リッチメニューで1タップ打刻
→
🤖
Lmessage
シナリオ・タグ管理
→
📊
スプレッドシート
勤怠DB・実働時間自動計算
11

出勤・退勤・休憩の打刻フロー

勤怠管理
🟢

出勤フロー

朝、仕事を始めるときにボタンを1回押すだけ

  • 1
    リッチメニュー「出勤」をタップ(postback:shukkin が送信される)
  • 2
    「おはようございます!出勤を記録しました。出勤時刻:XX:XX」が自動送信
  • 3
    タグ:「未打刻」削除 →「出勤中」付与
  • 4
    スプレッドシートに日付・氏名・出勤時刻を自動記録
🔴

退勤フロー

ボタン1回で退勤。勤務時間も自動計算

  • 1
    リッチメニュー「退勤」をタップ(postback:taikin)
  • 2
    「お疲れ様でした!退勤時刻:18:05/本日の勤務時間:8時間3分」が自動送信
  • 3
    タグ:「出勤中」削除 →「退勤済」付与
  • 4
    退勤時刻を追記 → 実働時間が自動計算
🟡

休憩フロー

「開始」と「終了」の2回ボタンを押す

  • 1
    「休憩」をタップ →「休憩開始」「休憩終了」のクイックリプライが表示される
  • 2
    「休憩開始」を選択 → タグ「出勤中」→「休憩中」。開始時刻を記録
  • 3
    戻ったら再度「休憩」→「休憩終了」→ タグ「休憩中」→「出勤中」。休憩時間を累計計算
休憩は「開始」と「終了」の2回押すのを忘れずに。押し忘れると休憩時間が正しく記録されません。
12

メッセージ文面サンプル

勤怠管理
💬

実際のLINE画面イメージ

スタッフに届く自動返信のサンプル

出勤打刻 — 自動返信

2025年6月1日(日)
09:02
出勤ボタンをタップ
宿
09:02
田中さん、おはようございます!
出勤を記録しました。

⏰ 出勤時刻:09:02
今日もよろしくお願いします!

※退勤時はメニューの「退勤」ボタンを押してください。

退勤打刻 — 自動返信

18:05
退勤ボタンをタップ
宿
18:05
田中さん、お疲れ様でした!
退勤を記録しました。

⏰ 退勤時刻:18:05
🕐 本日の勤務時間:8時間3分

ゆっくり休んでください。明日もよろしくお願いします!

休憩 — クイックリプライ

12:00
休憩ボタンをタップ
宿
12:00
休憩の操作を選んでください。
休憩開始休憩終了
休憩開始
宿
休憩を開始しました。
⏸ 休憩開始:12:01

終了したら「休憩」→「休憩終了」を押してください。
{名前} {日時} {勤務時間} などの差し込みタグは各スタッフの情報に自動で変換されます。
13

勤怠用リッチメニューの設定

勤怠管理
📱

スタッフ向け勤怠メニュー(6ボタン)

LINEを開くと画面下部に常時表示

ボタンpostbackキー連動するシナリオ
🟢 出勤shukkin【出勤】打刻シナリオ
🔴 退勤taikin【退勤】打刻シナリオ
🟡 休憩kyukei【休憩】選択分岐シナリオ
📋 勤務確認kakunin当日記録照会シナリオ
📅 シフト確認shiftシフト表配信シナリオ
💬 お問い合わせcontact管理者チャット転送
postbackキーは必ず半角英数字で入力してください。大文字・全角が混ざるとボタンを押しても動きません。シナリオのトリガーと完全に一致させることが重要です。
14

勤怠タグの自動切り替え

勤怠管理

タグはボタンを押すたびに自動で切り替わります。管理者が手動で変える必要はありません。毎日0時に全員が「未打刻」にリセットされます。

未打刻
毎日0時
自動リセット
→
出勤中
出勤ボタン
→
休憩中
休憩開始
→
出勤中
休憩終了
→
退勤済
退勤ボタン
↺
翌日0時
リセット
全員自動
ボタンを押すたびにタグが自動で切り替わります。管理者の操作は不要です。
操作削除するタグ付与するタグ
出勤ボタン未打刻出勤中
退勤ボタン出勤中退勤済
休憩開始出勤中休憩中
休憩終了休憩中出勤中
毎朝0時(自動)退勤済・未打刻未打刻(全員リセット)

「勤怠記録」シートの列構成と自動計算

シフト表
勤怠記録
応募者管理
A:日付B:氏名C:出勤D:退勤E:休憩(分)F:実働時間
2025/06/01田中 花子09:0218:0560→ 8h03m
2025/06/01山田 太郎10:1519:30458h30m
2025/06/02佐藤 次郎08:5517:00607h05m
F列(実働時間)の数式:=TEXT((D2-C2)-E2/1440,"h""h""mm""m""")
F2にこの数式を入れて下の行へコピーするだけ。退勤−出勤から休憩を引いた実働時間が「8h03m」形式で自動計算されます。
LmessageとGoogleスプレッドシートの打刻連携はGAS(Google Apps Script)を使います。GASコードを貼り付けてデプロイし、発行URLをLmessageのWebhook URLに設定するだけで完了します。
15

打刻漏れリマインドの自動化

勤怠管理
🔔

3つのリマインドが時間どおりに自動で届く

管理者が毎日確認しなくてもシステムが動く

毎朝 08:30(平日)
🟢 出勤リマインド
対象:タグ「未打刻」のスタッフ
おはようございます!出勤の際はメニューの「出勤」ボタンを押してください。
毎日 18:00
🔴 退勤リマインド
対象:タグ「出勤中」または「休憩中」
お疲れ様です!退勤の際はメニューの「退勤」ボタンを忘れずに押してください。
翌朝 09:00
🔵 管理者アラート
対象:管理者アカウント(GAS経由)
昨日退勤打刻がなかったスタッフがいます。スプレッドシートをご確認ください。

設定手順(Lmessage管理画面)

  • 1
    管理画面 →「配信管理」→「定期配信」→「+新規」
  • 2
    配信時刻・曜日を設定(例:毎日 8:30 または 18:00)
  • 3
    対象セグメントを指定(例:タグ「未打刻」または「出勤中」)
  • 4
    メッセージ本文を入力 →「保存」
タグを使ったセグメント配信なので、出勤済みの人に出勤リマインドは届きません。必要な人だけに届き、無駄な通知が発生しません。
PART 4 — 画面切り替えの設計

1つのアカウントで画面を自動で切り替える

採用応募者 → スタッフ、さらにシフト ⇄ 勤怠。タグの組み合わせでリッチメニューが自動切替。

16

パターンA(同居)とパターンB(切替)の違い

画面設計

LINEアカウントは1つのまま、タグでリッチメニューを自動的に切り替えます。まず、採用応募者からスタッフへの切替は共通です。そのうえで、スタッフのメニュー構成に2つの設計パターンがあります。

パターンA ― 1画面に同居(推奨)

  • シフト+勤怠を6ボタンにまとめる
  • 管理者のタグ操作は採用確定時の1回だけ
  • スタッフが迷わない。シンプル。
  • 6ボタンに収まるよう機能を絞る必要あり

パターンB ― 出勤日だけ勤怠メニューに切替

  • シフト6ボタン・勤怠6ボタンをフルに使える
  • 出勤日だけ打刻ボタンが現れる
  • 毎日「本日出勤」タグの付与・削除が必要
  • 付け忘れると勤怠ボタンが出てこない
迷ったらまずパターンA(同居)で始めるのがおすすめです。運用に慣れて「メニューを機能ごとに分けたい」となったら、パターンB+GAS自動化(後述)へ発展させましょう。

採用応募者 → スタッフ(両パターン共通)

採用応募者の画面
旅館【採用・スタッフ】
採用専用LINE
友だち追加直後
宿
旅館へようこそ!ご希望の職種を番号でお知らせください。
【1】フロント 【2】客室
📋
求人情報
✏️
今すぐ応募
📅
面接確認
🏨
旅館紹介
💰
給与・待遇
💬
質問する
採用メニュー
タグなし → 表示
「スタッフ」
タグ付与
→
採用確定時
1回のみ
スタッフの画面(パターンA)
旅館【採用・スタッフ】
スタッフ専用LINE
採用確定・タグ付与後
宿
採用おめでとうございます!🎉 メニューが切り替わりました。出退勤やシフトは下のメニューから操作できます。
🟢
出勤
🔴
退勤
🟡
休憩
📅
シフト確認
🙋
希望申請
💬
相談する
スタッフメニュー(同居型)
タグ「スタッフ」→ 表示

採用タグの流れ(応募 → スタッフ切替)

タグなし
友だち追加
→
応募者
応募フォーム
→
選考中
管理者が付与
→
採用済
合否連絡後
+
スタッフ
⬆ 画面切替
「スタッフ」タグを付与した瞬間に採用メニュー → スタッフメニューへ自動切替。管理者がタグを付与する操作は採用決定時の1回だけです。

パターンB ― シフト ⇄ 勤怠を出勤日で切替

パターンBでは、スタッフのメニューを「シフト管理」と「勤怠管理」の2種類に分け、出勤予定日だけ勤怠メニューに自動で切り替えます。切替のカギは「本日出勤」タグです。

採用応募者
旅館【採用・スタッフ】
採用専用LINE
追加直後
宿
旅館へようこそ!職種を番号でお知らせください。
📋
求人情報
✏️
応募
📅
面接確認
🏨
旅館紹介
💰
給与待遇
💬
質問
採用メニュー
タグなし
「スタッフ」
付与
→
採用確定時
1回
シフト管理画面
旅館【採用・スタッフ】
スタッフ LINE
平常時(非出勤日)
宿
来月のシフト希望を受付中です。「希望申請」から入力してください。
📅
シフト確認
🙋
希望申請
🔄
変更・交換
📢
お知らせ
📞
緊急連絡
💬
相談する
シフト管理メニュー
「スタッフ」のみ → 表示
「本日出勤」
追加付与
→
毎日
出勤日のみ
勤怠管理画面
旅館【採用・スタッフ】
スタッフ LINE
出勤日
宿
おはようございます!出勤の際は「出勤」ボタンを押してください。
🟢
出勤
🔴
退勤
🟡
休憩
📋
勤務確認
📅
シフト確認
💬
問い合わせ
勤怠管理メニュー
「スタッフ」+「本日出勤」→ 表示
17

リッチメニューの表示条件設定

画面設計

Lmessageのリッチメニューは優先度が高いものが前面に表示されます。タグの有無で表示を切り替えるだけで、画面が自動で入れ替わります。

⚙️

リッチメニュー 3種類の表示条件(パターンB)

メニュー名表示条件(タグ)優先度
採用メニュータグなし(全員)低(デフォルト)
シフト管理メニュースタッフ中
勤怠管理メニュースタッフ + 本日出勤高(優先)
「本日出勤」タグが付いている間だけ勤怠メニューが前面に出て、タグを削除するとシフトメニューに自動で戻ります。パターンA(同居)を選ぶ場合は、この3段目は不要で「採用」と「スタッフ」の2種類だけで完結します。
18

GASでシフト表と連携して自動切替(実装)

GAS実践

パターンBは「本日出勤」タグの付与・削除を毎日行う必要があります。これを手動でやるのは現実的ではないため、GAS(Google Apps Script)でシフト表から自動でタグを付け外しします。コードはコピペでOK、設定は30分ほどで完了します。

✅ 完成後にできること:前日夜21時にシフト表を自動読み取り → 翌日出勤予定者へ「本日出勤」タグを自動付与 → 勤怠メニューに自動切替。翌日0時にタグを自動削除 → シフトメニューに自動で戻る。
⚠️ 前提:Lmessage有料プラン契約・LINE公式アカウント連携・「スタッフ」タグ付与・シフト管理/勤怠管理メニューの作成が完了していること。
📅

出勤日の1日の流れ(GAS自動化後)

前日 21:00(GAS自動実行)
シフト表を読み取り →「本日出勤」タグを付与
「○」のスタッフへタグ付与。シフトメニュー→勤怠メニュー に自動切替
当日 8:30(Lmessage定期配信)
出勤リマインドを自動送信
対象:本日出勤 かつ 未打刻 のスタッフのみ
出勤時(スタッフ操作)
「出勤」ボタン → 打刻・タグ切替・記録
未打刻 → 出勤中
退勤時(スタッフ操作)
「退勤」ボタン → 勤務時間を自動通知
出勤中 → 退勤済
翌日 0:00(GAS自動実行)
「本日出勤」タグを全員から自動削除
勤怠メニュー→シフトメニュー に自動で戻る

STEP 1. シフト表を準備する

GASが読み取れるよう、シフト表を以下の形式で整えます。

シフト表
勤怠記録
応募者管理
A:スタッフ名B:LINEユーザーIDC:6/1(日)D:6/2(月)E:6/3(火)F:6/4(水)
田中 花子U4a8f2c1d9e…○×○×
山田 太郎Ub3c7e5f2a1…×○○○
佐藤 次郎Uc9d1f4e8b2…○○××
  • 1
    A列:スタッフ名を入力(1行目はヘッダー行)
  • 2
    B列:LINEユーザーIDを入力。Lmessage「友だち管理」→各スタッフのプロフィールから確認(Uで始まる文字列)
  • 3
    C列以降:各日付を1行目に入力(セル形式は「日付型」)。出勤日は ○、休みは ×
  • 4
    シートタブ名を 「シフト表」 にする(GASコードの SHEET_NAME と一致させる)
💡 「○(丸)」は全角で統一を。「◯」「o」「O」も読み取れるようコード側で対応していますが、表記を揃えるほうが確実です。

STEP 2. GASコードを設置する

  • 1
    スプレッドシートを開き、「拡張機能」→「Apps Script」をクリック
  • 2
    最初から書かれている function myFunction() {} を全部削除
  • 3
    下のコードをまるごとコピーして貼り付ける
Google Apps Script(JavaScript)
// ===== 設定値(ここだけ変更してください) =====
const LMESSAGE_API_KEY   = 'YOUR_LMESSAGE_API_KEY';  // Lmessage APIキー
const LMESSAGE_CHANNEL_ID = 'YOUR_CHANNEL_ID';       // LINEチャネルID
const SHEET_NAME          = 'シフト表';               // シートタブ名
const TAG_NAME            = '本日出勤';               // 付与・削除するタグ名
const DATE_ROW            = 1;   // 日付が書いてある行番号
const STAFF_START_ROW     = 2;   // スタッフデータの開始行
const USER_ID_COL         = 2;   // LINEユーザーIDの列番号(B列=2)
const DATE_START_COL      = 3;   // 日付の開始列番号(C列=3)
// ===============================================

// 【実行①】前日夜21時に実行 → 翌日出勤者へタグ付与
function addTomorrowShiftTag() {
  const tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);
  _updateTagForDate(tomorrow, 'add');
}

// 【実行②】翌日0時に実行 → 「本日出勤」タグを全員から削除
function removeShiftTag() {
  _removeTagFromAll();
}

// 日付に一致する列を探してタグ操作
function _updateTagForDate(targetDate, action) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
                               .getSheetByName(SHEET_NAME);
  const lastCol = sheet.getLastColumn();
  const lastRow = sheet.getLastRow();
  const dateRow = sheet.getRange(DATE_ROW, DATE_START_COL,
                   1, lastCol - DATE_START_COL + 1).getValues()[0];

  // 対象日の列を特定
  let targetCol = -1;
  dateRow.forEach((cell, i) => {
    const d = new Date(cell);
    if (d.getMonth()  === targetDate.getMonth() &&
        d.getDate()   === targetDate.getDate()) {
      targetCol = DATE_START_COL + i;
    }
  });

  if (targetCol === -1) {
    console.log('対象日の列が見つかりません: ' + targetDate.toLocaleDateString());
    return;
  }

  // スタッフ行を走査してタグ操作
  const colData = sheet.getRange(STAFF_START_ROW, targetCol,
                   lastRow - STAFF_START_ROW + 1, 1).getValues();
  const idData  = sheet.getRange(STAFF_START_ROW, USER_ID_COL,
                   lastRow - STAFF_START_ROW + 1, 1).getValues();

  idData.forEach((row, i) => {
    const userId = row[0];
    const mark   = colData[i][0];
    if (!userId) return;
    if (mark === '○' || mark === '◯' ||
        mark === 'o'  || mark === 'O') {
      _callLmessageTagApi(userId, TAG_NAME, action);
      Utilities.sleep(300); // API連続呼び出し防止
    }
  });
}

// 全スタッフからタグを削除
function _removeTagFromAll() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
                               .getSheetByName(SHEET_NAME);
  const lastRow = sheet.getLastRow();
  const idData  = sheet.getRange(STAFF_START_ROW, USER_ID_COL,
                   lastRow - STAFF_START_ROW + 1, 1).getValues();

  idData.forEach(row => {
    const userId = row[0];
    if (!userId) return;
    _callLmessageTagApi(userId, TAG_NAME, 'remove');
    Utilities.sleep(300);
  });
}

// Lmessage APIを呼び出す共通関数
function _callLmessageTagApi(userId, tagName, action) {
  const endpoint = action === 'add'
    ? 'https://api.l-message.com/v1/tags/add'
    : 'https://api.l-message.com/v1/tags/remove';

  const payload = JSON.stringify({
    channel_id: LMESSAGE_CHANNEL_ID,
    user_id:    userId,
    tag_name:   tagName
  });

  const options = {
    method:             'post',
    contentType:        'application/json',
    headers:            { 'Authorization': 'Bearer ' + LMESSAGE_API_KEY },
    payload:            payload,
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(endpoint, options);
  console.log(userId + ' → ' + action +
              ' / HTTP ' + response.getResponseCode());
}
✅ 設定値(API_KEY・CHANNEL_ID・TAG_NAME など)を旅館の環境に合わせて書き換えたら、エディタ上部の「保存(Ctrl+S)」を必ず実行してください。APIキー・チャネルIDはLmessage管理画面「設定 → API設定」で確認できます。

STEP 3. トリガーを設定する

GASを毎日自動で実行するために「トリガー」を2つ設定します。

  • 1
    GASエディタ左の時計アイコン「トリガー」→「+トリガーを追加」
  • 2
    下の2つをそれぞれ追加する
  • 3
    Googleアカウントの認証画面が出たら「許可」を選択
addTomorrowShiftTag
実行タイミング
毎日 21:00〜22:00
種類
時間主導型 → 日タイマー
用途
翌日出勤者へ「本日出勤」タグを付与
removeShiftTag
実行タイミング
毎日 0:00〜1:00
種類
時間主導型 → 日タイマー
用途
全スタッフからタグを削除
⚠️ 認証エラーが出たら:「このアプリはGoogleで確認されていません」と表示されることがあります。「詳細」→「(プロジェクト名)に移動(安全でないページ)」→「許可」の順に進んでください。自分のスプレッドシートへのアクセス許可なので問題ありません。

STEP 4. 動作確認する

自動実行を待たず、手動でテストできます。

  • 1
    シフト表の明日の列に、テスト用スタッフの行へ「○」を入力
  • 2
    関数 addTomorrowShiftTag を選択し「実行」→ 実行ログに HTTP 200 が出るか確認
  • 3
    Lmessage「友だち管理」でそのスタッフに「本日出勤」タグが付いたか確認
  • 4
    スタッフのLINEを実機で見て、勤怠管理メニューに切り替わっているか確認
  • 5
    次に removeShiftTag を実行 → タグが消え、シフト管理メニューに戻るか確認
✅ HTTP 200 が返れば正常です。エラーが出た場合はAPIキー・チャネルID・タグ名の設定値が正しいか確認してください。

よくある質問

症状対処
HTTP 404 エラーAPIエンドポイントURLが異なる可能性。公式ドキュメントで最新のURLを確認し、https://api.l-message.com/v1/tags/… を修正
HTTP 401 エラーAPIキーが誤りor有効期限切れ。再発行して LMESSAGE_API_KEY を更新
「対象日の列が見つかりません」日付セルが「日付型」でない可能性。書式設定から「日付」を選択
一部スタッフにだけタグが付かないB列のユーザーIDが空欄or誤り。Lmessageで再確認して正確に入力
付け忘れの保険は?GAS自動実行なので通常は発生しません。念のためログを毎朝チェックする運用が安心です
Lmessage APIのエンドポイントURLはバージョンにより異なる場合があります。設定前に公式APIドキュメントで最新版を必ず確認してください。
19

動作確認チェックリスト

仕上げ
✅

実際にテスト送信して確認

全部チェックできたら設定完了です

🟢 採用管理
  • 友だち追加時にあいさつメッセージが届く
  • 「1」を送信するとフロントの案内が届き「職種:フロント」タグが付く
  • 面接日程選択で確定メッセージと管理者通知が届く
  • 応募者情報が「応募者管理」シートに記録される
  • 面接前日18時・当日8時にリマインドが届く
🔵 シフト管理
  • テスト配信で希望収集メッセージが届く({name}が正しく名前に変わる)
  • 「希望申請」でフォームが起動し、入力すると受付完了メッセージが届く
  • 入力内容が「シフト希望」シートに記録される
  • 回答後に「希望収集済」タグが付く/25日に未回答者だけへリマインドが届く
🟡 勤怠管理
  • 出勤ボタンで自動返信が届き「出勤中」タグが付く
  • 退勤ボタンで勤務時間が表示され「退勤済」タグに切り替わる
  • 休憩開始・終了でタグが正しく切り替わる
  • 打刻データが「勤怠記録」シートに記録され、F列の実働時間が自動計算される
  • 8:30出勤/18:00退勤リマインド、翌朝9:00の管理者アラートが届く
🟣 画面切替(パターンB採用時)
  • 「スタッフ」タグ付与で採用→スタッフメニューに切り替わる
  • 「本日出勤」タグでシフト→勤怠メニューに切り替わり、削除で戻る
  • GAS手動実行でHTTP 200が返り、タグが自動で付与・削除される

全体まとめ

  • ✓
    採用:友だち追加から面接確定まで全自動。管理者の作業は合否連絡のみ。
  • ✓
    シフト:毎月20日に全スタッフへ自動配信。希望収集・未回答リマインドも自動。
  • ✓
    勤怠:リッチメニューの1タップで出勤・退勤・休憩を即時記録。専用アプリ不要。
  • ✓
    タグ×セグメント配信で「出勤中の人だけに退勤リマインド」などピンポイント配信。
  • ✓
    Googleスプレッドシートと連携し実働時間を自動計算。月次集計・給与計算の元データに。
  • ✓
    アカウントは1つ。タグの組み合わせで採用/シフト/勤怠の画面が自動で切り替わる。
  • ⚠
    パターンB(シフト⇄勤怠切替)は「本日出勤」タグの付け外しをGASで自動化しないと運用負荷が高い。手動運用は非推奨。
※本記事は、架空の旅館を題材にしたLINE公式アカウント×Lmessage(エルメ)×Googleスプレッドシート活用のサンプル解説です。登場する事業者名・スタッフ名・数値・スプレッドシートの内容はすべて架空のものです。LmessageのAPI仕様・料金・画面構成、およびLINE公式アカウントの各種上限やプラン内容は変更される場合があります。実際に設定を行う際は、必ず各サービスの公式ドキュメントで最新の仕様をご確認ください。
※ 本記事の掲載コードはサンプルであり、ご利用は自己責任でお願いします。