Synthetic data / Demo掲載している画面はすべて合成データです。実顧客・実案件・本番運用の記録ではありません。
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

  1. シート上の手編集はロック対象外の列では自由。
  2. 循環検出は同一送信内のみ。
  3. 見出しのリネームと必要列の削除で壊れる。
  4. ロールバック中の削除失敗は握りつぶす。
  5. 自動実行トリガーが無いため、集計はメニュー実行まで古いまま。
  6. 保護レンジの編集者にはスプレッドシート所有者が残る。
05Trade-offs

Trade-offs

  • アプリ層での補償削除は完全な原子性を主張できない。
  • LockService.tryLock(200) の fail-fast は、混雑時に「登録中」エラーが増える代わりに待ち時間を作らない。
06Tests

Tests

77 passed / 0 failed(2026-08-15 に npm test)。Apps Script ランタイム不要の vm Fake で実行。

77 passed / 0 failednpm test(2026-08-15 / CI run 32023326469)

領域内容
ロック競合T-13
冪等性T-09・T-09b
ロールバックT-08
循環検出T-06・T-07
保護と許可リストT-P1〜P4・T-B1〜B5・T-C1〜C10
外部通信ゼロT-18a〜d
ActivityT-15c
DashboardT-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 1src 配下の JavaScript 9 ファイルと、サイドバー用の HTML 1 ファイル
管理する種別5(Project / Work Item / Decision / Relation / Activity)src/schema.js で見出しを持つ 8 シートのうち、業務データを保持するのはこの 5 種
テスト77 passed / 0 failednpm test(2026-08-15 実行。2026-08-20 に再実行し同数を確認)/ CI run 32023326469
外部通信0src/ に UrlFetchApp の呼び出しが 1 件も無いことを、テストで固定している
10Links

Links

  • gas-project-management-demo/src/registration-service.js:32-46, 80-106, 335-344, 346-366, 623-650
  • gas-project-management-demo/src/schema.js:38-59, 145-256
  • gas-project-management-demo/src/id-service.js:79-86
  • gas-project-management-demo/src/sync-controller.js:53-141
  • tests/run-tests.js
設計文書の読む順
  1. docs/architecture.md

Case Study を読む→

原寸表示。掲載側の crop はレイアウト上の切り抜きで、ここでは全体を表示している。