Optionaloptions: RenderCellRangeOptionsThis is where the values live. A sheet report says where the blocks are; this reads one. Values belong at this altitude and not the one above precisely because the caller named the bounds — a sheet has no bound but its size.
It is also where the stats live, by default. The same per-series counts, types and
aggregates a Contentful region's profile computes are computed here directly over the named
range — see appendProfile — so reading a range and understanding its shape is one call,
not a values read followed by a separate getStats().
It does not repeat the feature partitions. A sheet report is already that map over the
whole used range, so listing them again inside a rectangle carved out of it says the same
thing twice at a narrower scope. The one who wants a partition of this range asks for it —
getRegions on the range is the call, and it is one expression.
ICellRange is the live handle: it knows its sheet, so its report carries A1 addresses,
hidden headers and intersecting tables. renderValues covers IRange and Scalar[][],
which know none of that.
Cell text goes through encodeCell, so whatever a report prints, grep can find.
Renders a markdown report of a cell range: its values as a table, plus the profile, counts, formulas, spills, intersecting sheet objects and the rules over it — all confined to the range.