~ChatGPTと試行錯誤しながら完成させた実務向け自動化の記録~
はじめに
私はとある地方のスーパーマーケットで店長をしています。
店舗運営をしていると、
- 今日の出勤者一覧を知りたい
- ○○さんは出勤?
- ○○さんは何時から?
- 部門ごとの勤務状況を確認したい
といったことを知りたいシーンによく出くわします。
勤務計画は会社のシステム上で管理されていますが、売り場から3階にある事務所まで階段で上がって、パソコンにログインして、さらに勤怠システムにログインするのはとても手間ですし、60過ぎの私にはかなり厳しいものがあります。
そこで今回は、
LINEで質問すると勤務情報を返してくれるボット
を、Make・Google Sheets・ChatGPTを使って作ってみました。
今回は「完成した」こと以上に、
生成AIと一緒に悩みながら作った過程
に価値があったので、その試行錯誤を書いてみます。
作ったもの
LINEに質問すると勤務情報を返すボットです。
例:
今日の出勤者一覧
→ 今日の勤務者一覧を返信
今日の畜産は?
→ 畜産部門の勤務者表示
桃井さんは?
→ 個人の勤務確認
高野さんは何時から?
→ 勤務開始時間回答
6月13日の桃井さんは?
→ 指定日の勤務確認
同姓者が複数いる場合は候補を出します。
佐藤さんは?
→ 候補が複数います
- 佐藤〇和
- 佐藤〇み
- 佐藤〇久
- 佐藤〇百
番号を入力してください
実装動画
使用技術
- LINE Messaging API
- Make
- Google Sheets
- Data Store(候補者リスト保存のみ)
- ChatGPT
- JSON Parse
- Router
- Text Aggregator
勤務データはGoogle Sheets管理です。
会社のシステムから一か月分の勤務計画データをCSVにて11部門分ダウンロードし、一つのGoogle Sheetsとしてドライブに保存しています。(ここは手作業⁉)
最終形
ここにたどり着くまでの苦難の道を記します。
全体構成
大まかな流れです。
LINE
↓
ChatGPT(質問解析)
↓
JSON Parse
↓
Router
↓
Google Sheets検索
↓
OpenAI整形
↓
LINE返信
実際はここからさらに細かく分岐しています。
- 部門別確認
- 個人確認
- 候補選択
- 勤務時間確認
- 該当者なし処理
最終的にはかなり大きなシナリオになりました。
ChatGPTをどう使ったか
今回、一番AIを使ったのは設計とデバッグです。
特に使った部分は
- JSON出力用プロンプト作成
- Router設計
- Makeの分岐条件
- LINE Tokenエラー調査
- Data Store設計
- 条件式の改善
実際のプロンプト例。ChatGPTに必要なプロンプトを書いてもらいました。
質問を解析しJSONのみ返してください
intent:
today_workers
department_workers
specific_person
work_time
select_candidate
dateはyyyy/M/d形式
ユーザーメッセージの現在日付を基準に計算
これを改善し続けました。
一番苦労したポイント① 日付認識
最初は、
今日の桃井さんは?
が常に
2026/6/1
固定になりました。 入力時に日付を指定しても6月1日のデータしか返してきません。
原因はChatGPTでの日付指定の仕方にあった
formatDate( now ; "yyyy/M/d" ; "Asia/Tokyo")
の書き方ミスでした。
Run OnceしてINPUTの結果を見てみると日付が壊れて、
2026/6/1;AM29iam/To92026th
みたいな謎文字列になりました。
原因が特定できず、ChatGPTとの押し問答から抜け出せなくなりました。
そのうち、こちらでも指示されていない変更を勝手に始めます。
このあたりのやり取りから ChatGPTに対する不信感? が芽生え始めました。
最終的にはこの書き方で安定させることができました。
一番苦労したポイント② Reply Token地獄
途中から大量発生。
Reply tokenのエラーが発生し、前に進めず…
- Invalid reply token
- stale token
- expired token
原因…
LINE Reply Tokenは短命
でした。
特に、
Google Sheets検索
↓
OpenAI
↓
Router
↓
Data Store
↓
LINE
みたいに処理が長いと期限切れを起こしてしまうようです(ChatGPT談)
店舗に存在しない従業員名を入力した際の分岐処理が正しくできず、ここは結局、
該当なしルートのみ Push Message
に変更。
とりあえずこれで安定しました。
一番苦労したポイント③ 同姓者と該当なしが同時発生!
しかしその後、これで最後まで悩みました。
症状は…
弓田さん(当店にいない従業員名)は?
→ 候補が複数います。番号を入力してください。
→ 該当者が見つかりませんでした。
と、両方返ってきてしまいます。
Routerの先を見てみると、本来 「該当者がいない」 分岐のみに流れるべきところ、なぜか 「同姓者が複数いる場合」 の分岐にもデータが流れていることがわかりました。
原因は…
Text Aggregatorが空Bundleを流していた!
でした。
次の Text Aggregator ⇒
Stop processing after an empty aggregation のとこを 「Yes」 に修正。
これで解決。
ここは以前にも躓いたことがあるポイント。
本当に盲点でした。
完成後の最終分岐ルート
個人確認
↓
Google Sheets
0件
→ Push Message
1件
→ OpenAI → Reply
2件以上
→ Text Aggregator
→ Data Store
→ 候補表示
ここまで来てようやく安定しました。
最終形のフローを図にしたものです。(By ChatGPT)
AIを使って気付いたこと
今回感じたこと。
生成AIは、
正解をくれるというより、
『壁打ち相手』
でした。
特に良かったのは…
- エラー原因候補を大量に出す
- 設計を言語化できる
- 分岐を整理できる
- 試行錯誤が早い
- スクショから問題点を推察できる
逆に、
「Make特有のクセ」 があり、最後は自分で理解しないと解決できません。
正直、MAKEを構築する時間よりも、デバッグ時間のほうが圧倒的に長かったです。
今後の挑戦
今後改善を進めたいこと
- シフト変更通知
- 欠員アラート
- 応援要請の自動化
- 計画外の事前申請
- 計画外実績の自動記録
- 出退勤スキャン忘れの自動記録
など、より実務で役立つものに育てたいです。
おわりに
私は定年を控えた60代半ばに差し掛かろうとする者です。
正直、MakeもLINE APIも最初はよくわかりませんでした。
でも、
生成AIを使うと
「わからない」を分解できる
「わからない」を分解できる
ことを実感しました。
AIを使ったから簡単だったのではなく、
AIと一緒に試行錯誤できたから完成できた。
そんな開発でした。











