プロジェクト概要

Google Apps ScriptとLINE Messaging APIを活用した対話型学習支援システムです。LINE Botを通じて、理科・社会・国語・英語の4科目24カテゴリから学習でき、Google Spreadsheetに格納された問題データベースから、ユーザーが選択した科目・分野・問題数に応じて出題し、リアルタイムで正誤判定と解説を提供します。

開発目的

  • LINE Messaging APIを活用した実践的なBot開発スキルの習得
  • Google Apps Scriptによるサーバーレスアーキテクチャの実装
  • Flex Messageを駆使したモダンなUI/UX設計
  • 教育分野におけるチャットボットの有効活用

使用技術

プログラミング言語

JavaScript (ES6+) JSON

バックエンド

Google Apps Script LINE Messaging API v2 Google Spreadsheet API v4 Properties Service

Google Apps Script: サーバーレスバックエンド・Webhook処理
LINE Messaging API: メッセージ送受信・Bot機能
Properties Service: ユーザー状態管理・セッション保持

フロントエンド(LINE UI)

LINE Flex Message Postback Action Carousel Template

主な機能

1. 4科目対応の総合学習システム

  • 理科(12カテゴリ): 中1〜中3の物理・化学・生物・地学
  • 社会(3カテゴリ): 歴史・地理・公民
  • 国語(5カテゴリ): 漢字・ことわざ・慣用句・四字熟語・文法
  • 英語(4カテゴリ): 英単語・英熟語・英文法・穴埋め
  • 合計24カテゴリの幅広い学習範囲をカバー

2. 直感的な3段階選択UI

  • 科目選択: 2×2グリッドレイアウトで4科目を一覧表示
  • カテゴリ選択: Carouselで複数カテゴリをスワイプ表示
  • 問題数選択: 5問/10問/20問/30問から選択

3. インタラクティブなクイズ機能

  • ランダム出題: データベースから問題をランダム抽出
  • 4択問題: Flex Messageによる美しいボタンUI
  • 即時フィードバック: 正誤判定と正解・解説の表示
  • 進捗管理: 問題番号と正解数のリアルタイム表示

4. Google Spreadsheet連携

  • 科目ごとに独立したSpreadsheet管理
  • カテゴリ別シート構成
  • データ更新時の自動反映
  • 問題形式: 問題文・選択肢4つ・正解・解説

5. セッション管理機能

  • Properties Serviceによるユーザー状態保持
  • 出題中の問題データ保存
  • 正解数・進捗のトラッキング
  • クイズ終了時の自動クリーンアップ

システム構成

データフロー

LINEユーザー
↓ メッセージ送信
LINE Platform
↓ Webhook
Google Apps Script
↓ データ取得
Google Spreadsheet(問題DB)
↓ 問題抽出・ランダム化
Flex Message生成
↓ LINE Messaging API
ユーザーへ返信
↓ Postback(回答)
正誤判定・次問題送信

工夫した点

1. Flex Messageによる高度なUI設計

  • 2×2グリッドレイアウト: 科目選択・問題数選択を視覚的に整理
  • Carouselテンプレート: 多数のカテゴリを4つずつグループ化してスワイプ表示
  • カラーリング: 科目選択(紺色)、カテゴリ選択(オレンジ)、選択肢(青色)で視覚的に区別

2. 堅牢なエラーハンドリング

  • Spreadsheet/シート存在確認
  • データ空チェック → 「準備中」メッセージ表示
  • try-catchによる例外処理
  • ユーザーへの分かりやすいエラーメッセージ

3. 状態管理の最適化

  • Properties Serviceを活用したセッション管理
  • 必要最小限のデータ保存(JSON形式)
  • クイズ終了時の自動クリーンアップ(deleteAllProperties()

4. ユーザビリティの向上

  • 連続出題: 正誤判定と次問題を1回の応答で送信(ユーザー待機時間短縮)
  • 正解表示の充実: 不正解時に正解記号と内容を両方表示
  • 進捗表示: 「問題3/10」のように現在位置を明示

5. データ構造の柔軟性

  • Spreadsheet IDを定数化 → メンテナンス性向上
  • カテゴリとシート名の動的マッピング
  • 問題数の配列管理 → 簡単に変更可能

技術的ハイライト

1. Postbackデータの階層的設計

// 科目選択
data: `subject=理科`

// カテゴリ選択
data: `category=理科|中1物理`

// 問題数選択
data: `start_quiz=理科|中1物理|10`

// 回答選択
data: `answer=①`
  • パイプ区切りで複数情報を1つのデータに格納
  • split()で復元し、科目・カテゴリ・問題数を取得
  • シンプルなデータ構造で状態管理を効率化

2. ランダム出題アルゴリズム

while (questions.length < parseInt(questionCount) && dataRows.length > 0) {
    const idx = Math.floor(Math.random() * dataRows.length);
    questions.push(dataRows.splice(idx, 1)[0]);
}
  • Math.random()でランダムインデックスを生成
  • splice()で抽出済み問題を配列から削除
  • 重複出題を完全に防止
  • 指定問題数に達するまでループ

3. 連続出題の最適化

// 正誤判定 + 次問題を1つの配列で送信
const messages = [
    { type: 'text', text: '🎉 正解です!' },
    createQuestionMessage(userId, index + 1)  // 次問題
];
sendReply(replyToken, messages);
  • 複数メッセージの一括送信でユーザー待機時間を短縮
  • 正誤判定と次問題を同時に表示
  • LINE Messaging APIの配列機能を活用
  • スムーズな学習体験を実現

活用シーン

1. 学生向け

  • 通学時間: スマホで手軽に復習
  • テスト前: 苦手分野の集中学習
  • 隙間時間: 5問モードでサクッと学習

2. 教育者向け

  • 宿題配信: LINE Botで問題を配布
  • 小テスト: 授業前の確認テスト
  • データ更新: Spreadsheetで簡単に問題追加

3. 学習塾向け

  • 生徒管理: 学習状況の把握
  • 反転授業: 事前学習ツール
  • 保護者連携: 学習報告の自動化(拡張機能として)

今後の展望

1. 短期的な改善

  • 解説の表示/非表示切り替え機能
  • 出題履歴の記録(同じ問題の重複回避)
  • タイマー機能(制限時間設定)
  • 正答率の可視化グラフ

2. 中期的な機能追加

  • ユーザー別の学習履歴管理
  • 弱点分野の自動抽出
  • ランキング機能(友達と競争)
  • 復習モード(不正解問題の再出題)

3. 長期的な拡張

  • AIによる問題自動生成
  • 音声問題の対応
  • 画像問題の対応
  • 高校生・大学受験への対応
  • 他の学習コンテンツ(英会話、数学など)の追加

開発情報

開発形態

個人開発

役割

企画・設計・実装・テスト

開発時の注意事項

本プロジェクトは教育・学習目的で開発しました。開発および運用にあたり、以下の点に配慮しています。

LINE Messaging APIの適切な利用

  • LINE Developersの利用規約を遵守し、個人的な学習範囲内での開発
  • メッセージ送信のレート制限を守り、過度なAPI呼び出しを避ける
  • ユーザーのプライバシーを尊重し、個人情報の収集は最小限に留める
  • テストは限定的なユーザーでのみ実施し、大規模配信は行わない

Google Apps Scriptの制限事項

  • Google Apps Scriptの実行時間制限(6分)を考慮した設計
  • Properties Serviceの容量制限(9KB)に配慮したデータ管理
  • Spreadsheet APIの1日あたりの読み取り上限を意識した実装
  • 同時アクセス時の処理を考慮したエラーハンドリング

問題データの著作権配慮

  • 問題データは自作またはオープンソースのものを使用
  • 教育目的での利用範囲を遵守
  • 第三者の著作権を侵害しないよう、問題内容に十分配慮
  • 商用利用や無断転載を行わない方針を明示

技術的配慮

  • セキュリティ: アクセストークンの適切な管理(環境変数化推奨)
  • パフォーマンス: 必要最小限のデータ取得でSpreadsheetへの負荷を軽減
  • 保守性: コードの可読性を重視し、将来的な機能追加に対応
  • ユーザビリティ: 直感的なUI設計でストレスフリーな学習体験を提供

倫理的配慮

  • 本ツールはポートフォリオとしての技術紹介を目的としている
  • 学習支援という教育的価値を最優先に考えた設計
  • 実用的な学習ツールとして、学生・教育者・塾への貢献を目指す
  • オープンソース化については、悪用防止の観点から慎重に検討

謝辞

  • LINE Corporation: LINE Messaging APIの提供と充実したドキュメント
  • Google: Google Apps ScriptとSpreadsheet APIの無償提供
  • 教育関係者の皆様: 問題内容の監修や学習カリキュラムへの助言
  • オープンソースコミュニティ: JavaScriptライブラリと技術情報の共有