Blitz Report Excel Add-in Skills / General Ledger
Finish a Spreadsheet Server / GL Wand / GL Connect conversion
br-fsg-conversion-review
Finish a financial statement workbook converted from Spreadsheet Server, GL Wand or GL Connect to Blitz FSG: read its Conversion Log sheet, fix in the workbook what the converter could not (period cells read by other formulas, formula-driven format and segment cells, hierarchy suffixes, unsupported currency types, cells left unconverted), ask the user about the rest, and mark every log line.
When to use
Use when the user asks to review, finish, fix or check a converted Spreadsheet Server, GL Wand or GL Connect workbook, its conversion log, or "the warnings from the conversion". Edits the workbook only; never writes to Oracle EBS.
Install
Download br-fsg-conversion-review.zip
Claude in Excel: upload the zip under Customize > Skills > Create skill. Microsoft 365 Copilot in Excel: copy the skill folder into Documents/Copilot/Microsoft Excel/Skills in your OneDrive. Or install blitz-report-excel-addin-ai-skills in Claude Code and run /blitz-report-excel-addin-ai-skills:excel-skills-setup.
Requires Blitz Report and the Blitz Report Excel add-in, connected to your Oracle EBS instance.
Skill contents
SKILL.mdreferences/fixes.mdreferences/log-messages.md
SKILL.md
# Finish a Spreadsheet Server / GL Wand / GL Connect conversion (br-fsg-conversion-review) The Blitz Report add-in has already converted this workbook: every balance, period and segment description formula now uses the add-in's own functions, and what the converter could not finish is listed on the **`Conversion Log`** sheet (row 1 headers `Level | Cell | Message`, one line per issue, `Cell` is `<sheet>!<address>` or blank for a workbook-wide line). Your job is that list, nothing else. **Self-contained: read no other skill.** Each numbered Op is one workbook operation (Claude: one `execute_office_js` call; Copilot: one read or edit action). ## Rules 1. **Only what the log names.** Never rewrite a formula the log does not point at, never "tidy" a converted formula, and refresh balances only once the user says yes (Op 6). 2. **One confirmation before any edit.** Show every change as `cell: before -> after` and ask. A line that needs a business decision (which ledger, which currency, which values) is a question in that same message, never a guess. 3. **Every argument of a balance, period or description formula is a plain cell reference or a quoted literal** — the add-in reads them without Excel calculating. A computed value goes into a helper cell, and the formula points at that cell. Never put an expression inside these formulas. 4. **A helper cell must be empty** (read it first) and sit next to the cell it serves; tell the user where it went. 5. **Talk about periods, balances, segments, ledgers and cells** in the user's language. Never name the add-in's worksheet functions, this skill, or the log's internal wording. ## Op 1 — Read the log Read `Conversion Log` columns A:C (its whole used range). No such sheet: the conversion finished clean — say so and stop. Classify every line with `references/log-messages.md`: **Fix**, **Ask**, **Info**, or **Re-run** (the converter can finish it once the input is corrected). ## Op 2 — Read what the fixes need In one operation, read the formulas (not values) of every cell the Fix and Ask lines name, plus the cells those formulas point at that the fix procedure needs (period cells, format cells, the source cell of a period number). `references/fixes.md` says exactly what each procedure reads. ## Op 3 — Propose → confirmation One message, grouped: - **I will change** — per line: the cell, before -> after, one plain sentence why. - **I need your answer** — the Ask lines, each with the options the procedure lists. - **For your information** — the Info lines in one sentence each (no action). - **The converter can finish these** — Re-run lines: what to correct first (you may propose that correction above) and that they then run the Spreadsheet Server, GL Wand or GL Connect converter again on this workbook from the Blitz Report ribbon (Tools > Converter), which converts only what is still unconverted. Options: `Yes — make the changes` / `Change some first` / `Cancel`. Nothing is written before Yes. ## Op 4 — Apply Write the confirmed changes, one contiguous block per write (a comma-separated multi-area address is rejected; retry a rejected write once on that range, then move on). A formula written into a cell formatted as Text stays text: set that cell's number format to General first. ## Op 5 — Mark the log Write a `Status` heading in D1 of `Conversion Log` and, in one block write down column D, `Fixed`, `Needs you`, `Info` or `Run the converter again` for every line. Never delete log lines. ## Op 6 — Reply What was changed (cell by cell), what still needs the user (with the question), and an offer to calculate the balances now. On yes: in an empty cell of a new helper sheet `blitz_` write `=br_fsg_refresh_external()` and read its return in the same operation, replace that cell with plain text, then read `=_blitz_run_status` once per turn until it reads `DONE: ...` or `ERROR: ...` (a value read before your write is stale). Report the cells it names as still without an answer, then delete `blitz_`. The user can also refresh from the ribbon (Blitz Report > Refresh > Other > Workbook). If the user answered an Ask question, apply it in a further Op 4 + Op 5 round.
references/fixes.md
# Fix procedures
## The converted formulas (for reading them; never name them to the user)
- Balance: `br_balance(period, amount type, currency, currency type, balance type, budget,
encumbrance, ledger, movement, multiplier, , , segment 1, segment 2, ... segment 20)` - segment n
is argument 12+n.
- Period name: `br_period_name(year, period number, ledger, , )`.
- Period offset: `br_period_offset(period cell, n, range, adjustment, ledger)` = n periods after
that cell's period; with range `"Y"` it returns `first - last`, the periods from the cell's to the
nth, for a CTD balance.
- Segment description: `br_segment_description("segment name", value, ledger)`.
- A stored formula may carry a file prefix before the function (`'...Blitz Report.xlam'!br_balance(`,
`[1]!br_balance(`): keep it exactly as it is.
- Segment values: `a;b` list, `a-b` range, `~a` excluded, `%` wildcard; a parent value includes its
children. Amount types: PTD, QTD, YTD, CTD (CTD over a period range `first-last`). Currency type:
T = the ledger currency total, E = amounts entered in that currency.
- Every argument is a plain cell reference or a quoted literal; a computed value goes into a helper
cell. A helper cell is an empty cell next to the cell it serves (read it first); prefer the cell to
the right, then the one below.
When a reference moves to another cell, keep its `$` anchors (`$K$5` -> `$S$5`, `K$5` -> `S$5`) and
prefix the sheet (`'Sheet name'!`) when the target is on another sheet than the formula.
## P1 - A formula still reads a period cell as a number
The period cell (named in the message) now shows a period name; the formula (log `Cell`) expects the
period number it held before. Read both formulas.
1. Find where the number is now: the period cell's formula.
- `br_period_name(year, <ref>, ...)` with a cell reference: the number is in that cell. Replace
the formula's reference to the period cell with it.
- `br_period_name(year, "n", ...)` with a quoted number: write n into a helper cell, change that
argument from `"n"` to the helper (absolute, `$L$5`), and replace the formula's reference to
the period cell with the helper.
- `br_period_offset(<base>, n, ...)`: the number is the base cell's number plus n. Find the base
cell's number source as above and replace the reference with `(<source>+n)`.
- Two period calls joined by `&"-"&` (a range or a year to date): ask which number the formula
needs.
2. The period cell is read inside a range (`SUM(K5:K9)`), or the formula is an array formula: ask.
## P2 - Restore a period cell's own formula
The message shows the formula the period cell had (`=<formula>`) and the value it was replaced by.
Write that formula into a helper cell and change the period call's number argument (the quoted value)
to the helper, so the period follows it again.
## P3 - One cell, two meanings
List the converted formulas that read the cell (search the formulas for its address). Offer a second
cell beside it holding the other value, and point the formulas that need the other meaning at it.
Never change which value the first group reads.
## P4 - Format cell / amount type
Spreadsheet Server format -> amount type: PER -> PTD, LTD -> YTD, QTR or DQTR -> QTD (the period
becomes the quarter's last period), YTD or RANGE -> CTD over a period range.
- Formula-driven format cell that only switches among PER, LTD, QTR and DQTR, and the user wants it
to keep driving the balances: helper cell next to it with
`=IFERROR(INDEX({"PTD","YTD","QTD","QTD"},MATCH(<format cell>,{"PER","LTD","QTR","DQTR"},0)),<format cell>)`,
then replace the quoted amount type (argument 2) in each balance formula that came from that
format cell (same row or column as the log `Cell`) with the helper.
- YTD or RANGE also change the period: leave the literal and explain.
- Unknown format: ask what it means, then write the amount type it maps to.
## P5 - Currency type E or T on a ledger this instance does not have
Ask: "Is <C> the ledger currency of <L>?" Yes -> T: write `T` into the cell the balance's argument
4 reads (it changes every balance reading that cell), or replace the quoted `"E"` in that formula.
No -> leave E. Unknown type -> ask what it stands for.
## P6 - Reporting currency (M) or a translated currency
Blitz FSG reads a reporting currency from its reporting ledger. Ask for that ledger's name; set the
balance's ledger (argument 8, or the cell it reads) to it and the currency type to T. Without a
reporting ledger there is no equivalent: mark Needs you.
## P7 - Hierarchy value with a segment suffix
A Spreadsheet Server hierarchy value is `<parent value>_<Segment_Name>` (`1000_Natural_Account` =
parent 1000 of segment "Natural Account"). The converter strips the suffix only on an instance that
has the ledger. Recommend converting on such an instance. If the user instead confirms the segment
name, strip `_<Segment_Name>` from every value of that segment: the values sit in the segment cells
the balance formulas read (argument 12+n), often several `;`-separated in one cell. Show before/after
per cell; never strip a suffix that differs from the confirmed one.
## P8 - Formula-driven segment value
Keep the formula; rewrite the Spreadsheet Server syntax inside its quoted text only: drop `[` and `]`,
list separator `,` -> `;`, range `.` -> `-`, exclusion `/` -> `~`, `*` -> `%`, drop a leading `^^`
(and its suffix, P7). Use the delimiters the batch line names when the log has one.
## P9 - Segment list (`^list`) or field (`@field`)
These have no Blitz Report equivalent. Ask for the values the list held and write them `;`-separated
into the cell.
## P10 - Let the converter finish
Correct the input first, then the user runs the converter again on this workbook (Blitz Report ribbon
> Tools > Converter > Spreadsheet Server, GL Wand or GL Connect). It converts only the formulas still in the
old form, and writes a new Conversion Log sheet for what remains.
- An argument that is an expression, or a period argument that is not a cell: move the expression
into a helper cell and point the argument at it.
- "the segment names of ledger <L> are not loaded": choose <L> in the ribbon's Ledger box on that
sheet first.
- "period <n> of <year> not found": ask for the period the user means.
- "balance type P (project) is not supported": no equivalent, Needs you.
- GL Wand "not loaded" / "names none": log in, or choose the ledger on the ribbon, first.
- "could not be written": the sheet is protected or the cell is part of an array formula; unprotect
it first.
## P11 - Balance type cell is empty
The formula reads its balance type (A actual, B budget, E encumbrance) from a cell that is empty,
usually a spare column of the template; Spreadsheet Server returned nothing for it. List the columns
affected (one cell names them all) and ask:
- it should read a balance type: write that letter into the named cell (one cell serves the whole
column), then let the converter finish (P10);
- the column is unused: clear its unconverted formulas, after the user confirms.
## P12 - GL Wand ledger id
GL Wand names a ledger by its id on this instance. The call stays in GL Wand form.
- "is not one of the ledgers your responsibilities offer": ask which ledger the id stands for. The
user runs the converter again under a responsibility that offers it (P10).
- "names several ledgers": one Blitz Report balance reads one ledger. Ask whether the ledgers share
currency and chart of accounts; if so, offer one GL Wand formula per ledger id added with `+`, then
P10. Otherwise mark Needs you.
## P13 - No Blitz Report equivalent
The call stays as it was: GL Wand combination (`USE_SEGn`) or flexfield (`{n:value}`) criteria, a
GL Wand function the converter does not know, a Spreadsheet Server GXE, GXC, GEXD or GPX function.
- A criterion: ask which segment values it selects, write them `;`-separated into the segment cell
or argument, then P10.
- GXE (expand to detail): the converted sheet does this with FSG Discover or Expand; offer to clear
the cell after the user confirms.
- Anything else: mark Needs you.
## P14 - GL Connect layout
GL Connect publishes no function reference: the converter knows the layout of `GLC_GetBalance` from
a saved workbook and the fields of the product's dialogs. Argument 3 is the actual flag, 4 the
currency, 5 the period type, 6 the budget or encumbrance name, 7 the entered flag, 8 debits/credits,
9 to 23 the segments in display order, 24 to 26 numbers that were 0. Refused calls stay in GL Connect
form and show `#NAME?` until they are finished.
- Arguments 24 to 26 other than 0: ask what the cell shows in GL Connect. A period offset or trailing
months has no argument in a Blitz Report balance: offer one cell per period, each pointing at its own
period cell, added with `+`. Clear the numbers to 0 once that is done, then P10.
- A flag or argument count the converter does not know: show the user the whole formula and mark Needs
you. The positions may differ from the layout above, and only the user can compare the cell's old
value.
- `check that it selects the same accounts`, `check one balance`, `check the first result`: name the
cell and ask the user to compare its refreshed value with the value the workbook showed in GL Connect.
A criterion that came out wrong is rewritten with `;` between values, `-` for a range and `~` before
an excluded value.
- `the segments of ledger <L> are not on this instance`: the balances read the wrong segments until
the user converts again under a responsibility that offers <L> (P10).
## P15 - GL Connect accounted or entered amounts
GL Connect's entered flag has no exact counterpart, so each conversion is named in the log.
- `accounted balances in <C>`: currency type C gives the ledger currency value of the journals entered
in <C>. Ask whether the column should show that, or the amounts in <C> themselves (write E in its
currency type argument or cell).
- `entered flag E on <C>`: type T is the ledger total. Ask whether the column should show only the
journals entered in <C> (write E).references/log-messages.md
# Conversion Log messages
`Message` texts as the converters write them (`<...>` = a variable part). Match on the fixed words.
**Class**: Fix = you can correct it after the confirmation; Ask = needs the user's answer first;
Info = nothing to change; Re-run = correct the input if needed, then the user runs the converter
again on this workbook. **Proc** = the procedure in `fixes.md`.
## Spreadsheet Server
| Message | Class | Proc |
|---|---|---|
| `reads the period number from <cell> instead of the period cell <cell>` | Info — the converter already repointed this formula; check it shows the period number it showed before | — |
| `uses the period cell <cell>, which now holds the period name instead of the period number` | Fix | P1 |
| `uses the period cell <cell> and could not be rewritten: <error>` | Fix (an array formula: rewrite the whole array range) | P1 |
| `period cell <cell> formula =<formula> replaced by its value <n>` | Fix | P2 |
| `period cell <cell> is shared by formulas with different formats or ledgers (...), converted for the first` | Ask | P3 |
| `period cell <cell>: <format> <value> embedded as literal period numbers, the link to <cell> is not kept` | Info (a quarter or range period no longer follows that cell; P2 restores it on request) | P2 |
| `literal period <p> resolved to "<name>" at conversion time` | Info (the period is fixed text; offer a period cell only if the user wants it to roll) | — |
| `format cell <cell> is formula-driven, amount type <type> embedded as a literal` | Ask | P4 |
| `unknown format '<f>' left unchanged` | Ask | P4 |
| `translation type E kept, ledger <L> is not on this instance; change it to T where <C> is that ledger's currency` | Ask | P5 |
| `T with <C> on ledger <L> returns that ledger's own currency total, verify <C> is its currency` | Ask (confirm only) | P5 |
| `translated balances in <C> are not supported, T returns the ledger currency total` | Ask | P6 |
| `translation type M (multiple reporting currencies) has no Blitz Report equivalent` | Ask | P6 |
| `unknown translation type '<t>'` | Ask | P5 |
| `key data cell <cell> is formula-driven, its values are embedded as literals` | Info | — |
| `key data <name>=<value> has no Blitz Report equivalent and is ignored`, `key data <name> is ignored` | Info | — |
| `hierarchy value <v> keeps its segment suffix, segment <n> of ledger <L> is not on this instance` | Ask, recommend Re-run | P7 |
| `hierarchy value <v> does not end with <suffix>, the segment name of ledger <L>, and is kept as is` | Ask | P7 |
| `hierarchy values are converted to parent values, the refresh reports an unknown one as invalid` | Info | — |
| `segment value <v> in <cell> is formula-driven and needs manual conversion` | Fix | P8 |
| `segment list or @ field <v> in <cell> has no Blitz Report equivalent` | Ask | P9 |
| `single character mask <v> only applies together with a % wildcard` | Info | — |
| `numeric cell <cell> displays <text> but holds <value>, converted from the stored value` | Info (check the value) | — |
| `<cell> is used as <a> and <b>, converted as <a>` | Ask (the cell feeds two different parameters; offer a second cell for <b>) | P3 |
| `<list> of ledger <L> could not be read: <error>` | Info | — |
| `balance type <cell> is empty` (level Error) | Ask | P11 |
| `<FUNCTION> has no Blitz Report equivalent; use FSG Expand or Drilldown` (level Error, GXE, GXC, GEXD or a GPX function) | Ask | P13 |
| Any other level `Error` (the cell still holds the Spreadsheet Server formula) | Re-run | P10 |
## GL Wand (level Error unless noted)
| Message | Class | Proc |
|---|---|---|
| `left unconverted: segment descriptions need the ledger's segment names, which are not loaded - log in and convert again` | Re-run (log in first) | P10 |
| `left unconverted: glw_set_of_books_name needs the statement's ledger, and the sheet names none` | Re-run (choose the ledger on the ribbon first) | P10 |
| `left unconverted: a segment description whose segment number is not a literal number` | Fix, then Re-run | P10 |
| `left unconverted: a segment description names segment <n>, which the ledger's chart of accounts does not carry` | Ask | — |
| `left unconverted: a GL Wand call could not be parsed` | Re-run after correcting the syntax | P10 |
| `left unconverted: ledger ids need your ledger list, which is not loaded - log in and convert again` | Re-run (log in first) | P10 |
| `left unconverted: ledger id <n> is not one of the ledgers your responsibilities offer`, `parameter cell: ledger id <n> is not one of ...` | Ask | P12 |
| `left unconverted: the ledger argument <ids> names several ledgers, which one Blitz Report balance cannot read - split the formula per ledger` | Ask | P12 |
| `left unconverted: GL Wand combination criteria (USE_SEGn) and flexfield criteria ({n:value}) have no Blitz Report equivalent`, also with the parameter cell named after `left unconverted:` | Ask | P13 |
| `left unconverted: no Blitz Report equivalent for <functions>` | Ask | P13 |
| `the independent value <v> is not used, a dependent value is described without its parent` (level Warning) | Ask (confirm only: the description is right unless the value exists under several parents) | — |
| `could not be written: <error>`, `parameter cell could not be written: <error>` | Re-run (unprotect the sheet first) | P10 |
## GL Connect
A level `Error` line leaves the cell's GL Connect formula as it was. GL Connect publishes no function
reference, so the converter refuses a call it cannot read rather than guess.
| Message | Class | Proc |
|---|---|---|
| `GLC_GetBalance has <n> arguments instead of the 26 this converter knows` (level Error) | Ask | P14 |
| `GLC_GetBalance arguments 24 to 26 are <a>,<b>,<c>: a value other than 0 may be a period offset or trailing months, which is not converted` (level Error) | Ask | P14 |
| `entered flag '<v>' is not A or E`, `debits/credits flag '<v>' is not N, D or C`, `actual flag '<v>' is not A, B or E` (level Error) | Ask | P14 |
| `the period type is empty` (level Error) | Ask | P14 |
| `segment position <n> is set and ledger <L> has <m> segments` (level Error) | Ask | P14 |
| `'<argument>' is neither a cell reference nor a literal` (level Error) | Fix, then Re-run | P10 |
| `segment <name> is not in the chart of accounts of ledger <L>` (level Error) | Ask | P14 |
| `the segment names of ledger <L> are not loaded, log in and convert again` (level Error) | Re-run (log in first) | P10 |
| `<FUNCTION> has no Blitz Report equivalent; use FSG Expand or Drilldown` (level Error) | Ask | P13 |
| `could not be written: <error>`, `parameter cell could not be written: <error>` (level Error) | Re-run (unprotect the sheet first) | P10 |
| `segment criterion <v> converted to <w>, check that it selects the same accounts` | Ask (confirm only: a hyphen in GL Connect excludes a value, it is no range) | P14 |
| `the segments of ledger <L> are taken in display order, which differs from their column order; check one balance` | Ask (confirm only) | P14 |
| `the segments of ledger <L> are not on this instance, their positions are taken as the segment columns` | Ask, recommend Re-run | P14 |
| `<function> was converted from the fields of its dialog (...), check the first result` | Ask (confirm only) | P14 |
| `accounted balances in <C> on ledger <L> are converted to currency type C, the <D> value of journals entered in <C>` | Ask | P15 |
| `entered flag E on <C>, the currency of ledger <L>, is converted to currency type T, the ledger total; use E where only the journals entered in <C> are wanted` | Ask | P15 |
| `translation type E kept, ledger <L> is not on this instance; change it to T where <C> is that ledger's currency` | Ask | P5 |
| `T with <C> on ledger <L> returns that ledger's own currency total, verify <C> is its currency` | Ask (confirm only) | P5 |
| `the budget or encumbrance name <v> of an actual balance is ignored` | Info | — |
| `argument <n> of GLC_GetSegmentDesc, <v>, is ignored` | Info | — |
| `the computed argument <v> is kept, check that it yields a Blitz Report value` | Fix | P8 |
| `cell <cell> is formula-driven, <value> embedded as a literal` | Info | — |
| `unknown period type '<t>' left unchanged` | Ask | P4 |
| `numeric cell <cell> displays <text> but holds <value>, converted from the stored value` | Info (check the value) | — |
| `<cell> is used as <a> and <b>, converted as <a>` | Ask (the cell feeds two different parameters; offer a second cell for <b>) | P3 |
## Batch lines (no cell)
| Message | Class |
|---|---|
| `the formulas name ledger <L>, which your responsibilities do not offer; the workbook is bound to <D>` | Ask: convert again under a responsibility that offers <L>, or confirm <D> |
| `period or segment values use characters other than the delimiters <d> chosen for this batch; check the converted values` | Ask: which range, list and exclusion characters this workbook uses; then P8 on the affected values |
| `The conversion stopped: <error>` | Re-run |