こんにちは、こんです🦊
今日は「人時生産管理の再起動」に挑みました。
✅ なぜ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開発記録
#スプレッドシート自動化
#工数管理
#自走チーム
#ノーコード活用
#記録文化を作る