はじめに
こんにちは!佐世保市で子育て中のパパです。
突然ですが、子育て中の「困った!」って尽きないですよね。
「急に熱出た!近くの小児科どこ!?🏥」
「今週末、子ども連れてどこ行こう…🏞️」
「夜泣きが止まらない…誰か助けて😭」
そんなパパママの悩みを解決すべく、佐世保市特化型の子育て支援LINEボット 「ポケットさせぼ」 を開発しました!
今回は、Google Apps Script (GAS) と Gemini API を組み合わせて、 コストゼロ で挑戦した記録を共有します。
作ったもの:ポケットさせぼ📱
佐世保市の子育て世帯向けに、以下の機能を提供するLINE公式アカウントです。
\ 実際に触ってみてください! /
LINE友だち追加URLはこちら
- 🏥 病院検索: 現在地から、診療科(小児科など)と距離で絞り込み、近い順に表示。
- 🏢 公共施設検索: 児童館などを現在地から検索。
- 📅 イベント情報: 「今週末」「来月」のイベントをAIが自動収集して案内。
- 🤖 AI子育て相談: 育児の悩みをAI(Gemini)に相談できる対話機能。
技術スタック🛠️
「スモールスタート」と「運用コストゼロ」にこだわり構築しました。
| カテゴリ | 使用技術 |
|---|---|
| Platform | LINE Messaging API |
| Backend | Google Apps Script (GAS) |
| Database | (イベント情報のみ)Google スプレッドシート |
| AI Model | Google Gemini API (gemini-2.5-flash) |
| Data Source | BODIK API (佐世保市オープンデータサイト) |
こだわりポイント&実装の裏側💡
1. 病院・施設検索:オープンデータAPIの活用
佐世保市の病院や公共施設のデータは、オープンデータAPI(BODIK API)を利用しました。
GASからAPIを叩き、ユーザーの 位置情報(緯度経度) との距離を計算して、近い順にソートして返しています。
実装自体はシンプルでしたが、 「オープンデータならではの壁」 にぶつかりました。
データの中身(質と量) にも課題がありました。
- 情報の鮮度: すでに閉院している病院が掲載されたままになっている。
- 情報の粒度: 「公共施設」カテゴリーに「市営駐車場」なども含まれており、ユーザーの意図とずれる場合がある。
これらはデータソースを提供する 行政側の課題 であるため、APIを利用する側の個人開発(クレンジング)では根本的な解決が難しいという「限界」も痛感しました。かと言って、自分でデータを収集・メンテナンスすることは非現実的です。。
2. イベント情報:AIによる「自動収集」システム
ここは、 現在進行系で一番苦労している部分です。
佐世保のイベント情報はあちこちのサイトに散らばっていて、まとめるのは大変です。そこで、 Gemini に「イベント収集」を任せることにしました。
特に今回は、佐世保市近辺ということで、長崎市や佐賀のイベントも収集したいので、複数のサイトから情報収集する必要がありました。
仕組み:
- Geminiに指示(プロンプトは以下)。
- AIが集めたデータをスプレッドシートに追記させる。
- 重複データはGAS側でURLをキーにして排除。
プロンプト
単に「イベント教えて」と聞くだけでは実用的なデータは返ってきません。
そこで、以下のような詳細なカスタムプロンプトを設定しています。
🤖 実際に使用しているプロンプト(クリックで展開)
あなたは、指定された地域の子ども向けイベント情報検索に特化した、高精度のアシスタントです。以下の指示に厳密に従って、ユーザーの要求に応えてください。
# 役割
長崎県(主要地域)、佐賀県のイベント情報の中から、「中学生までの子ども」が楽しめるイベントを専門に検索し、整理し、**「佐世保市中心部から近い順」**に並べ替えて提供する「ファミリーイベント・コンシェルジュ」です。
# 対象イベント(最重要)
「中学生までの子ども」が楽しめるイベントを幅広く対象とします。
**「ファミリー向け」「親子向け」「子ども向け」**と明記されているイベント(例:体験教室、ワークショップ、キャラクターショー、子ども向け祭りなど)。
**一般的な祭りや物産展であっても、**出店(屋台)、ステージイベント、簡単な体験コーナー、動物とのふれあいなど、中学生までの子どもが楽しめると判断できる要素が含まれる場合は対象に含めます。
# 対象地域(最重要)
以下の地域で開催されるイベントのみを対象とします。
長崎県:
長崎本土全域。
離島の取り扱い(厳守):
対象に含める離島: 黒島(佐世保市)、高島(佐世保市)
除外する離島: 上記以外の全ての離島(例:五島列島、壱岐、対馬など)
佐賀県内
# 厳守すべきルール(URLの取り扱い)
URLの取り扱いに関する絶対的なルール:
「公式URL」を最優先する:
ユーザーに提供するURL(F列: 詳細URL)は、**必ずそのイベントの主催者、運営団体、またはイベント専用に作られた「公式ウェブサイト」**のURLでなければなりません。
ポータルサイトの禁止:
「佐世保観光サイト(sasebo99.com)」、「長崎観光ポータル(nagasaki-tabinet.com)」、「ウォーカープラス」などの、イベント"一覧"ページや、第三者がまとめた紹介記事のURLを「詳細URL」として提示してはいけません。
公式URLの定義:
許可されるURL(◎):
イベント専用のドメイン
主催者(例: 〇〇実行委員会、長崎県、伊万里市役所)のウェブサイトにある、そのイベントの告知ページ。
開催施設(例: ハウステンボス、アルカスSASEBO、県立科学館)の公式サイトにある、そのイベントの詳細ページ。
禁止されるURL(×):
観光ポータルサイトやイベントまとめサイトの一覧。
個人のブログや、主催者ではないニュースサイトの記事。
公式が見つからない場合:
もし主催者の公式ページがどうしても見つからない場合に限り、開催地の自治体(県、市、町)など信頼できる公的機関の告知ページを代替として使用します。それも見つからない場合は「詳細URL」欄は「N/A」または「情報なし」と記載します。
# 実行プロセス
期間の特定: ユーザーの入力(例:「11月」「今週末」「来月」)から、検索すべき日付の範囲を正確に特定します。
イベント検索(ステップ1): Google検索ツールを使い、対象地域ごとに「子ども向け」および「一般的な祭り」イベントを広くリストアップします。
検索クエリ(例):
「長崎県 イベント [特定した期間] 子ども向け」
「佐世保市 イベント [特定した期間] 親子」
(中略)
結果のフィルタリング: ステップ1で得られた結果を、以下の2点で厳密にフィルタリングします。
① 地域フィルター: 「# 対象地域」のルール(除外離島など)に合致しているか確認する。
② 対象者フィルター: 「# 対象イベント」のルール(子ども向け、または子どもが楽しめそうな祭り・物産展)に合致しているか確認する。
公式URL検索(ステップ2): フィルタリング後の各イベント名ごとに、再度Google検索を実行し、「公式URL(詳細URL)」を特定します。
検索クエリ(例):「[イベント名] 公式サイト」「[イベント名] 主催」
情報集約: 各イベントについて、以下の情報を収集・生成します。
A列: イベント名 (テキスト / 必須)
B列: 開始日 (日付 / 必須 / 形式: YYYY-MM-DD)
C列: 終了日 (日付 / 任意 / 形式: YYYY-MM-DD)
(中略)
並べ替え(最重要):
収集したイベントリストを、**「佐世保市中心部(例:佐世保駅)から開催地までの距離が近い順」**に並べ替えます。
# 出力フォーマット(確認用)
回答は必ずマークダウンのテーブル(表)形式で提示してください。
(以下省略)
⚠️ それでも残る課題(ハルシネーション)
ここまで細かく役割や禁止事項(離島の除外やURLのルール)を指示しても、 「存在しないイベントが出力される」 などの課題が依然として残っています。
- 過去のイベント情報を今年のものとして紹介してしまう。
- URLがリンク切れ、または無関係なページになっている。
- そもそも存在しないイベントが返される。
現在は、AIが出力したデータを最終的に目視でチェックするフローを挟んで対応していますが、 「AIに情報の正確性を100%保証させることの難しさ」 を痛感しています。
3. AI子育て相談:行政ボットにはない「柔軟性」
「育児相談」機能では、レスポンスの早い Gemini Flash を使用しています。
ただAIに答えさせるのではなく、 「公的情報(厚労省のガイドラインなど)に基づいて回答して」 というシステムプロンプト(ペルソナ設定)を組み込むことで、信頼性の担保を試みています。
正直なところ、実際の回答がどの程度公的情報に基づいているか、厳密な検証はまだできていません。
しかし、行政が提供するチャットボットは「ハルシネーション(嘘)」を極端に避ける必要があるため、回答が硬直的になりがちです。
対して個人開発であれば、裏でGeminiを動かすことで、ある程度のリスクは取りつつも、 「親身になって相談に乗ってくれる柔軟性」 を提供できます。このバランスこそが、個人開発の醍醐味だと感じています。
また、「Geminiのスマホアプリを使えばいいのでは?」と思われるかもしれません。
しかし、ターゲットであるパパママ全員が「AIフレンドリー」なわけではありません。日常的に使い慣れている LINE を入り口にすることで、誰でも自然にAIの恩恵を受けられるようにしています。ここには一定のニーズがあると踏んでいます。
開発中のトラブルと学び🤯
開発は順風満帆ではありませんでした...。
-
期待しないレスポンス
- LINEボットがちんぷんかんぷんになる現象。原因はおそらくGASでの処理の滞留。これは、個人で無料開発ということで、ご愛嬌としてもらえたらと思います。(イベント情報を聞いているのに、現在地の送信を求められる(正しくは今週末や今月などの期間を尋ねる質問))
-
AIの幻覚(ハルシネーション)
- 前述の通り、イベント情報収集でAIが架空のイベントをでっち上げることがありました。プロンプトで「実在確認」を強く指示し、GAS側でもデータの整合性チェックを入れることで精度を上げています。
-
GASの勉強不足
- 完全個人の問題ですが、Geminiで効率よく開発できたはいいものの、細かいエラーハンドリングなどでAIが迷宮入りしてしまうと、なすすべがなくなってしまいます。AIを正しく使うためには知識は必要と感じました。
今後の展望🚀
- AED検索機能: いざという時のために、AEDの場所も探せるようにしたい。
さいごに
個人開発の醍醐味は、やはり作った時の達成感だと思います。
「ポケットさせぼ」が、佐世保のパパママの子育てを少しでも楽にできれば嬉しいです!
もし「自分もLINEボット作ってみたい!」という方がいれば、ぜひ GAS × Gemini の組み合わせを試してみてください。

