Kon's DX Lab - Case Study

Day 30|“完璧”より“記録”。人時生産管理をまず再起動するために

Published on 2025-05-01

🔬 Case Study Summary
Problem

(ここに課題を記述)

Result

(ここに具体的な成果を記述)


Tech & Process

(ここに採用技術とプロセスを記述) コードを詳しく見る »

こんにちは、こんです🦊
今日は「人時生産管理の再起動」に挑みました。


✅ なぜGASで先に作ったのか?

Streamlit × スプレッドシートで本格的な記録ツールを開発中で、

  • Googleログインによる認証

  • フォームUI+カレンダービュー

  • AgGridによるマスタ連携

  • データ集計・分析まで一画面で完結

ここまで来ていたのですが…

「作り込みに手間取り、その間にも“現場の記録”は失われていく」

この状態こそが、最大の損失だと気づいたのです。


✏️ 今日の方針:まず“止まらない仕組み”を動かす

ということで、今日はスプレッドシート × Google Apps Script(GAS)
“最低限かつ継続できる記録フォーム”を先に立ち上げました。


🛠 実装した内容(技術概要)

🧩 ベース技術:Google Apps Script(HTMLService)

  • HtmlServiceでサイドバーUIを構築

  • スプレッドシートから直接起動できるメニューをonOpen()で追加

SpreadsheetApp.getUi()
  .createMenu('記録フォーム')
  .addItem('入力フォームを開く', 'showSidebar')
  .addToUi();

🎨 UI:Material Design Lite(CDN適用)

  • スプレッドシート内のサイドバーでも**“それっぽいUI”**になるように、MDLを使用

  • <select>などのフォームパーツをCSSで拡張し、スマートな横並びに調整


🕓 時間入力:15分単位 & 今ボタン対応

  • selectを使って 時・分を分けて選択

  • 「今」ボタンで、現在の時刻を即時反映(Math.floor()で15分単位に丸め)

const m = Math.floor(now.getMinutes() / 15) * 15;

📊 マスタ連携:スプレッドシート → GAS → フォームに反映

  • getMasterListWithLabel()で任意の列を読み出し、JSON形式で返却

  • フロントでは populateSelect() を通じて <select> に動的反映

google.script.run.withSuccessHandler(data => populateSelect('user', data))
  .getMasterListWithLabel('メンバー', 4, 4);

✅ その他の工夫ポイント

  • 工数分類に対して title="..." を活用した ホバーヘルプ を表示

  • 工数ごとに entry_id を自動生成(重複防止や編集時の識別キー)

`${data.user}_${data.date}_${data.start_time}`

💡 教訓:「完璧主義」は記録文化の敵かも

Streamlitでどれだけ良いUIを設計しても、
それが動き出すまでの期間、現場のログが失われていたら意味がない

  • まずは“記録が始まる”

  • そこから“改善を見える化”

  • 最終的に“文化として定着”

このサイクルをつくるには、
仮でも動く最小構成を持つことが何より大事だと痛感しました。


🚀 これからの流れ

  • GASフォームをまず運用 → データを貯める

  • Streamlit版はUIに集中して開発を続ける(日付ピッカー、可視化など)

  • 両者を比較しながら、最適なUXを模索

  • 将来的には React版への移行 or 外販も視野に


🧠 まとめ

完璧なツールを目指すあまり、「今日の記録」が失われるのはもったいない。

“作りながら記録する”ではなく、“記録しながら作る”
この考え方が、今日の大きな収穫でした。


#100日チャレンジ
#DX実験記録
#GoogleAppsScript
#業務改善
#Streamlit開発記録
#スプレッドシート自動化
#工数管理
#自走チーム
#ノーコード活用
#記録文化を作る