1. 基本情報

焦点質問: 臨時経費・その他費用からどのようなINVを生成するか?

26_bud_adhoc(単発予算マスタ)の各有効行に対し、科目名・発生日・税込金額を検証したうえで 1行1INV を 32_wrk_invoice へ一括起票 する。HC/SaaS/CAPEXと異なり月次ループは行わず、対象月指定も不要。ORD自動作成は行わない(手動紐づけ)。申請種別は決済手段キーワードから自動判定される。

項目内容
関数名generateAdhocInvoices(targetOverride, _silent)
ファイル401_bat_rpa.js
入力26_bud_adhoc
出力32_wrk_invoice(末尾追記)。ORD 自動作成なし
メニュー「📒 経理業務 > 📥 単発経費の自動起票」
一括実行generateAllRpaInvoices から generateAdhocInvoices(null, true) で呼出

2. 前提条件・依存関係

項目内容
SSOT32_wrk_invoice(起票先・重複チェック用)
入力元タブ26_bud_adhoc
マスタ依存11_mst_account(writeInvRows_ 内で諸表区分・大分類を科目マスタから自動付与)
前提有効フラグ=TRUE の行のみ処理対象。空セル・未定義値は FALSE 扱い
前提科目名・発生日・税込金額(税抜+消費税の再計算値)がすべて有効であること
重複制御摘要 【RPA:Adhoc】{mgrId} {取引名}isDuplicate_() 判定 → 既存時 SKIP
ヘルパーbuildInvRow_, writeInvRows_, isDuplicate_, generateInvId_
後続処理Action ATRN/STL 自動作成 → Action B消込・決済仕訳

3. 入力スキーマ

26_bud_adhoc カラム定義

DDL定義元: 101_sys_config.jsBUD_ADHOC

#カラム名入力/自動説明制約
1A有効フラグcheckbox入力FALSE→SKIP空セルもFALSE扱い。プルダウン=TRUE/FALSE
2B管理IDstring自動(RPA)ADH_NNNN(空なら自動発番)空の場合RPAが全行スキャン最大番号+1で自動採番
3C取引名string入力PC購入、出張費等。摘要に転記
4D取引先名string入力(pulldown)INV Rowに転記プルダウン=UI取引先名(E列)
5E科目名string入力(pulldown)INV Rowに転記。11_mst_accountに未登録の科目はエラープルダウン=UI科目名(F列)
6F税抜金額_計画number入力INV生成時に taxExcl + taxAmt で税込を再計算#,##0書式
7G消費税額_計画number入力0も可(対象外の場合)#,##0書式
8H税込金額_計画number自動(数式)=F+G (DDL設定の数式)。コード上はF+Gを再計算して使用#,##0書式。DDL自動設定
9I税区分string入力(pulldown)空の場合「対象外」をデフォルトプルダウン=UI税区分(B列)
10J発生日(P/L計上日)date入力日付型→そのまま使用。YYYY-MM文字列→月末日に変換yyyy-mm-dd書式。空→SKIP
11K収支区分string入力(pulldown)支出/収入。空の場合「支出」をデフォルトプルダウン=UI収支区分(A列)
12L決済手段string入力(pulldown)申請種別の自動判定に使用プルダウン=UI決済手段(C列)
13M決済ラグ(月)number入力0=当月。全角数字→半角自動変換
14N支払基準日number入力日(1-31)。0=月末。月末日より大きい場合キャップ
15OPJstring入力(pulldown)INV Rowに転記。空の場合 buildInvRow_ がデフォルト「指定なし_共通費など」を設定プルダウン=UIPJ名(H列)
16P組織名string入力(pulldown)INV Rowに転記プルダウン=UI組織名(G列)
17Q備考string入力自由記述。INVには転記されない

4. 処理ロジック(マトリクス)

共通INVフィールド(buildInvRow_ が自動設定): 有効フラグ=true, 請求ID=INV_YYYYMMDD_NNNN(自動発番), 起票日時=now, 起票者="RPA自動起票", 請求ステータス="未処理", 通貨="JPY", 未決済残高=税込金額_計画

HC/SaaSとの違い: Adhocは月次ループなし・対象月指定なし・ORD自動作成なし。1入力行あたり1INVのみ生成。

項番処理フェーズ入力(論理名)入力(物理名: タブ.列)処理詳細 / 変換ロジック出力(論理名)出力(物理名: タブ.列)例外処理
S1.1初期化: シート取得26_bud_adhoc32_wrk_invoice を取得adhocSheet, invSheet⚠️ 26タブ未検出 → ui.alert で中断
S1.2初期化: データ読込全行データ26_bud_adhoc, 32_wrk_invoiceヘッダー行をパースし col マップを構築。INV全行も読込(重複チェック用)adhocData, invData, col変数⚠️ データ1行以下 → ui.alert("Adhocデータがありません") で終了
S1.3初期化: 管理ID最大値取得管理ID26_bud_adhoc.B列全行スキャンし ADH_ プレフィックスの最大番号を取得mgrIdMax変数: mgrIdMax
S2.1ループ開始26_bud_adhoc 全行FOR EACH 行 — 以下を各行に対して実行
S2.2スキップ判定①有効フラグ26_bud_adhoc.A列!== true かつ String().toUpperCase() !== 'TRUE'SKIP⚠️ 空セル・未定義値もFALSE扱い
S2.3管理ID自動発番管理ID26_bud_adhoc.B列空 → ADH_ + (mgrIdMax+1) を4桁ゼロ埋め(padStart)で付与。adhocUpdates に書き戻し情報を蓄積管理ID26_bud_adhoc.B列 (書き戻し予約)
S3.1変数: 基本情報取得取引名〜備考26_bud_adhoc.C〜Q列各列から文字列/数値を String().trim() / Number() || 0 で取得各変数変数: txnName, vendorName, accName, taxExcl, taxAmt, totalIncTax 等⚠️ 収支区分空→'支出'。⚠️ 税区分空→'対象外'
S3.2変数: 税込金額再計算税抜金額_計画, 消費税額_計画26_bud_adhoc.F列, G列totalIncTax = taxExcl + taxAmt で再計算(H列の数式値は使わない)totalIncTax変数
S3.3スキップ判定②発生日, 科目名, 税込金額26_bud_adhoc.J列, E列, 変数occurYmが空 OR 科目名が空 OR totalIncTax === 0SKIP※1
S3.4変数: 発生日決定発生日(P/L計上日)26_bud_adhoc.J列parseDateToYm() で YYYY-MM を取得。日付型(Date)ならそのまま使用。YYYY-MM文字列なら月末日(new Date(year, month, 0))に変換occurDate変数: occurDate (Date)⚠️ 日付でもYYYY-MMでもない文字列 → parseDateToYm が null → S3.3でSKIP
S3.5変数: 決済日_計画算出決済ラグ(月), 支払基準日, 発生日26_bud_adhoc.M列, N列ラグ文字列を全角→半角変換しパース。支払基準日 > 0 なら 発生月 + ラグ月の支払基準日(月末日キャップ)。支払基準日 = 0 なら 発生月 + ラグ月の月末日決済日_計画変数: settleDate (Date)⚠️ 全角数字→半角変換(charCodeAt - 0xFEE0)。⚠️ 支払基準日 > 月末日 → Math.min でキャップ
S4.1重複チェック摘要32_wrk_invoice.摘要列isDuplicate_()"【RPA:Adhoc】{mgrId} {取引名}" を完全一致検索 → 存在すれば SKIP
S4.2申請種別の自動判定決済手段26_bud_adhoc.L列判定順序(先勝ち): ①振込含む→"手動振込"クレカor振替含む→"自動引落"立替含む→"経費精算(社員立替)" ④その他→"請求書受領(AP)"appType変数: appType※2
S4.3INV行生成全変数buildInvRow_ で INV行を構築。PJ名が空の場合は "指定なし_共通費など" がデフォルト設定されるINV行drafts配列に追加
W1.1一括書き込み: INVdraftswriteInvRows_() で 32タブ末尾に追記。諸表区分・大分類を loadAcctMapForRpa_() 経由で科目マスタから自動付与32_wrk_invoice
W1.2管理ID書き戻しadhocUpdates自動発番したIDを adhocSheet.getRange(r, c).setValue(val) で 26タブに個別書き戻し26_bud_adhoc.B列

脚注:

  • ※1: 仕様上は 税込金額_計画=0 だが、コード上は totalIncTax = taxExcl + taxAmt で再計算した値が0かチェック(H列の数式値ではなくF+Gの合計)
  • ※2: 判定順序が重要。振込クレカ/振替立替の順。例: "口座振替_福井銀行"振替を含むので"自動引落""立替振込"振込が先にマッチするので"手動振込"

5. 出力サマリー

生成される INV 行

Adhoc RPAは1入力行あたり最大1行のINVを生成する(HC RPAのような派生Rowは発生しない)。

出力フィールド値の決定方法ソース
有効フラグtrue (固定)
請求ID(INV)INV_YYYYMMDD_NNNNgenerateInvId_ 自動発番
起票日時実行時刻new Date()
起票者"RPA自動起票" (固定)
申請種別決済手段キーワードから自動判定S4.2 参照
発生日(P/L計上日)入力日付 or YYYY-MM→月末日26_bud_adhoc.J列
決済日_計画発生月+ラグ月の支払基準日 or 月末日S3.5 参照
請求ステータス"未処理" (固定)
収支区分入力値。空→"支出"26_bud_adhoc.K列
取引先名入力値をそのまま転記26_bud_adhoc.D列
PJ名入力値。空→"指定なし_共通費など"26_bud_adhoc.O列
科目名入力値をそのまま転記26_bud_adhoc.E列
税区分入力値。空→"対象外"26_bud_adhoc.I列
通貨"JPY" (固定)
税抜金額_計画入力値26_bud_adhoc.F列
消費税額_計画入力値26_bud_adhoc.G列
税込金額_計画taxExcl + taxAmt (再計算)F列 + G列
未決済残高(自動計算)totalIncTax と同値
決済手段入力値をそのまま転記26_bud_adhoc.L列
組織名入力値をそのまま転記26_bud_adhoc.P列
摘要【RPA:Adhoc】{mgrId} {取引名}26_bud_adhoc.B列 + C列
諸表区分科目マスタから自動付与11_mst_account
大分類科目マスタから自動付与11_mst_account

6. 業務ルール

6.1 Adhoc RPAの位置づけ

Adhoc RPAは、HC・SaaS・CAPEX・FINのいずれにも該当しない 臨時経費・その他費用 を一括起票するための汎用RPAである。月次の繰返しではなく、1行1回限りの単発起票を前提とする。

6.2 HC/SaaS/CAPEX/FIN との違い

項目HC/SaaS/CAPEXFINAdhoc
対象月指定必要必要不要(全行一括)
月次ループありなしなし
ORD自動作成ありありなし(手動紐づけ)
最終起票年月日ありありなし(単発のため不要)
申請種別固定値固定値決済手段キーワードから自動判定(S4.2参照)
PJ名・組織名デフォルト値デフォルト値入力値をそのまま反映
消費税内税/なしなし税抜+消費税を個別入力(F列+G列)
収支区分固定(支出)入力入力値を反映(支出/収入)

6.3 申請種別の自動判定ルール

決済手段の文字列に含まれるキーワードで申請種別を先勝ちで判定する。

優先順決済手段に含むキーワード判定結果(申請種別)
1振込手動振込口座振込、銀行振込
2クレカ or 振替自動引落クレカ決済、口座振替_福井銀行
3立替経費精算(社員立替)社員立替
4上記以外請求書受領(AP)現金、その他

注意: 判定は String.includes() による部分一致で、先勝ちの if-else 構造。立替振込 は「振込」が先にマッチするため「手動振込」と判定される。

6.4 税込金額の算出

税込金額_計画 = 税抜金額_計画 + 消費税額_計画 — totalIncTax = taxExcl + taxAmt

コード上はH列の数式値(=F+G)を参照せず、F列+G列を直接再計算して使用する。これにより数式の破損・未反映があっても正しい値でINVを生成できる。

6.5 決済日_計画の算出

決済日_計画 = 発生月 + 決済ラグ月 の 支払基準日 — settleDate

  • 支払基準日 > 0: 当該月の指定日(月末日を超える場合はキャップ)
  • 支払基準日 = 0 or 未指定: 当該月の月末日

6.6 PJ名のデフォルト

buildInvRow_ 内で PJ名が空の場合は "指定なし_共通費など" が自動設定される。これはAdhoc固有ではなく全RPA共通の挙動である。


7. 冪等性(二重起票防止)

保証項目メカニズム詳細
INV重複防止isDuplicate_()摘要 【RPA:Adhoc】{mgrId} {取引名} を 32_wrk_invoice の有効行(有効フラグ=TRUE)から完全一致検索。一致すればSKIP
管理ID一意性ADH_NNNN 自動発番全行スキャンで最大番号を取得し +1 で採番。4桁ゼロ埋め
請求ID一意性generateInvId_()INV_YYYYMMDD_NNNN 形式。同一日付内でオフセットにより一意性を保証

再実行時の挙動: 同一データで2回実行した場合、全行が重複チェックによりSKIPされ、起票件数=0となる。ただし、管理IDが書き戻された後に26タブの取引名を変更すると、摘要が異なるため二重起票される可能性がある。


8. エラーハンドリング

エラー条件処理ユーザー通知
26_bud_adhoc タブが存在しない処理中断ui.alert("🚨 26_bud_adhoc が見つかりません。")
データが0行(ヘッダーのみ)処理中断ui.alert("✅ Adhocデータがありません。")
有効フラグ=FALSE行スキップ(正常動作)通知なし
科目名が空行スキップ(正常動作)通知なし
発生日が空 or パース不可行スキップ(parseDateToYm が null を返す)通知なし
税込金額(再計算)=0行スキップ(正常動作)通知なし
重複検出(摘要一致)行スキップ(正常動作)通知なし
全角数字の決済ラグ半角変換して処理続行通知なし
支払基準日 > 月末日Math.min で月末日にキャップして処理続行通知なし
起票対象なし(全行スキップ)正常終了ui.alert("✅ 起票対象なし — 新たに起票すべきAdhocはありませんでした。")
起票成功正常終了ui.alert("🎉 Adhoc起票完了 — N件 のINV行を生成しました。")
予期しない例外try-catch で捕捉ui.alert("🚨 generateAdhocInvoices でエラーが発生しました — {e.message}")
_silent=true(一括実行経由)ダイアログ非表示通知なし(戻り値で件数を返却)

9. テスト仕様

テストIDテスト名前提条件期待結果
T1立替精算の経費決済手段=「社員立替」申請種別=経費精算(社員立替)
T2口座振込の支払決済手段=「口座振込」申請種別=手動振込
T3クレカ決済決済手段=「クレカ決済」申請種別=自動引落
T4口座振替決済手段=「口座振替_福井銀行」申請種別=自動引落(「振替」にマッチ)
T5決済手段が「その他」決済手段=「現金」申請種別=請求書受領(AP)
T6管理ID空欄B列が空ADH_NNNN が自動付与され、26タブに書き戻し
T7日付型の発生日J列=2026-04-15(Date型)INVの発生日=2026-04-15
T8YYYY-MM形式の発生日J列=「2026-04」(文字列)INVの発生日=2026-04-30(月末日)
T9PJ名指定ありO列=「PJ_Alpha」INVのPJ名=PJ_Alpha
T10PJ名未指定O列=空INVのPJ名=指定なし_共通費など
T11同データで2回実行1回目で起票済2回目は重複スキップ(0件)
T12B/S科目(工具・器具)科目名=「工具・器具」INV生成OK(諸表区分=BS、大分類=資産が自動付与)
T13科目名空欄E列=空行スキップ
T14税込金額=0F列=0, G列=0行スキップ
T15有効フラグ=FALSEA列=FALSE行スキップ
T16決済ラグ=全角数字M列=「2」半角変換され、ラグ2ヶ月で決済日算出
T17支払基準日>月末日N列=31, 発生月=2月支払基準日=28(or 29)にキャップ
T18収支区分=収入K列=「収入」INVの収支区分=収入

付録

付録A: 変更履歴

日付変更内容
2026-04-12 16:06Template A に準拠しリライト。コードリーディングに基づき §2前提条件、§5出力サマリー、§7冪等性、§8エラーハンドリングを新規追加。§6に業務ルール統合

付録B: 関連仕様書

  • spec_engine — Action A / Action B(後続の仕訳転記・消込処理)
  • spec_rpa_hc — HC RPA(月次ループ・派生Row・ORD自動作成あり)
  • spec_rpa_saas — SaaS RPA(月次ループ・ORD自動作成あり)
  • spec_rpa_finance — FIN RPA(申請種別固定・ORD自動作成あり)