3-statement-model
Installation
SKILL.md
3-Statement Financial Model Template Completion
Complete and populate integrated financial model templates with proper linkages between Income Statement, Balance Sheet, and Cash Flow Statement.
⚠️ CRITICAL PRINCIPLES — Read Before Populating Any Template
Environment — Office JS vs Python:
- If running inside Excel (Office Add-in / Office JS): Use Office JS directly. Write formulas via
range.formulas = [["=D14*(1+Assumptions!$B$5)"]]— neverrange.valuesfor derived cells. No separate recalc; Excel computes natively. Usecontext.workbook.worksheets.getItem(...)to navigate tabs. - If generating a standalone .xlsx file: Use Python/openpyxl. Write
ws["D15"] = "=D14*(1+Assumptions!$B$5)", then runrecalc.pybefore delivery. - Office JS merged cell pitfall: Do NOT call
.merge()then set.valueson the merged range — throwsInvalidArgumentbecause the range still reports its pre-merge dimensions. Instead write value to top-left cell alone, then merge + format the full range:ws.getRange("A1").values = [["INCOME STATEMENT"]]; const h = ws.getRange("A1:G1"); h.merge(); h.format.fill.color = "#1F4E79"; - All principles below apply identically in either environment.
Formulas over hardcodes (non-negotiable):
- Every projection cell, roll-forward, linkage, and subtotal MUST be an Excel formula — never a pre-computed value
- When using Python/openpyxl: write formula strings (
ws["D15"] = "=D14*(1+Assumptions!$B$5)"), NOT computed results (ws["D15"] = 12500) - The ONLY cells that should contain hardcoded numbers are: (1) historical actuals, (2) assumption drivers in the Assumptions tab
- If you find yourself computing a value in Python and writing the result to a cell — STOP. Write the formula instead.
- Why: the model must flex when scenarios toggle or assumptions change. Hardcodes break every downstream integrity check silently.