本文書は BizLP GAS Accounting の非機能要件を体系的に定義する。各要件は計測可能な基準値を持ち、GAS (Google Apps Script) 環境固有の制約を前提とする。


要件サマリー

ID要件名カテゴリ現状
NFR-P01GAS 6分タイムアウトパフォーマンス充足
NFR-P02スプレッドシートセル容量パフォーマンス充足
NFR-P03RPA起票スループットパフォーマンス充足
NFR-P04データマート更新速度パフォーマンス充足
NFR-P05API呼び出し最適化パフォーマンス充足
NFR-D01SSOT原則の遵守データ整合性充足
NFR-D02冪等性(二重起票防止)データ整合性充足
NFR-D03トランザクション模倣データ整合性部分充足
NFR-D04データ整合性チェックデータ整合性充足
NFR-D05マスタ参照整合性データ整合性充足
NFR-S01認証(OAuthセキュリティ充足
NFR-S02データ暗号化セキュリティ充足
NFR-S03ロールベースアクセス制御セキュリティ部分充足
NFR-S04行レベルアクセス制御セキュリティ未対応
NFR-S05入力規則・列保護セキュリティ充足
NFR-S06機密データ保護セキュリティ部分充足
NFR-A01GASサービス依存性可用性充足
NFR-A02デプロイ手順の確立可用性充足
NFR-A03ロールバック可用性充足
NFR-A04バックアップ・リカバリ可用性充足
NFR-M01テストカバレッジ保守性部分充足
NFR-M02コードの凝集度・モジュール性保守性充足
NFR-M03ドキュメント鮮度保守性充足
NFR-M04DDLスキーマ管理保守性充足
NFR-T01仕訳追跡(INVTRN監査証跡充足
NFR-T02決済追跡(STL→TRN)監査証跡充足
NFR-T03RPA起票元追跡監査証跡充足
NFR-T04操作者追跡監査証跡未対応
NFR-T05仕訳レコード不変性監査証跡充足
NFR-T06操作ログ監査証跡未対応

パフォーマンス

NFR-P01: GAS 6分タイムアウト

項目内容
カテゴリパフォーマンス
シナリオユーザーがGASメニューから任意の処理(RPA起票/Action A/B/マート更新)を実行するとき
要件基準各処理が 6分以内 に完了すること
制約条件GAS は 1 実行 6 分(360 秒)上限。超過時 Exceeded maximum execution time で中断
検証方法GAS 実行ログ (console.time / Apps Script ダッシュボード) で計測
現状ステータス充足 — 処理を機能単位に分離。現状 INV 数百行で約 30 秒〜2 分

緩和策:

  • RPA は予算タブ種別ごとに独立実行(HC/SaaS/CAPEX/Pipeline/Finance/Adhoc)
  • Action A/B は承認済/消込済の未処理行のみを対象とし、全量スキャンを回避
  • マート更新は getDataRange().getValues() による一括読み込み + インメモリ集計

NFR-P02: スプレッドシートセル容量

項目内容
カテゴリパフォーマンス
シナリオ会計年度の経過によりトランザクション行が蓄積し続けるとき
要件基準ブック全体のセル数が 1,000万セル以下 に維持されること
制約条件Spreadsheet セル上限 10,000,000 セル / ブック
検証方法=SUMPRODUCT(行数×列数) または GAS の getMaxRows()*getMaxColumns()
現状ステータス充足 — 現状上限の 10% 未満。FLAG=FALSE 行を定期クリーンアップ運用想定

NFR-P03: RPA起票スループット

項目内容
カテゴリパフォーマンス
シナリオHC RPA(最大12行/人/月)を全従業員分一括実行するとき
要件基準500 行/分以上 の書込スループット維持
制約条件setValues() はバッチに比例。個別行 setValue() は桁違いに遅い
検証方法テストランナー T1/T5/T6/T8 の実行時間を計測
現状ステータス充足 — 一括 setValues() で 10 名 × 12 行 = 120 行 ≒ 15 秒

NFR-P04: データマート更新速度

項目内容
カテゴリパフォーマンス
シナリオユーザーがマート更新メニューを実行し、P/LB/S・C/F・PJ損益・日次CFを全て更新するとき
要件基準全財務諸表の更新が 3分以内 に完了すること
制約条件6分上限の半分以内を目標とし、将来のデータ増加に対するバッファを確保
検証方法テストランナー T4 の実行時間。GAS実行ログでの所要時間確認
現状ステータス充足 — 全諸表更新 ≒ 30 秒(インメモリ集計 finalUnionData + 一括出力)

NFR-P05: API呼び出し最適化

項目内容
カテゴリパフォーマンス
シナリオ任意の処理がスプレッドシートAPI(getValues/setValues/getRange 等)を呼び出すとき
要件基準API 呼び出し回数 最小化。シート毎 getDataRange().getValues() は 1 回のみ
制約条件GAS↔API ラウンドトリップ約 50-100ms/回。ループ内 getValue() 禁止
検証方法コードレビューで API 呼び出しパターンを確認
現状ステータス充足 — 「一括読込 → インメモリ → 一括書込」採用。例外: Action A/B の JNL_ID 書戻のみ行単位

実装パターン:

読み込み: sheet.getDataRange().getValues()     → 1回/シート
処理:     JavaScript 配列操作                   → API呼び出しなし
書き込み: sheet.getRange(...).setValues(array)  → 1回/バッチ

データ整合性

NFR-D01: SSOT原則の遵守

項目内容
カテゴリデータ整合性
シナリオP/L・B/S・C/F・PJ損益の集計を実行するとき
要件基準財務諸表集計は 32_wrk_invoice (INV) 起点。TRN を集計ソースに使わない
制約条件TRN は監査証跡(ADR-0001
検証方法06_datamart_*.js レビュー + P/L 合計値 vs INV 手計算
現状ステータス充足06_datamart_ingest は INV/STL のみ読込・TRN 不参照

NFR-D02: 冪等性(二重起票防止)

項目内容
カテゴリデータ整合性
シナリオユーザーが同一条件で RPA 起票または Action A/B を2回連続実行するとき
要件基準2回目以降の実行で 重複レコードが生成されない こと(新規処理件数 = 0)
制約条件GAS にはデータベーストランザクション機構がなく、処理途中での中断が起こりうる
検証方法T7(冪等性テスト・8 サブテスト)— 2 回実行で 2 回目の処理件数 = 0 を確認
現状ステータス充足

実装メカニズム:

処理冪等性チェック方法チェック列
RPA起票isDuplicate_() — 摘要文字列の重複検出32_wrk_invoice.摘要
Action A自動仕訳JNL_ID ≠ 空 → スキップ32_wrk_invoice.自動仕訳JNL_ID
Action B自動仕訳JNL_ID ≠ 空 → スキップ33_wrk_bank.自動仕訳JNL_ID

NFR-D03: トランザクション模倣

項目内容
カテゴリデータ整合性
シナリオAction A/B の処理中に GAS タイムアウトまたはエラーが発生し、処理が途中で中断されたとき
要件基準再実行で 未処理行のみ処理・処理済はスキップ。部分書込状態から回復可能
制約条件GAS にロールバック機構なし。setValues() はアトミックでない
検証方法中断シミュレーション + JNL_ID 書戻が行単位であることを確認
現状ステータス部分充足 — JNL_ID チェックで整合性担保。TRN 書込~JNL_ID 書戻間の中断のみ理論リスク

緩和策:

  1. TRN 行を一括 setValues() で書き込み(中間状態の発生を最小化)
  2. JNL_ID を行単位で即時書き戻し(次行処理前に完了マーカーを設定)
  3. 中断後の再実行時、JNL_ID 存在チェックで処理済み行をスキップ
  4. データ整合性チェック (03_data_validator.js) で事後検出

残存リスク: TRN一括書き込みとJNL_ID書き戻しの間の数ミリ秒間に中断が発生した場合の二重生成。発生確率は極めて低いが、発生時はメンテナンスツール(孤立TRN削除)で手動修復する。

NFR-D04: データ整合性チェック

項目内容
カテゴリデータ整合性
シナリオユーザーがデータ整合性チェックメニューを実行するとき
要件基準20-30 番台全タブで科目マスタ存在/金額/日付/参照をチェックし セル色+ツールチップで可視化
制約条件10 シート以上対象のためマスタ事前ロード(O(1))必須
検証方法不正データ投入でエラーが検出されることを確認
現状ステータス充足03_data_validator が 10 種検証 × 3 段階(CRITICAL/ERROR/WARNING)

バリデーション対象:

シート主なチェック項目
21_bud_pipeline計上開始年月、確度、売上科目のマスタ存在
22_bud_headcount開始年月、給与額、勤務区分
23_bud_subscription開始年月、年間費用
24_bud_capex_loan資産種別、購入日、金額
25_bud_finance摘要、科目マスタ存在
26_bud_adhoc科目マスタ存在、金額
27_bud_resourcePJ名マスタ存在、HC氏名マスタ存在
31_wrk_order発注日、取引先、科目
32_wrk_invoice発生日必須(承認済/決済完了時)、親ORD存在、税計算精度、残高≧0
33_wrk_bank決済日必須(消込済時)、消込対象INV存在、決済日≧INV発生日

NFR-D05: マスタ参照整合性

項目内容
カテゴリデータ整合性
シナリオRPA 起票時に予算マスタの科目名が 11_mst_account に未登録であるとき
要件基準未登録の科目名に対して エラーを発生 させること。キーワード推測による自動分類は 禁止
制約条件科目マスタの科目名は完全一致で参照。部分一致・あいまい一致は許容しない
検証方法存在しない科目名を含む予算レコードを投入し、RPA 起票がエラーを返すことを確認
現状ステータス充足 — CLAUDE.md の「未登録科目名はエラー・キーワード推測禁止」ルールを全 RPA で遵守

セキュリティ

NFR-S01: 認証(OAuth)

項目内容
カテゴリセキュリティ
シナリオ開発者が clasp を使用して GAS プロジェクトにコードをデプロイするとき
要件基準OAuth 2.0 による認証が必須であること。未認証状態でのデプロイが 不可能 であること
制約条件clasp OAuth トークンは定期失効(invalid_grant 等)。ブラウザ操作必要
検証方法clasp push 認証フロー + 失効時エラーメッセージ確認
現状ステータス充足 — clasp + OAuth2 (creds.json) 実装。GitHub Actions も同トークン使用

NFR-S02: データ暗号化

項目内容
カテゴリセキュリティ
シナリオ財務データがネットワーク上を転送される、またはストレージに保存されるとき
要件基準転送時 TLS 暗号化、保存時 AES-256 暗号化が適用されること
制約条件Google Cloud のインフラストラクチャに依存。カスタム暗号化レイヤーの追加は不可
検証方法Google Cloud セキュリティホワイトペーパーによる確認
現状ステータス充足 — Google Spreadsheet 標準のセキュリティ(保存時 AES-256、転送時 TLS)が自動適用

NFR-S03: ロールベースアクセス制御

項目内容
カテゴリセキュリティ
シナリオ経理担当者が GAS メニューから処理を実行するとき。PJ マネージャーが財務データを閲覧するとき
要件基準ユーザーの役割に応じて、実行可能なメニュー項目とアクセス可能なシートが制限されること
制約条件GAS にはネイティブな RBAC 機構がない。シート単位の共有権限(編集者/閲覧者)のみ利用可能
検証方法スプレッドシートの共有設定と保護シート設定の目視確認
現状ステータス部分充足 — シート共有レベルでの権限分離は可能だが、GAS メニューレベルのアクセス制御は未実装

現在のロールマッピング:

ロールGAS メニュー権限シート保護備考
Admin (代表)全メニュー実行可全シート編集可現在の唯一の運用者
経理担当 (将来)RPA/消込/マート更新20-30番台入力可、10s/40s以降は読取専用将来の組織拡大時に設定
PJマネージャーメニュー実行不可79タブ等の閲覧のみ

将来対応: GAS の onOpen トリガーで Session.getActiveUser() を取得し、ユーザーに応じてメニュー項目を動的に切り替える仕組みを検討。

NFR-S04: 行レベルアクセス制御

項目内容
カテゴリセキュリティ
シナリオPJマネージャーが自分の担当PJ以外の財務データにアクセスしようとするとき
要件基準ユーザーの担当PJに応じて、閲覧可能な行を動的にフィルタリングすること
制約条件Google Spreadsheet には行レベルのアクセス制御機構がない
検証方法
現状ステータス未対応 — 少人数運用のためスコープ外。10 名超 + PJ 間機密化が必要になった時点で対応

NFR-S05: 入力規則・列保護

項目内容
カテゴリセキュリティ
シナリオユーザーがスプレッドシート上で直接データを入力・編集するとき
要件基準入力列にプルダウン/数値制約/TRUE・FALSE 規則。自動計算列は上書き不可
制約条件入力規則は DDL (setupAllSchemas) で一括設定。手動個別設定禁止
検証方法DDL 実行後、各シートの入力規則が正しく設定されていることを確認
現状ステータス充足 — 入力=薄青/自動=薄灰で色分け。プルダウンは 15_mst_dict 参照。稼働率は 0〜1 制約

NFR-S06: 機密データ保護

項目内容
カテゴリセキュリティ
シナリオ給与データ(22_bud_headcount)やマイナンバー等の機密情報がシステムに含まれるとき
要件基準機密度の高いデータへのアクセスが必要最小限のユーザーに制限されること
制約条件スプレッドシート全体の共有設定は一律。シート単位の保護は可能だが、列・行単位の保護は不可
検証方法シート保護設定の確認。機密シート(22_bud_headcount 等)のアクセスログ確認
現状ステータス部分充足 — 22_bud_headcount 保護設定可。単一ユーザー運用で未設定。マイナンバーはシステム外管理

可用性

NFR-A01: GASサービス依存性

項目内容
カテゴリ可用性
シナリオGoogle のインフラストラクチャに障害が発生し、GAS または Spreadsheet が利用不可になるとき
要件基準Google Cloud の SLA (99.9%) に準拠すること。独自の冗長化は不要
制約条件GAS は Google Cloud に完全依存。オンプレミスやマルチクラウドの冗長化は現実的でない
検証方法Google Workspace Status Dashboard の監視
現状ステータス充足 — Google Cloud の SLA に依存。過去に重大な障害なし

NFR-A02: デプロイ手順の確立

項目内容
カテゴリ可用性
シナリオコード変更を本番環境にデプロイするとき
要件基準git commitclasp push → GAS 確認 → git push を厳守
制約条件GitHub Actions は master/dev push で自動 clasp pushdocs/** は対象外)
検証方法デプロイ手順書確認 + GitHub Actions ログ確認
現状ステータス充足 — CLAUDE.md にフロー明文化。自動デプロイ稼働

NFR-A03: ロールバック

項目内容
カテゴリ可用性
シナリオデプロイ後にバグが発見され、前バージョンに戻す必要があるとき
要件基準コード: git revert + clasp push で即時反映。データ: Spreadsheet 版歴から復元可
制約条件GAS にはネイティブなバージョニング機構がない。Git + clasp の組み合わせで代替
検証方法ロールバック手順のリハーサル
現状ステータス充足 — Git の履歴管理 + Spreadsheet の版歴で、コード・データの両方をロールバック可能

NFR-A04: バックアップ・リカバリ

項目内容
カテゴリ可用性
シナリオ誤操作によりスプレッドシートのデータが破損または削除されたとき
要件基準任意の過去時点の状態に復元可能であること
制約条件Google Spreadsheet の版歴は自動保存。独自のバックアップ機構は不要
検証方法版歴からの復元テスト
現状ステータス充足

バックアップ層:

レイヤー方法対象
データGoogle Spreadsheet 版歴(自動)全スプレッドシートデータ
コードGitHub (dev/master ブランチ)全 .js ファイル
仕様書GitHub docs/ ディレクトリ全 .md ファイル
インフラGoogle Cloud 冗長化(自動)GAS ランタイム + Spreadsheet ストレージ

保守性

NFR-M01: テストカバレッジ

項目内容
カテゴリ保守性
シナリオコード変更後にリグレッションの有無を確認するとき
要件基準主要フロー(RPA → Action A/B → マート更新)の統合テスト + 結果自動記録
制約条件GAS には標準テストフレームワーク無し。10_test_runner.js で独自実装
検証方法テスト実行後 90_test_results の PASS/FAIL 確認
現状ステータス部分充足 — 8 スイート T1-T8 / 50+ サブテスト。未カバー: マート個別出力 / エラーパス / 境界値

テストスイート一覧:

IDテスト名サブテスト数カバー範囲
T1HC RPA16給与INV生成、源泉税、社保、法定福利費
T2Action A10INV→TRN転記、ORD残高減算、STL自動作成
T3Action B8STL→TRN決済仕訳、INV残高更新
T4Datamart全諸表の集計検証
T5SaaS RPASaaS INV生成
T6CAPEX RPA設備投資INV生成(6イベント)
T7冪等性8RPA/Action A/B の二重実行防止
T8Pipeline RPA3パイプラインINV生成

NFR-M02: コードの凝集度・モジュール性

項目内容
カテゴリ保守性
シナリオ新しい RPA 種別や財務諸表を追加するとき
要件基準機能毎にファイル分離。依存は共有ヘルパー (00_constants / 02_helpers) 経由
制約条件GAS は読込順序依存。ファイル名の数字プレフィックスで制御
検証方法ファイル構成レビュー + 依存グラフ確認
現状ステータス充足 — 21 ファイル / 約 11,400 行。機能別分離(00-03/04/05/06/08/10)

NFR-M03: ドキュメント鮮度

項目内容
カテゴリ保守性
シナリオコード変更後に関連仕様書が最新の実装を反映していないとき
要件基準コード変更と同時に関連仕様書を更新すること。CLAUDE.md の「変更時の動作確認テスト」テーブルに準拠
制約条件ドキュメントはコードと同一リポジトリ (docs/) で管理
検証方法PR レビュー時にドキュメント更新の有無を確認
現状ステータス充足 — 37ドキュメント/約7,000行の仕様書群がコードと同一リポジトリで管理

NFR-M04: DDLスキーマ管理

項目内容
カテゴリ保守性
シナリオ新しい列を追加する、または既存列のヘッダー名を変更するとき
要件基準setupAllSchemas で全タブスキーマ一括同期。列の追加/並替が安全に実行可能
制約条件動的タブ(03/75-78/91-92/90)は DDL 対象外。28_bud_allocation D 列以降はクリアの可能性あり
検証方法DDL 実行後の全タブ目視 + RENAME_MAP フォールバック動作確認
現状ステータス充足 — setupAllSchemas がスキーマ同期、入力規則、色分け、書式設定、フィルターを一括管理

監査証跡

NFR-T01: 仕訳追跡(INV→TRN)

項目内容
カテゴリ監査証跡
シナリオ監査担当者が特定の仕訳 (TRN) がどの請求 (INV) から生成されたかを追跡するとき
要件基準INV の 自動仕訳JNL_ID 列に TRN_ID が記録され、双方向のトレーサビリティ が確保されていること
制約条件
検証方法任意の TRN_ID で INV を検索し、元の請求情報が特定可能であることを確認
現状ステータス充足 — Action A で INV.JNL_ID に TRN_ID 書戻 + TRN.管理 ID に INV_ID

NFR-T02: 決済追跡(STL→TRN)

項目内容
カテゴリ監査証跡
シナリオ決済仕訳がどの入出金明細から生成されたかを追跡するとき
要件基準STL の 自動仕訳JNL_ID 列に TRN_ID が記録されていること
制約条件
検証方法任意の決済 TRN_ID で STL を検索し、元の入出金情報が特定可能であることを確認
現状ステータス充足 — Action B で STL.自動仕訳JNL_ID に TRN_ID を書き戻し

NFR-T03: RPA起票元追跡

項目内容
カテゴリ監査証跡
シナリオINV がどの予算マスタ行から自動生成されたかを特定するとき
要件基準INV 摘要に RPA 種別タグ(【RPA:HC】/【RPA:SaaS】 等)+ 元データ識別情報を含める
制約条件
検証方法INV の摘要を読み取り、元の予算マスタ行が特定可能であることを確認
現状ステータス充足 — 全 RPA で摘要にタグ + 識別情報を自動挿入。ORD_ID による紐づけも併用

NFR-T04: 操作者追跡

項目内容
カテゴリ監査証跡
シナリオ誰がいつ Action A/B を実行したかを事後的に確認するとき
要件基準操作者のメールアドレス、操作日時、操作種別が記録されること
制約条件GAS の Session.getActiveUser().getEmail() で取得可能だが、現在未実装
検証方法
現状ステータス未対応MAS-008「監査証跡強化」で計画中。Action A/B 実行者の記録は未実装

将来計画 (MAS-008):

  • Session.getActiveUser().getEmail() を Action A/B に組み込み
  • 操作ログタブの新設(操作日時、操作者、操作種別、対象件数を記録)

NFR-T05: 仕訳レコード不変性

項目内容
カテゴリ監査証跡
シナリオAction A/B で生成された TRN レコードが事後的に改ざんされるリスクがあるとき
要件基準42_trn_journal のレコードは 作成後の更新・削除を禁止 すること(決済日_実績の更新を除く)
制約条件Spreadsheet のシート保護で列単位の書き込み禁止は可能。ただし管理者は回避可能
検証方法TRN シート保護設定 + コードレビュー(決済日更新は Action B のみ)
現状ステータス充足 — TRN 書込は Action A(新規)/ Action B(決済日更新)のみ。孤立 TRN 削除は管理者のみ

NFR-T06: 操作ログ

項目内容
カテゴリ監査証跡
シナリオシステム上で実行された全操作の履歴を時系列で確認するとき
要件基準主要操作(RPA / Action A/B / マート更新 / DDL)の実行日時・操作者・件数を記録
制約条件console.log は Apps Script ダッシュボードで閲覧可・保持期間制限あり
検証方法
現状ステータス未対応console.log/error のみ。構造化ログタブは MAS-008 / MAS-010 で対応予定

関連ドキュメント

ドキュメント関連する要件
ADR-0001: SSOTとしてのINVNFR-D01
ADR-0005: SpreadsheetをDBとして使用NFR-P01, NFR-P02, NFR-P05, NFR-S04
ADR-0008: スタースキーマ型データモデルNFR-D05, NFR-P05
spec_engine — 仕訳エンジンNFR-D02, NFR-D03, NFR-T01, NFR-T02, NFR-T05
spec_data_validation — データ整合性チェックNFR-D04
spec_nfr — 非機能要件(旧版)全要件の旧版
TODO_future — 追加開発案件NFR-T04 (MAS-008), NFR-T06 (MAS-008, MAS-010)