Sheet 🟑 PREVIEW (advanced) - Spreadsheets

AI spreadsheet with desktop-grade features

Preview β€” advanced. Sheets is functional and close to stable, but is not yet part of the supported surface. It is the most advanced preview app, alongside Mail.

Sheet Interface Screen

Overview

Sheet is the spreadsheet application in General Bots Suite. It stores workbooks in Drive, imports and exports .xlsx and CSV, evaluates a large worksheet function library server-side, and renders a virtualised grid that scrolls over very large row counts.

Sheet is in beta, and the gap between it and a desktop spreadsheet is currently wide. The tables below mark each capability honestly:

  • Available β€” implemented and usable today.
  • Partial β€” present but incomplete or unreliable; the note says how.
  • Planned β€” modelled, or exposed in the API, but not yet functional end to end.

The work to close the gap is tracked in Sheet Parity Plan. Read that page before relying on Sheet for a workbook you cannot afford to lose.


Features

Cells

ActionStatusNotes
Edit a cellAvailableDouble-click, F2, or type over the selection
A1-style referencesAvailableA1, A1:C10
Number, currency, date and percentage formatsAvailableFormat codes are read from .xlsx and applied server-side to the display value (R$ 1.234,50 renders correctly)
Merge cellsAvailableThe merge button merges the selected range; unmerge supported; merged regions render with the anchor spanning
Resize rows and columnsAvailableImported widths and heights render; drag the column-header or row-gutter edge to resize, persisted via /api/sheet/resize
Range selectionAvailableDrag, Shift+click extend, Ctrl+A, row/column via header clicks; Ctrl+click / Ctrl+drag accumulate multi-ranges
Multi-range selection (Ctrl+click)AvailableCtrl+click toggles a cell, Ctrl+drag sweeps a block, Ctrl+click on a row/column header adds the whole row/column; Esc clears
Freeze panesAvailableFreeze top row / first column / both via the toolbar; sticky render
Cell comments and notesPartialNotes add/edit/clear via right-click; orange marker on noted cells; threaded comments via the sidebar panel

Formulas

Around 170 worksheet functions are implemented server-side, including the Microsoft 365 dynamic-array family. A representative sample:

FunctionSyntaxDescription
SUM=SUM(A1:A10)Sum of a range
AVERAGE=AVERAGE(B1:B5)Mean of a range
COUNT / COUNTA / COUNTBLANK=COUNTA(C1:C20)Counting variants
IF / IFERROR=IF(A1>10,"Yes","No")Conditional logic
VLOOKUP / HLOOKUP / XLOOKUP / MATCH / INDEX=XLOOKUP(A1,D:D,E:E)Lookups
SUMIF / SUMIFS / COUNTIF / COUNTIFS / AVERAGEIFS / MAXIFS / MINIFS=SUMIFS(C:C,A:A,"Jan")Criteria aggregation
MAX / MIN / MEDIAN / STDEV / PERCENTILE / QUARTILE / RANK=MEDIAN(A1:A10)Statistics
FILTER / SORT / SORTBY / UNIQUE / SEQUENCE / RANDARRAY=UNIQUE(A1:A100)Dynamic arrays
HSTACK / VSTACK / TOCOL / TOROW / TAKE / DROP / EXPAND=VSTACK(A1:A5,C1:C5)Array shaping
LET / LAMBDA / MAP / REDUCE / BYROW / BYCOL / MAKEARRAY=LET(x,A1,x*2)Lambda family
TEXTSPLIT / TEXTBEFORE / TEXTAFTER / VALUETOTEXT=TEXTSPLIT(A1,",")Text 365
GROUPBY / PIVOTBY / SUBTOTAL / AGGREGATE / PERCENTOF=GROUPBY(A:A,B:B,SUM)Grouping
DATE / YEAR / MONTH / DAY / DATEDIF / HOUR / MINUTE / SECOND=DATEDIF(A1,B1,"d")Dates
BOT_AI_PROMPT=BOT_AI_PROMPT("Analyze ", A1)AI-powered cell evaluation with caching β€” see AI Sheet Cache

Current formula limitations

These are real and will bite immediately. Each is tracked in Sheet Parity Plan.

LimitationExampleResult today
Legacy dispatcher upper-cases string literals=CONCATENATE("Total: ",A1)TOTAL: 7 β€” use ="Total: "&A1, which preserves case
Cross-sheet refs not satisfied by the single-worksheet evaluator=Sheet2!A1#REF! (parsed and rendered, but not resolved)
Recalculation capped at 1000 dependent cellsa large modelcycles logged and skipped; the cap still applies

Charts

TypeStatus
Bar, Line, Pie, Scatter, AreaPartial β€” charts render as SVG overlays anchored to grid coordinates; data is snapshotted rather than bound to a range

Filters

FilterStatus
Text contains / equals, number range, date range, empty/non-empty, custom formulaPartial β€” column-header filter menu with distinct-value checkboxes; matching rows survive, others are hidden client-side

Sort

OptionStatus
Ascending / descending on a rangeAvailable — column-header sort menu (A→Z / Z→A) sorts a multi-cell selection or the populated region; formulas referencing moved cells are not rewritten
Multi-column, custom orderPlanned

Import / Export

FormatImportExportNotes
CSVAvailableAvailableExported values are unformatted
TSVAvailableAvailableβ€”
JSONAvailableAvailableInternal document shape
.xlsxPartialPartialValues, formulas, number format codes, cell styles, merged cells, column widths, row heights, frozen panes, hidden rows/columns, defined names, per-sheet protection, tables, autofilter, hyperlinks, images, data validation, conditional formatting (with font/fill fidelity), rich-text runs, comments/notes, print setup, print areas/titles and external links are read. Pivot tables are still dropped from the model β€” charts and rich text are re-extracted from the raw package, and pivot tables are preserved byte-for-byte on save but not modelled.
.xls / .xlsbPartialβ€”Cell values, typed cells and formulas are read via calamine; styles, merges, charts and layout are not (BIFF reader exposes values/formulas only).
Markdownβ€”Availableβ€”
PDFβ€”AvailableReal PDF 1.4 export β€” one page set per worksheet, repeated header row, application/pdf content type
ODSβ€”PartialEmits content XML, not a complete .ods package

Warning β€” opening an .xlsx from Drive. The save-back is non-destructive: the original package is preserved and only edited cells are rewritten (issue 8). Features Sheet cannot model are not altered by an edit round-trip.


Keyboard Shortcuts

Implemented today:

ShortcutAction
EnterCommit and move down
TabCommit and move right
F2Edit the active cell
Arrow keysMove the selection
Ctrl+Z / Ctrl+YUndo / redo
Ctrl+C / Ctrl+V / Ctrl+XCopy / paste / cut
Ctrl+D / Ctrl+RFill down / fill right
Delete / BackspaceClear the selected range
Ctrl+ASelect all
Ctrl+ArrowJump to the edge of the data
Ctrl+Home / Ctrl+EndFirst / last used cell
Ctrl+PageUp / Ctrl+PageDownPage the viewport
EscAbandon an edit / clear the selection

Documented but not yet implemented β€” tracked in Sheet Parity Plan:

ShortcutAction
Ctrl+Alt+VPaste Special
Alt+EnterNewline inside a cell
F4Cycle $ anchors in a reference
Ctrl+Space / Shift+SpaceSelect column / row
Ctrl+click / Ctrl+dragMulti-range selection (available β€” see Cells table)

Sheet via Chat

The examples below show the intended conversational flow. Chat-driven sheet creation depends on the parity work in Sheet Parity Plan; treat them as the target experience rather than a description of current behaviour.

Creating a Sales Report

Calculating Totals

Generating a Chart


API Endpoints

EndpointMethodDescription
/api/sheet/listGETList all spreadsheets
/api/sheet/searchGETSearch spreadsheets
/api/sheet/loadGETLoad spreadsheet by ID
/api/sheet/savePOSTSave spreadsheet
/api/sheet/deletePOSTDelete spreadsheet
/api/sheet/cellPOSTUpdate cell value
/api/sheet/formatPOSTFormat cells
/api/sheet/formulaPOSTEvaluate spreadsheet formula
/api/sheet/rangePOSTGet range values
/api/sheet/worksheet-metaPOSTUpdate worksheet metadata
/api/sheet/pivotPOSTCreate pivot table
/api/sheet/exportPOSTExport spreadsheet
/api/sheet/sharePOSTShare spreadsheet
/api/sheet/newGETCreate new blank spreadsheet
/api/sheet/mergePOSTMerge cells
/api/sheet/unmergePOSTUnmerge cells
/api/sheet/freezePOSTFreeze panes
/api/sheet/sortPOSTSort range
/api/sheet/filterPOSTFilter data
/api/sheet/chartPOSTCreate chart
/api/sheet/conditional-formatPOSTApply conditional formatting
/api/sheet/data-validationPOSTApply data validation rules
/api/sheet/aiPOSTQuery spreadsheet AI assistant
/api/sheet/:idGETGet spreadsheet by ID
/api/sheet/:id/ops?since=NGETReplay oplog entries after sequence N (collab reconnect recovery)
/ws/sheet/:sheet_idGETWebSocket for collaborative editing

Create Spreadsheet Request

{
    "title": "Sales Report",
    "sheets": [
        {
            "name": "Revenue",
            "rows": 20,
            "columns": 10,
            "data": {
                "A1": "Month",
                "B1": "Revenue",
                "A2": "Jan",
                "B2": 12400
            }
        }
    ]
}

Cell Update Request

{
    "cells": {
        "B16": "=SUM(B2:B15)",
        "C16": "=AVERAGE(C2:C15)"
    }
}

Spreadsheet Response

{
    "id": "sheet-789",
    "title": "Sales Report",
    "sheets": [
        {
            "name": "Revenue",
            "data": [
                ["Month", "Revenue", "Orders"],
                ["Jan", 12400, 156],
                ["Feb", 15200, 189]
            ],
            "charts": [
                {
                    "id": "chart-001",
                    "type": "bar",
                    "title": "Monthly Revenue",
                    "data_range": "A1:B15"
                }
            ]
        }
    ],
    "created_at": "2025-05-15T09:00:00Z",
    "updated_at": "2025-05-15T11:00:00Z"
}

Configuration

Current grid limits are compiled in, not configurable:

LimitCurrent valueDesktop spreadsheets
Column limit16,384 (XFD) β€” virtualised headers, cells and scroll; only the visible column window is rendered16,384 (XFD)
Rows1,048,576 (aligned with the desktop standard)1,048,576
Recalculated cells per edit1,000 (logs and skips cycle members instead of silently truncating)unlimited

Canvas rendering of the grid remains the open part of Sheet Parity Plan issue 6.


Troubleshooting

A formula returns #ERROR!

Check it against the limitations table above first β€” =SUM(A1:A3)+1, =A1&B1, =A1^2 and any nested call return #ERROR! by design of the current evaluator, not because of anything wrong with your sheet. Otherwise:

  1. Confirm the formula starts with =.
  2. Confirm the function name is in the implemented set.
  3. Check for a circular reference.

A number is treated as text

Values typed with thousands separators or currency symbols are stored as text; type the bare number or use a formula to coerce. Formatted display of stored numbers follows the cell’s format code.

Cell formatting is not shown

If a workbook opened from Drive loses its currency/date display, the cell may predate the format engine; re-applying the format from the toolbar refreshes it. Number format codes are applied server-side on load.

A worksheet cannot be reached

All worksheets are reachable through the tab bar (add/switch/delete/rename). If the tab bar does not render, reload the page; old cached pages predate it.

Import lost part of the file

See the import table above for exactly what is dropped. Pivot tables are still not modelled on import (they survive an edit round-trip byte-for-byte but do not render); rich-text runs now import but are not yet rendered in the grid.

Chart is not displayed

Charts are not rendered in the grid yet. The definition is stored and returned by the API.


See Also