1. 最終目標の確認
🎯 ゴール: 経営層・管理者への報告資料自動生成
📝 アンケート回答
→
🗄️ データ蓄積
→
📊 集計・分析
→
📈 ダッシュボード
→
📑 スライド報告
求められる成果物
リアルタイムダッシュボード
管理者がいつでもWeb上で確認できる集計画面。回答状況、健康問題分布、リスクレベル別人数など。
定期報告スライド
月次・四半期ごとの報告用PowerPoint/PDF。経営会議や安全衛生委員会で使用。
生データ一覧
詳細分析用のExcel/スプレッドシート。個別回答の確認や独自分析に使用。
2. アーキテクチャ選択肢
オプションA: Google統合型 推奨
構成
- Firestore → スプレッドシート
- Looker Studio(ダッシュボード)
- Googleスライド(報告資料)
メリット
- すべてGoogle製品で統一
- リアルタイム連携
- 共有・共同編集が容易
- 無料で運用可能
デメリット
- スライドのカスタマイズに制限
- オフライン利用に制約
コスト: 無料
難易度: 低
オプションB: PowerPoint自動生成型
構成
- Firestore → スプレッドシート
- Looker Studio(ダッシュボード)
- Python + pptx(スライド生成)
メリット
- スライドの完全カスタマイズ
- 既存テンプレート活用可能
- オフラインで配布可能
デメリット
- Python環境が必要
- 定期実行の設定が必要
コスト: 無料
難易度: 中
オプションC: ハイブリッド型 最良
構成
- Firestore → スプレッドシート
- Looker Studio(リアルタイム確認)
- GAS + Googleスライド(定期報告)
- 必要時 Python + pptx(詳細報告)
メリット
- 用途に応じて使い分け
- 日常はLooker、報告はスライド
- 柔軟性が高い
デメリット
- 構成要素が多い
- 初期設定に時間がかかる
コスト: 無料
難易度: 中
3. 推奨アーキテクチャ(オプションC: ハイブリッド型)
👤 従業員
アンケート回答
アンケート回答
⚛️ React App
Vercel
Vercel
🔥 Firestore
生データ保存
→
生データ保存
⚡ Cloud Functions
or GAS
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. 次のステップ
✅ 実装を開始する場合
以下の情報をお知らせください:
- Firebaseプロジェクト名(新規作成 or 既存)
- スプレッドシートの作成先(新規 or 既存URL)
- ダッシュボードに必要な項目の追加要望
- スライドのデザイン要望(テンプレートがあれば)
実装依頼の例
フェーズ1から実装を開始して。
Firebaseプロジェクトは新規作成。
スプレッドシートも新規作成でお願いします。
段階的に進める場合
まずフェーズ1(データ収集基盤)だけ実装して。
動作確認後にフェーズ2以降を進めたい。