TTECHNICALProject Progress Manager
Automation / 情報設計
Project Progress Manager
Google スプレッドシートを正本にしたまま、複数プロジェクトの進捗・依存・判断待ちを登録から集計まで完結させる進捗管理アドオン。
01このページについて
このページについて
対象Project Progress Manager(gas-project-management-demo/)
公開 claim の正本gas-project-management-demo/README.md
実装形態個人開発です。シート構造の設計、登録処理、集計、履歴、テストまでを 1 人で実装しました。実運用中のスプレッドシートとは接続しておらず、投入されるデータはすべて架空です。外部連携とスケジュール実行は含めていません。
含めていないもの
- 非公開の元プロダクトは宣言していない。このリポジトリ自体がデモの本体。
- 未実装として明示しているのは 03_ボード / 04_ロードマップ / 06_AI提案 の 3 スタブ。
02Architecture
Architecture
検証 → ロック → 冪等性 → 採番 → 書込(Project → Work Item → Relation → Decision)→ Activity → コミット。失敗時は書いた行を逆順に削除して戻す。ダッシュボード再構築はこのトランザクションの外。
03Why this architecture
Why this architecture
Sheets を正本にしたのは、利用者が既にそこで運用しており、外部 DB を持つと導入・権限管理のコストが利益を上回るため。代償は原子性を諦めたこと。
外部 DB + 専用 UI
移行コストと運用負担。いま使っている表を捨てることになる。
Sheets の関数と条件付き書式だけで組む
同時登録・依存関係・履歴が破綻する。
04Failure modes
Failure modes
- シート上の手編集はロック対象外の列では自由。
- 循環検出は同一送信内のみ。
- 見出しのリネームと必要列の削除で壊れる。
- ロールバック中の削除失敗は握りつぶす。
- 自動実行トリガーが無いため、集計はメニュー実行まで古いまま。
- 保護レンジの編集者にはスプレッドシート所有者が残る。
05Trade-offs
Trade-offs
- アプリ層での補償削除は完全な原子性を主張できない。
- LockService.tryLock(200) の fail-fast は、混雑時に「登録中」エラーが増える代わりに待ち時間を作らない。
06Tests
Tests
77 passed / 0 failed(2026-08-15 に npm test)。Apps Script ランタイム不要の vm Fake で実行。
| 領域 | 内容 |
|---|---|
| ロック競合 | T-13 |
| 冪等性 | T-09・T-09b |
| ロールバック | T-08 |
| 循環検出 | T-06・T-07 |
| 保護と許可リスト | T-P1〜P4・T-B1〜B5・T-C1〜C10 |
| 外部通信ゼロ | T-18a〜d |
| Activity | T-15c |
| Dashboard | T-16 |
07Security / Data handling
Security / Data handling
- safe-error.js:8-45(11 コード・7 パターンのマスク)。
- schema.js:145-256 の Range Protection。
- main.js:113-269 の onEdit 許可リスト。
- 先頭 = のエスケープ。
- 外部通信は静的テストで 0 件を固定。
08Limitations
Limitations
できること・含めていないことの各行に対応。README「このリポジトリについて(重要)」を正本とする。
この公開デモに含めていない
- 循環依存の検出は同一送信の中まで。既存行と新規分が組み合わさって生じる循環は対象外。
- 見出しのリネームと必要列の削除では壊れる。
- 03_ボード / 04_ロードマップ / 06_AI提案 は案内行のみのスタブで未実装。
09Scale
Scale
| 項目 | 実測値 | 取得方法 |
|---|---|---|
| シート | 12(表示 8 / 管理 4) | src/config.js の DISPLAY_SHEETS(8)と ADMIN_SHEETS(4)。初期セットアップが作成する数と一致 |
| スクリプト | JavaScript 9 ファイル + サイドバー HTML 1 | src 配下の JavaScript 9 ファイルと、サイドバー用の HTML 1 ファイル |
| 管理する種別 | 5(Project / Work Item / Decision / Relation / Activity) | src/schema.js で見出しを持つ 8 シートのうち、業務データを保持するのはこの 5 種 |
| テスト | 77 passed / 0 failed | npm test(2026-08-15 実行。2026-08-20 に再実行し同数を確認)/ CI run 32023326469 |
| 外部通信 | 0 | src/ に UrlFetchApp の呼び出しが 1 件も無いことを、テストで固定している |
10Links
Links
gas-project-management-demo/src/registration-service.js:32-46, 80-106, 335-344, 346-366, 623-650gas-project-management-demo/src/schema.js:38-59, 145-256gas-project-management-demo/src/id-service.js:79-86gas-project-management-demo/src/sync-controller.js:53-141tests/run-tests.js
設計文書の読む順
docs/architecture.md