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)"]] — never range.values for derived cells. No separate recalc; Excel computes natively. Use context.workbook.worksheets.getItem(...) to navigate tabs.
  • If generating a standalone .xlsx file: Use Python/openpyxl. Write ws["D15"] = "=D14*(1+Assumptions!$B$5)", then run recalc.py before delivery.
  • Office JS merged cell pitfall: Do NOT call .merge() then set .values on the merged range — throws InvalidArgument because 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.
Related skills

More from anthropics/financial-services-plugins

Installs
502
GitHub Stars
20.6K
First Seen
Mar 9, 2026