🎯 健康チェックアプリ 全体アーキテクチャ設計書

データ収集 → 集計分析 → ダッシュボード → スライド報告

1. 最終目標の確認

🎯 ゴール: 経営層・管理者への報告資料自動生成

📝 アンケート回答
🗄️ データ蓄積
📊 集計・分析
📈 ダッシュボード
📑 スライド報告

求められる成果物

📊

リアルタイムダッシュボード

管理者がいつでもWeb上で確認できる集計画面。回答状況、健康問題分布、リスクレベル別人数など。

📑

定期報告スライド

月次・四半期ごとの報告用PowerPoint/PDF。経営会議や安全衛生委員会で使用。

📋

生データ一覧

詳細分析用のExcel/スプレッドシート。個別回答の確認や独自分析に使用。

2. アーキテクチャ選択肢

オプションB: PowerPoint自動生成型

構成

  • Firestore → スプレッドシート
  • Looker Studio(ダッシュボード)
  • Python + pptx(スライド生成)

メリット

  • スライドの完全カスタマイズ
  • 既存テンプレート活用可能
  • オフラインで配布可能

デメリット

  • Python環境が必要
  • 定期実行の設定が必要
コスト: 無料 難易度:
オプションC: ハイブリッド型 最良

構成

  • Firestore → スプレッドシート
  • Looker Studio(リアルタイム確認)
  • GAS + Googleスライド(定期報告)
  • 必要時 Python + pptx(詳細報告)

メリット

  • 用途に応じて使い分け
  • 日常はLooker、報告はスライド
  • 柔軟性が高い

デメリット

  • 構成要素が多い
  • 初期設定に時間がかかる
コスト: 無料 難易度:

3. 推奨アーキテクチャ(オプションC: ハイブリッド型)

👤 従業員
アンケート回答
⚛️ React App
Vercel
🔥 Firestore
生データ保存
⚡ Cloud Functions
or GAS
📊 スプレッドシート
データ蓄積 + 集計
📈 Looker Studio
リアルタイムダッシュボード
📑 Googleスライド
月次報告
📄 PowerPoint
詳細報告(任意)

各コンポーネントの役割

コンポーネント 役割 更新頻度
Firestore 回答データの一次保存、バックアップ 回答ごと(即時)
スプレッドシート データ蓄積、ピボット集計、Looker連携 回答ごと(即時)
Looker Studio 管理者向けリアルタイムダッシュボード 自動更新(15分〜)
Googleスライド 月次報告、経営会議資料 月1回(GASで自動生成)
PowerPoint 詳細報告、外部提出用(オプション) 必要時(手動 or 自動)

4. スプレッドシート設計(集計の要)

シート構成

シート名 内容 用途
生データ 全回答の詳細データ(1行=1回答) Cloud Functions/GASから書き込み
集計_概要 回答数、平均値、分布(数式で自動計算) Looker Studio連携
集計_健康問題 健康問題別の件数・割合 Looker Studio連携
集計_リスク リスクレベル別人数・推移 Looker Studio連携
集計_月次 月別サマリー スライド生成用
設定 マスターデータ、閾値設定 管理用

集計_概要シート の例

| 指標               | 今月    | 先月    | 前年同月 | 推移  |
|--------------------|---------|---------|----------|-------|
| 回答数             | 150     | 142     | 128      | ↑    |
| 平均WEスコア       | 3.45    | 3.32    | 3.21     | ↑    |
| 平均損失額(月)   | ¥18,500 | ¥21,200 | ¥24,000  | ↓改善 |
| 高リスク者数       | 12      | 15      | 18       | ↓改善 |
| 最高リスク者数     | 3       | 4       | 5        | ↓改善 |

=== 数式例 ===
回答数: =COUNTIF(生データ!A:A, ">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))
平均WE: =AVERAGEIF(生データ!A:A, ">="&DATE(...), 生データ!Q:Q)
        

5. Looker Studio ダッシュボード設計

ダッシュボード構成(1ページ)

📊 回答状況
回答数、回答率
推移グラフ
📈 WEスコア
平均値、分布
前月比較
💰 労働損失
合計損失額
平均損失額
🏥 健康問題
TOP5問題
円グラフ
⚠️ リスク分布
レベル別人数
棒グラフ
📋 要注意リスト
高リスク者一覧
(匿名表示)

フィルター機能

  • 期間選択(今月/先月/過去3ヶ月/過去1年/カスタム)
  • 部署別(業務内容でフィルタ)
  • 雇用形態別
  • 年代別
💡 Looker Studioのメリット

スプレッドシートをデータソースにすると、データが更新されるたびにダッシュボードも自動更新されます。URLを共有するだけで管理者がいつでも確認できます。

6. スライド自動生成

方式A: Google Apps Script + Googleスライド

// Google Apps Script
function generateMonthlyReport() {
  // スプレッドシートから集計データ取得
  const ss = SpreadsheetApp.openById("SPREADSHEET_ID");
  const summarySheet = ss.getSheetByName("集計_月次");
  const data = summarySheet.getDataRange().getValues();

  // テンプレートスライドをコピー
  const template = DriveApp.getFileById("TEMPLATE_SLIDE_ID");
  const newFile = template.makeCopy("健康調査報告_" + Utilities.formatDate(new Date(), "JST", "yyyy年MM月"));
  const slides = SlidesApp.openById(newFile.getId());

  // プレースホルダーを置換
  const slide1 = slides.getSlides()[0];
  slide1.replaceAllText("{{回答数}}", data[1][1]);
  slide1.replaceAllText("{{平均WE}}", data[2][1]);
  slide1.replaceAllText("{{平均損失額}}", "¥" + data[3][1].toLocaleString());
  slide1.replaceAllText("{{高リスク者数}}", data[4][1]);

  // グラフを更新(Sheetsのグラフを埋め込み)
  // ...

  // 完成したスライドのURLをメール通知
  MailApp.sendEmail({
    to: "admin@example.com",
    subject: "月次健康調査報告が生成されました",
    body: "スライドURL: " + newFile.getUrl()
  });
}

// 毎月1日に自動実行するトリガーを設定
        

方式B: Python + python-pptx

# Python スクリプト(ローカル or Cloud Functions)
from pptx import Presentation
from pptx.util import Inches, Pt
import gspread
from google.oauth2.service_account import Credentials

# スプレッドシートからデータ取得
gc = gspread.authorize(credentials)
sheet = gc.open_by_key("SPREADSHEET_ID").worksheet("集計_月次")
data = sheet.get_all_records()

# テンプレートを開く
prs = Presentation("template.pptx")

# スライド1: サマリー
slide1 = prs.slides[0]
for shape in slide1.shapes:
    if shape.has_text_frame:
        if "{{回答数}}" in shape.text:
            shape.text = shape.text.replace("{{回答数}}", str(data["回答数"]))
        # ... 他のプレースホルダーも置換

# スライド2: グラフ(matplotlib で生成して埋め込み)
# ...

# 保存
prs.save(f"健康調査報告_{datetime.now().strftime('%Y年%m月')}.pptx")
        

スライド構成案(5枚)

スライド タイトル 内容
1 表紙 調査期間、回答数、実施部門
2 サマリー 主要指標4つ(回答数、WE、損失額、リスク者数)+ 前月比
3 健康問題分析 TOP5健康問題の円グラフ、前月との比較
4 リスク分析 リスクレベル分布、ハイリスク者の傾向
5 推奨アクション 分析に基づく改善提案(自動生成 or 手動追記)

7. 実装フェーズ

1
データ収集基盤(1-2日)
  • Firebaseプロジェクト作成
  • Firestoreセットアップ
  • React AppにFirebase SDK追加
  • 回答データの書き込み実装
2
スプレッドシート連携(1日)
  • スプレッドシート作成(シート構成設計通り)
  • Cloud Functions or GAS で自動転記
  • 集計シートの数式設定
3
ダッシュボード構築(1日)
  • Looker Studio でダッシュボード作成
  • スプレッドシートをデータソースに接続
  • グラフ・表の配置
  • フィルター設定
4
スライド自動生成(1-2日)
  • スライドテンプレート作成
  • GAS or Python でデータ挿入ロジック
  • 月次トリガー設定
  • メール通知設定
📅 想定スケジュール

合計: 4-6日で全機能が稼働開始。フェーズ1-2で基本機能、フェーズ3-4で報告機能が完成。

8. コスト見積もり

サービス 無料枠 月100件の場合 月1,000件の場合
Firebase Firestore 20,000読み書き/日 $0 $0
Cloud Functions 200万呼び出し/月 $0 $0
Google スプレッドシート 無制限 $0 $0
Looker Studio 無制限 $0 $0
Google スライド 無制限 $0 $0
Google Apps Script 無制限 $0 $0
合計 $0 $0
💰 結論

月間数千件規模であれば、完全無料で運用可能です。Google Workspace(有料)がなくても、個人のGoogleアカウントで構築できます。

9. 次のステップ

✅ 実装を開始する場合

以下の情報をお知らせください:

  1. Firebaseプロジェクト名(新規作成 or 既存)
  2. スプレッドシートの作成先(新規 or 既存URL)
  3. ダッシュボードに必要な項目の追加要望
  4. スライドのデザイン要望(テンプレートがあれば)

実装依頼の例

フェーズ1から実装を開始して。
Firebaseプロジェクトは新規作成。
スプレッドシートも新規作成でお願いします。
        

段階的に進める場合

まずフェーズ1(データ収集基盤)だけ実装して。
動作確認後にフェーズ2以降を進めたい。