mirror of
https://github.com/larksuite/cli.git
synced 2026-09-14 18:42:53 +08:00
5a72b989c1
* feat(sheets): read a sheet prefix in --range as the sheet selector
Eval traces: 707 calls to +cells-get / +csv-get / +csv-put / +cells-set /
+cells-clear died on "specify at least one of --sheet-id or --sheet-name",
and 53% of them had already named the sheet inside --range
("Sheet1!A1:D20"). The sheet was known, only the flag was missing — so the
prefix now fills the selector and the bare A1 range goes to the tool.
Wired on both paths: a PreRunE stage in the sheets ergonomics layer for
standalone commands, and the sub-op translator for +batch-update.
The grammar follows the front-end ref lexer (byted-sheet TractorLexer):
the full-width ! is an equal separator, an unquoted name can contain
neither width (so splitting on the first one is safe), and a quoted name
keeps its doubled-quote escape and may itself contain a "!". Unquoted
names with spaces are accepted here though the lexer rejects them — a
--range flag has none of a formula's tokenizing ambiguity.
sheetNameFromA1 delegates to the same splitter instead of carrying a
second, looser grammar.
Scope guards: an explicit --sheet-id / --sheet-name stays authoritative
and --range passes through untouched, so a disagreeing prefix cannot
silently retarget a write; only --range carries the rewrite, since
+range-copy / +range-move / +range-fill name their destination sheet with
--target-sheet-id.
* fix(sheets): 边框粗细词兜底补齐 hair 与数字线宽
07-28 只修了 border_styles.<side>.style 里的 thin/medium/thick,同族的另外两种
写法仍在报错。对 596 条 trace 做频次统计,边框取值的错法就这几种:
weight 槽 "hair" 476 次 / 19 个用例 ← 本次新增
style 槽 "thin" 1795 次 / 39 个用例 (07-28 已修)
style 槽 "hair" 76 次 / 2 个用例 ← 本次新增
weight 槽 数字 10 次 / 2 个用例 ← 本次新增(07-28 报告 Case 2)
width 键(GSheets) 35 次 / 3 个用例 ← 本次新增
根因是契约把一个视觉概念拆成 style(线型)× weight(粗细)两个字段,而 openpyxl
把两者塞进一个词 Side(border_style="thin"),于是同几个粗细词在两个槽位都会出现。
borderWeightWord 一个函数同时服务两个槽位,挂在 expandBorderAllShorthand 这个唯一
漏斗上,四条载体路径(--border-styles / --cells 内联 / --styles 载荷 /
+workbook-create)一起生效。
weight 先于 style 归一是有意的:{"style":"thin","weight":"1"} 只有等 "1" 先变成
"thin",style 那步才看得出显式 weight 与词义一致而非冲突。显式冲突
(thin + thick)保持报错,不替用户选。
刻意不收:openpyxl 完整线型表(dashDot / mediumDashed / slantDashDot)、VBA
xlContinuous、CSS hidden、Google Sheets SOLID_THICK、line_style / thickness 等
键别名、style 与 weight 装反、px/pt 后缀 —— trace 里全是 0 次;solid_thin、
border_width、border_color 各只有 1 个用例。它们继续走 enum 报错(报错带允许值
和 did-you-mean,一轮能改对),符合本文件顶部的静默别名准入门槛:真实词汇 **且**
跨批次/≥3 任务复现。新增用例里有一条反向断言把这条线钉住。
TestCellsSetStyle_BorderWeightNumberNamesEnum 的探针从数字换成布尔——数字现在会被
归一化,不再走报错路径,enum-over-skeleton 那条文案规则改用布尔来钉。
* feat(sheets): accept the openpyxl-habit --cells shapes and prescribe the rest
The --cells shape family is the single largest client-side rejection cluster
for +cells-set in the eval corpus. Traced against 14,024 real calls it splits
into two habits, and each gets the treatment its ambiguity allows.
Accepted outright, both unambiguous, both on the existing jsonFlagNormalizers
seam (so --writes items and +batch-update sub-ops get them too):
- {"cells": […]} envelope — an agent generating the payload in a script
writes json.dump({"cells": cells}, f), mistaking the flag name for a JSON
key. 11 of 21 traced `expected type "array", got "object"` rejections are
this exact shape. Only a lone "cells" key unwraps; siblings mean the
object is the whole tool input and dropping them would write elsewhere.
- bare scalars in cell slots — the openpyxl / gspread habit of passing a
plain values matrix, which real rows mix with cell objects as soon as a
formula appears (["1","电动大门",10331.00,{"formula":"=D2*E2"}]).
null is deliberately left failing: {} (leave the cell alone) and
{"value":""} (write an empty string) are both plausible readings, and the
normalizer only rewrites what is beyond doubt.
Renamed silently on the same grounds: --values is what gspread calls the
payload, and what this CLI's own +workbook-create calls its untyped 2D data.
Because bare scalars now lift into {"value":…}, the plain matrix a --values
caller passes ('[["工作内容"]]') is already accepted verbatim under --cells —
the name was the only thing wrong, which puts it in commandFlagAliases rather
than the prescription table. That drops the round trip a prescription costs
(eval F8: 170 hits, 1.9% of failures) and covers the +batch-update sub-op
path, which reads the same alias table and would otherwise get no hint at all
(a prescription only rides on cobra's unknown-flag branch).
Inferred, matching the libraries these callers arrive from: a bare
single-cell --range is now an anchor, sized from the payload — the same
inference +csv-put already does for --start-cell. The range resolves locally
and ships in full, so the server still gets the strict match it enforces. An
explicit extent ("A1:A1", "A1:C10") is never inferred over.
Prescribed, because it cannot be guessed safely: the cells-vs-range mismatch
(132 rejections across 93 case-runs) now reports both axes at once and hands
back the range that fits the payload, plus the inclusive-end note that
explains its biggest sub-bucket — A1:C10 being 10 rows. Growing the range
would overwrite rows the caller never mentioned and shrinking it would drop
data, so the choice stays with the caller. Ragged rows get their own message
instead of being reported as a range mismatch.
Supporting refactor: parseCellRange replaces the prefix-strip / split-on-":"
/ splitCellRef triplication (rangeDimensions becomes a thin wrapper, its
error wording kept byte-for-byte since +styles-put surfaces it verbatim), and
cellsExtent is the one authority on whether a payload is rectangular, so the
anchor expansion and the dimension check cannot disagree. Two bugs fell out
of the new tests: a leading space before the sheet name survived into every
rendered range, and a payload of empty rows would have rendered a malformed
suggestion.
* fix(sheets): parse the sheet part of a range with the ref lexer's grammar
parseCellRange cut the sheet off with strings.Index(range, "!"), which
disagrees with the grammar splitRangeSheetPrefix already implements from the
front-end ref lexer (byted-sheet TractorLexer.ts). Two spellings the lexer
treats as ordinary therefore failed to parse at all:
--range '甘特图!B3' full-width separator (ExclamationMark accepts it)
--range "'Q1!Actual'!B3" quoted name owning a "!" (quotes delimit, so it may)
An unparsable range is deliberately deferred ("the range validator's job"),
so the failure was silent in both directions: the anchor never expanded and
the dimension mismatch never got its prescription. Reachable whenever the
prefix survives to the shortcut — an explicit --sheet-id/--sheet-name keeps
it (the selector rewrite only fires when the pair is empty), as do
--source-range / --target-range, which that rewrite deliberately skips.
The grammar now lives in one place. scanSheetQualifier reports the parsed
sheet name AND the byte offset just past the separator; splitRangeSheetPrefix
is rewritten on top of it (all 20 of its grammar cases unchanged), and
parseCellRange slices the qualifier off at that offset. The offset is the
point: a range rendered from a parse is both shipped to the server and
printed for the caller to paste back, so the qualifier has to survive
verbatim — quotes, full-width separator and all — which a name parsed and
re-quoted could not promise.
Naming, while here: cellRange.prefix said where the field sits, not what it
holds. It is now sheetQualifier (verbatim, separator included) alongside
sheetName (parsed, unquoted) — the sheet a range names is what the type is
about, and the next caller that needs it should not reach for the raw string.
* fix(sheets): close the four gaps the PR review found
Anchor expansion no longer sizes a sheet-qualified range. Such a range only
reaches expandAnchorRange beside an explicit --sheet-id / --sheet-name, since
all three entry points fold the prefix into the selector when none was given —
so the prefix is one that disagrees with the selector, and sizing it shipped
{"range":"Sheet1!A1:B2","sheet_name":"Other"} where the pre-anchor CLI had
failed locally with the cells-vs-range mismatch. Trading a local prescription
for a wire payload whose two halves name different sheets is the wrong
direction; a qualified anchor stays a mismatch.
--writes items now really do get the payload rewrites. cellsSetWritesOps gives
each item the standalone pipeline through a per-item flag view, but that runs
after requireJSONArray has validated the array, so an item spelling its payload
"values" or wrapping it in a {"cells": …} envelope died on the array schema
while the identical +batch-update sub-op was accepted. The rewrites move onto
the jsonFlagNormalizers seam for --writes, one step ahead of the schema, so the
two spellings of the same write agree. values → cells only when "cells" is
absent: two spellings with different payloads stays normalizeSubOpInputKeys'
conflict to report.
The derived selector is left as the only spelling of itself.
normalizeSubOpInputKeys keeps a duplicate key whose two values agree rather
than erroring, and two empty strings agree — so an input carrying both
"sheet-name":"" and "sheet_name":"" kept the hyphen form, which lookupRaw finds
first and which then shadowed the sheet_name just derived from the range
prefix, failing as "specify at least one of --sheet-id or --sheet-name".
Test coverage the review asked for: a +batch-update dry-run case for the prefix
rewrite (the sub-op path had unit coverage but no E2E), and the two tests that
grepped a rendered envelope now decode the dry-run body and assert the fields
that reach the wire.
* test(sheets): cover the accepted input shapes against a real spreadsheet
The dry-run E2E pins what the CLI builds; nothing pinned that the backend
takes it. That gap matters more for rewrites than for ordinary flags: each one
turns a caller spelling into a wire payload the caller never sees, so a payload
the server rejects would be a worse outcome than the client-side error it
replaced.
TestSheets_CallCompatWorkflow writes through a sheet-qualified --range with no
selector flag at all, with bare scalars in the cell slots and a bare A1 acting
as an anchor — three rewrites composed in one call — then reads back through
the same prefix and stamps an openpyxl "hair" border over the result. The sheet
is named with a space in it so the prefix takes its quoted form, the spelling
the ref-lexer grammar exists for and the one a first-ASCII-"!" split would cut
in half.
The read-back compares values collected out of the decoded payload rather than
a fixed path: get_cell_ranges' response nesting is the backend's to change and
is pinned nowhere in this repo, while the values having survived the round trip
is the actual claim. The number is compared numerically for the same reason.
Self-contained: it builds its own workbook, and createSpreadsheet's cleanup
tears it down. Skips without tenant credentials, so local runs are unaffected
and CI's e2e-live job is what exercises it.
* feat(sheets): answer +sheet-list instead of failing the guess
Callers reach for +sheet-list on their own: the sheets surface has a whole
+sheet-* family (+sheet-create / +sheet-copy / +sheet-delete / +sheet-info),
so "list the sheets" spells itself that way. The miss does not self-correct
either, because internal/suggest ranks shared prefixes first: the "did you
mean" hint points at +sheet-create and its siblings, never at +workbook-info.
Add it as a read-only projection over get_workbook_structure emitting the bare
sheets array, entry-for-entry identical to what +workbook-info nests under
sheets. Hidden from `sheets --help` here, and from the lark-sheets skill docs
via sheet-skill-spec's doc_hidden_shortcuts, so neither surface offers a second
name for what +workbook-info already does; the command only ever answers a
caller who typed it anyway.
data/flag-defs.json and flag_defs_gen.go carry the new shortcut's flag entry,
sourced from sheet-skill-spec's spec-tables.
* feat(sheets): prescribe the real command for invented subcommand names
Callers reach for subcommand names this CLI does not have, borrowed from
neighbouring ecosystems. The framework answers an unknown name by edit distance
over the group's children; that ranking is prefix-weighted, so it cannot settle
a name whose answer shares no prefix with it, or one whose same-prefix siblings
crowd the answer out. Those names now get a curated prescription instead: the
command they meant plus its exact retry form, so the next attempt needs no
--help round trip.
Prescribed, never rewritten. Unlike a flag, silently resolving a subcommand
would run a write the caller never named, and the same information fits in the
error the failed call already returns. Every entry is a naming miss rather than
a missing capability — each intent already has a command — and a rare spelling
stays with the ranker rather than growing the table.
The hook is the group's Args validator, which cobra runs before the group's
RunE. That ordering is what keeps this inside sheets: the framework's
unknown-subcommand guard installs on RunE and never touches Args, so the two
compose and every unclaimed name still reaches the ranked "did you mean one
of: …" unchanged. The message stays byte-identical to the guard's, since the
name genuinely does not exist; only the hint and the machine-readable
suggestion change.
Targets resolve against the live tree rather than the table. All of them are
write commands, so a concealed distribution or a user policy of max_risk: read
replaces one with a hidden deny stub; prescribing it then would name a command
that can only answer command_unavailable, and that the ranker has already
stopped suggesting. The check mirrors the ranker's filter, and doubles as a
runtime backstop when a target vanishes in a rename.
Known gap: +batch-update validates sub-op shortcut names against its own
allow-list, so an invented name inside --operations still gets the generic
"not allowed" dump instead of the prescription.
Tests pin the two invariants that make the table safe to extend — a target must
exist, and a key must not shadow a real command (checked against backward's
aliases too, which mount on the same group) — plus the registration itself, so
deleting the wiring fails the suite instead of silently reverting the CLI to
generic suggestions.
* fix(sheets): keep a non-finite line width off the thickness mapping
strconv.ParseFloat answers yes to "Inf" / "Infinity" / "NaN", so a quoted
non-finite weight entered the numeric-width branch and came back out as
"thick" with exit 0 — the CLI guessing at input that means nothing. NaN
only escaped that by accident (every comparison against it is false).
borderLineWidth now reports a non-finite result as "not a width", which
puts both back on the enum error path that names thin / medium / thick.
Also closes the review's test-coverage gaps: hair in the style slot pins
the canonical style ("solid") next to the weight in both the corpus and
the dry-run e2e, the numeric-width table gains its two ends (3 is where
thick starts, 0 keeps its own type error), and splitRangeSheetPrefix
covers the backslash-escaped separator after a quoted name.
* fix(sheets): parse --ranges prefixes with the shared grammar, budget every cells shape
Three gaps the review found, each reproduced against a built binary first.
--ranges kept its own strings.Index("!") splitter, so the four separator
spellings the rest of the PR unified on stopped at the flag boundary:
"工作表1!A1:B2" was rejected as carrying no sheet prefix at all, and
"'My Sheet'!A1:B2" shipped sheet_name "'My Sheet'" — quotes included — for
the backend to fail on as sheet-not-found. Both the up-front prefix check
and splitSheetPrefixedRange now go through scanSheetQualifier /
splitRangeSheetPrefix, which keeps the two error messages' division of
labour: no qualifier at all is "must include a sheet prefix", an empty
side is "must use sheet!range form".
estimatedBatchOpCells ran before the translator's normalizers but read the
wire shape only, so a {"cells": …} envelope, a lone cell object, and a
payload spelled "values" each scored zero cells and materialized outside
the batch-wide safety budget. It unwraps the shape now — no mutation, the
per-cell rewrites stay the translator's and change no count.
sheetNameFromA1 lost "Sheet1!" when it moved onto splitRangeSheetPrefix,
which requires a non-empty range; a prefix with no range still names a
sheet, and pivotPlacementWarn is more use naming it than falling back to
the generic wording. It reads the qualifier directly instead.
* fix(sheets): make the +cells-put prescription validate, and type the range assertions
The +cells-put hint replaces the ranked candidate list, so it is the whole
of what a caller gets back — and it prescribed a 1×2 matrix against A1:B2,
which fails the cells-vs-range check the same call would hit, plus prose
forbidding the bare scalars this branch now accepts. It spells a matching
2×2 scalar matrix and both accepted cell forms instead.
TestPrescribedExamplesActuallyValidate pulls the flags back out of the hint
and runs them through +cells-set, so the prose cannot drift from what the
validator takes; restoring the old hint fails it with the very error the
caller would have seen.
splitSheetPrefixedRange's rejection cases asserted only that an error came
back, which an untyped one would satisfy. They now go through
requireValidation and pin the --range attribution and the offending input
in the message.
5156 lines
152 KiB
JSON
5156 lines
152 KiB
JSON
{
|
||
"+formula-verify": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string_slice",
|
||
"required": "optional",
|
||
"desc": "Sheet reference_id(s); repeat or comma-separate to scan multiple sheets. Omit to scan all visible sheets."
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string_slice",
|
||
"required": "optional",
|
||
"desc": "Sheet name(s); repeat or comma-separate to scan multiple sheets. Omit to scan all visible sheets."
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string_slice",
|
||
"required": "optional",
|
||
"desc": "Optional A1 ranges (e.g. `A1:Z200`); repeat or comma-separate for multiple ranges. Omit to scan each sheet's current_region."
|
||
},
|
||
{
|
||
"name": "max-locations",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Max locations / samples per error type; default 20.",
|
||
"default": "20"
|
||
},
|
||
{
|
||
"name": "exit-on-error",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "When status=errors_found, exit non-zero. Useful for CI gate after batch formula writes."
|
||
},
|
||
{
|
||
"name": "ai-only",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Only verify AI formulas (=AI(prompt, [range])), skipping the 7 Excel-error scan of ordinary formulas. AI formulas compute asynchronously: use this flag with --range as the first post-write sample check, not cells-get polling; if the sample has no explicit failed/unsupported state, delivery may proceed with pending formulas while telling the user that computation continues in the background."
|
||
}
|
||
]
|
||
},
|
||
"+workbook-info": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+revision-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "title",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "New sheet title"
|
||
},
|
||
{
|
||
"name": "index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Insert position (0-based); appended to the end when omitted",
|
||
"default": "-1"
|
||
},
|
||
{
|
||
"name": "row-count",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Initial row count (default 200, max 50000)",
|
||
"default": "200"
|
||
},
|
||
{
|
||
"name": "col-count",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Initial column count (default 20, max 200)",
|
||
"default": "20"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "New sub-sheet type: sheet (spreadsheet); default sheet.",
|
||
"default": "sheet",
|
||
"enum": [
|
||
"sheet"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm high-risk write (exit code 10 without this flag)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-rename": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "title",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "New title"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-move": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Target position (0-based)"
|
||
},
|
||
{
|
||
"name": "source-index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Source position (0-based); optional for standalone calls — if omitted, the CLI runtime derives it from the current workbook index of `--sheet-id` / `--sheet-name`. Inside `+batch-update` it must be passed explicitly, since batch cannot issue a structure query mid-run to derive it",
|
||
"default": "-1"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-copy": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "title",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Copy title; auto-generated by the server when omitted"
|
||
},
|
||
{
|
||
"name": "index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Insert position for the copy (0-based); appended to the end when omitted",
|
||
"default": "-1"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-hide": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-unhide": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-set-tab-color": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "color",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Hex color like `#FF0000`; pass empty string `\"\"` to clear"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-hide-gridline": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sheet-show-gridline": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+workbook-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "title",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Spreadsheet title"
|
||
},
|
||
{
|
||
"name": "folder-token",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Target folder token; placed at the drive root when omitted"
|
||
},
|
||
{
|
||
"name": "values",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Untyped initial data as one 2D JSON array (`[[\"alice\",95]]`); values are written as-is with their type auto-detected (dates / numbers land as text — use --sheets to preserve types), through the same batched set_cell_range path as --sheets — pair with --styles for number formats, colors, merges, and row/col sizes",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "sheets",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Typed table payload as JSON (same shape as `+table-put`): top-level `{\"sheets\":[...]}`, with each array item a sub-sheet `{name, start_cell?, mode?, header?, allow_overwrite?, columns:[\"colA\",\"colB\",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` — `name` and the outer `sheets` envelope are both required. Agents typically use `df_to_sheet(df, name)` from `scripts/sheets_df.py` to pack each DataFrame into one item, then wrap the list in `{\"sheets\":[...]}`. Mutually exclusive with --values. Creates the workbook, then writes typed type-faithful data (dates land as real dates, numbers keep precision).",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "styles",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Initial visual operations as JSON: top-level `{styles:[...]}`. Each item corresponds to one target sheet and must include `name`, plus at least one of `cell_styles` / `row_sizes` / `col_sizes` / `cell_merges`. `cell_styles` entries use +cells-set-style fields with a cell range; row/col sizes use dimension ranges plus type/size; merges use cell ranges plus optional merge_type. With --sheets, styles array length/order/name must match --sheets.sheets. With --values, pass exactly one styles item for the initial sheet (its name is ignored).",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+workbook-export": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "file-extension",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Export file format; `csv` mode requires `--sheet-id`",
|
||
"default": "xlsx",
|
||
"enum": [
|
||
"xlsx",
|
||
"csv"
|
||
]
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Required only in csv mode: which sheet to export as CSV. This is a `+workbook-export`-specific flag, unrelated to the common four-tuple sheet locator (this shortcut does not accept the common sheet locator)"
|
||
},
|
||
{
|
||
"name": "output-path",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Local save path. When omitted, **only the export task is triggered + polled, the file is NOT downloaded** (returns file_token / status so a later step can resume the download). Pass a concrete path (e.g. `./out.xlsx`) or a directory (`.` keeps the server-provided filename) to download. Note: the equivalent `lark-cli drive +export --doc-type sheet` uses three separate flags (`--output-dir` / `--file-name` / `--overwrite`) and defaults to downloading into the current directory; this wrapper collapses them into a single `--output-path` for ergonomics but defaults to no-download — fall back to `drive +export` if the split flag set fits better."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+workbook-import": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "file",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Local file path (.xlsx / .xls / .csv)"
|
||
},
|
||
{
|
||
"name": "folder-token",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Target folder token; imported to the cloud drive root when omitted"
|
||
},
|
||
{
|
||
"name": "name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Imported spreadsheet name; defaults to the local file name without its extension"
|
||
}
|
||
]
|
||
},
|
||
"+sheet-info": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "include",
|
||
"kind": "own",
|
||
"type": "string_slice",
|
||
"required": "optional",
|
||
"desc": "Comma-separated structure info categories to return",
|
||
"enum": [
|
||
"merges",
|
||
"row_heights",
|
||
"col_widths",
|
||
"hidden_rows",
|
||
"hidden_cols",
|
||
"groups",
|
||
"frozen"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Limit structure info to this A1 range; whole sheet when omitted"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-insert": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "inherit-style",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Style inheritance for the new row/column: `before` (from the preceding row/column) / `after` (from the following row/column). Omit the flag to inherit the following row/column (same as `after`) — the backend cannot leave a new row/column unstyled; for a truly blank row/column, clear formats afterwards with +cells-clear --scope formats. Insertion always lands before `--position`; this only selects which side's style is copied.",
|
||
"enum": [
|
||
"before",
|
||
"after"
|
||
]
|
||
},
|
||
{
|
||
"name": "position",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Insert position (1-based row number like `3` or column letter like `C`); new rows/columns are inserted *before* this position"
|
||
},
|
||
{
|
||
"name": "count",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Number of rows/columns to insert (must be > 0)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Row/column closed range to delete; rows use 1-based numbers like `3:7` or `5` (single row), columns use letters like `C:F` or `C`. XOR with `--ranges`"
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Multiple row/column ranges to delete as a JSON array (up to 100 items, e.g. `[\"5:5\",\"8:8\",\"11:13\"]` or `[\"C:C\",\"F:G\"]`); rows and columns cannot be mixed, ranges must not overlap; XOR with `--range`. CLI sorts positions in DESCENDING order into one batched delete (fail-fast, no rollback) — ascending deletion would shift later indexes as earlier rows/columns disappear; the CLI handles the ordering",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); row/column deletion is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-hide": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Row/column closed range to hide; rows use 1-based numbers like `3:7`, columns use letters like `C:F`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-unhide": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Row/column closed range to unhide; rows use 1-based numbers like `3:7`, columns use letters like `C:F`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-freeze": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dimension",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "[legacy] Dimension (row or column), paired with --count; sets one axis only and unfreezes the other. Prefer --rows / --cols",
|
||
"hidden": true,
|
||
"enum": [
|
||
"row",
|
||
"column"
|
||
]
|
||
},
|
||
{
|
||
"name": "count",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "[legacy] Freeze the first N rows/columns (paired with --dimension); 0 clears all freezing. Equivalent to --rows N / --cols N, and only --rows/--cols can hold both axes at once",
|
||
"hidden": true
|
||
},
|
||
{
|
||
"name": "rows",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Freeze the first N rows; together with --cols this states the COMPLETE freeze state — an omitted axis is left unfrozen (0 means no frozen rows)"
|
||
},
|
||
{
|
||
"name": "cols",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Freeze the first N columns; together with --rows this states the COMPLETE freeze state — an omitted axis is left unfrozen (0 means no frozen columns)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-group": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "depth",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Nesting level for grouping; default 1",
|
||
"default": "1"
|
||
},
|
||
{
|
||
"name": "group-state",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Initial group expand state",
|
||
"default": "expand",
|
||
"enum": [
|
||
"expand",
|
||
"fold"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Row/column closed range to group; rows use 1-based numbers like `3:7`, columns use letters like `C:F`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-ungroup": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "depth",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Group nesting level to ungroup; default 1 (1 = outermost, larger = deeper)",
|
||
"default": "1"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Row/column closed range to ungroup; rows use 1-based numbers like `3:7`, columns use letters like `C:F`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dim-move": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Source row/column closed range to move; rows use 1-based numbers like `3:7`, columns use letters like `C:F`"
|
||
},
|
||
{
|
||
"name": "target",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Destination position (the moved rows/columns are placed *before* this position); rows use 1-based row number like `12`, columns use column letter like `H`. Must match the dimension of --source-range"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "A1 range, e.g. `A1:F10` (no sheet prefix — use `--sheet-id` / `--sheet-name` to select the sheet)"
|
||
},
|
||
{
|
||
"name": "include",
|
||
"kind": "own",
|
||
"type": "string_slice",
|
||
"required": "optional",
|
||
"desc": "Comma-separated info categories to include. `truncation` additionally estimates whether each cell's content is clipped (by row height / col width / font size / wrap) and returns `isRowTruncated` / `isColTruncated` (extra compute; enable only for layout checks or before adjusting row heights / column widths)",
|
||
"enum": [
|
||
"value",
|
||
"formula",
|
||
"style",
|
||
"comment",
|
||
"data_validation",
|
||
"truncation"
|
||
]
|
||
},
|
||
{
|
||
"name": "max-chars",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Max output chars per call; default 500000 (safety cap). For a full untruncated read, use --output-path to dump to a file (the cap auto-raises to a bounded 20M chars — the read path is not streaming, this cap is the memory guard; pass an explicit --max-chars for more); only lower it (e.g. 25000) when you want results inline without a file, paging via has_more. Passing 0 means \"no cap of my own\" and resolves to the same ceiling as leaving the flag alone (500000, or the offload limit with --output-path) — never down to the tool's smaller omitted-value fallback.",
|
||
"default": "500000"
|
||
},
|
||
{
|
||
"name": "output-path",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Write the full read result to a local path (e.g. `./out.json`); the file holds the data payload as JSON while stdout returns only a small confirmation (output_path, byte count). **When set, the char cap auto-raises to a bounded offload default (20M chars)** rather than unlimited — the read path is not streaming, so this cap is the memory guard; an explicit --max-chars overrides it. The stdout receipt reports `complete` (and `truncated` plus a warning when the cap was hit), so check it instead of assuming the file holds the whole sheet. Omit it to print to stdout as usual."
|
||
},
|
||
{
|
||
"name": "skip-hidden",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Skip hidden rows and columns; default `false`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dropdown-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target range in A1 notation, e.g. `A2:A100` (no sheet prefix — use `--sheet-id` / `--sheet-name` to select the sheet)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+csv-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "A1 range, e.g. `A1:F30` (no sheet prefix — use `--sheet-id` / `--sheet-name` to select the sheet). Optional: when omitted the whole sheet is read (clipped to the actual grid bounds; actual_range in the response names what was read); pair with --max-chars / --output-path on large sheets"
|
||
},
|
||
{
|
||
"name": "max-chars",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Max output chars per call; default 500000 (safety cap). For a full untruncated read, use --output-path to dump to a file (the cap auto-raises to a bounded 20M chars — the read path is not streaming, this cap is the memory guard; pass an explicit --max-chars for more); only lower it (e.g. 25000) when you want results inline without a file, paging via has_more. Passing 0 means \"no cap of my own\" and resolves to the same ceiling as leaving the flag alone (500000, or the offload limit with --output-path) — never down to the tool's smaller omitted-value fallback.",
|
||
"default": "500000"
|
||
},
|
||
{
|
||
"name": "output-path",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Write the full read result to a local path (e.g. `./out.json`); the file holds the data payload as JSON while stdout returns only a small confirmation (output_path, byte count). **When set, the char cap auto-raises to a bounded offload default (20M chars)** rather than unlimited — the read path is not streaming, so this cap is the memory guard; an explicit --max-chars overrides it. The stdout receipt reports `complete` (and `truncated` plus a warning when the cap was hit), so check it instead of assuming the file holds the whole sheet. Note the file is the data payload as JSON — on +csv-get too, where the CSV text sits in a field inside it — not a ready-to-use .csv; redirect stdout instead if you want a bare CSV file. Omit it to print to stdout as usual."
|
||
},
|
||
{
|
||
"name": "include-row-prefix",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Whether to prefix each row with `[row=N]`; default `true`",
|
||
"default": "true"
|
||
},
|
||
{
|
||
"name": "skip-hidden",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Skip hidden rows and columns; default `false`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Print the request path and parameters without executing"
|
||
}
|
||
]
|
||
},
|
||
"+table-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Read only this sheet (by id); omit to read all sheets"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Read only this sheet (by name); omit to read all sheets"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "A1 range to read; omit to read each sheet's full used range (spans internal blank rows/columns, not just the A1 current region)"
|
||
},
|
||
{
|
||
"name": "max-chars",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Max output chars per call; default 500000 (safety cap). The underlying tool truncates at ~50000 even when unset, so this is sent explicitly to raise it; for a full untruncated read use --output-path (cap auto-raises to a bounded 20M chars; explicit --max-chars overrides). Passing 0 means \"no cap of my own\" and resolves to the same ceiling as leaving the flag alone (500000, or the offload limit with --output-path) — never down to the tool's smaller omitted-value fallback.",
|
||
"default": "500000"
|
||
},
|
||
{
|
||
"name": "output-path",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Write the full read result to a local path (e.g. `./out.json`); the file holds the data payload as JSON while stdout returns only a small confirmation (output_path, byte count). **When set, the char cap auto-raises to a bounded offload default (20M chars)** rather than unlimited — the read path is not streaming, so this cap is the memory guard; an explicit --max-chars overrides it. The stdout receipt reports `complete` (and `truncated` plus a warning when the cap was hit), so check it instead of assuming the file holds the whole sheet. Omit it to print to stdout as usual."
|
||
},
|
||
{
|
||
"name": "no-header",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Treat the first row as data instead of a header (columns get positional names col1, col2, ...)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-search": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "find",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Text to find (interpreted as regex when `--regex` is set)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Search range (A1 notation); whole sheet when omitted"
|
||
},
|
||
{
|
||
"name": "match-case",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Case-sensitive match"
|
||
},
|
||
{
|
||
"name": "match-entire-cell",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Match the entire cell content"
|
||
},
|
||
{
|
||
"name": "regex",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Interpret `--find` as a regex pattern"
|
||
},
|
||
{
|
||
"name": "include-formulas",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Also search within formula text"
|
||
},
|
||
{
|
||
"name": "max-matches",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Safety cap; default 5000",
|
||
"default": "5000",
|
||
"hidden": true
|
||
},
|
||
{
|
||
"name": "offset",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Skip the first N matches (for pagination); default 0",
|
||
"default": "0"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-replace": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "find",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Text to find for replacement"
|
||
},
|
||
{
|
||
"name": "replacement",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Replacement text; pass empty string `\"\"` to delete matched content"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Replace range (A1 notation); whole sheet when omitted"
|
||
},
|
||
{
|
||
"name": "match-case",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Case-sensitive match"
|
||
},
|
||
{
|
||
"name": "match-entire-cell",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Match the entire cell content"
|
||
},
|
||
{
|
||
"name": "regex",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Interpret `--find` as a regex pattern"
|
||
},
|
||
{
|
||
"name": "include-formulas",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Also replace within formula text"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Required preflight: outputs `would_replace_count` for user confirmation before the actual replace"
|
||
}
|
||
]
|
||
},
|
||
"+cells-set": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two); not accepted with `--writes` (each writes item carries its own sheet selector)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two); not accepted with `--writes` (each writes item carries its own sheet selector)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Write range (A1 notation). XOR with `--writes` (single region: --range+--cells; multiple regions: --writes)"
|
||
},
|
||
{
|
||
"name": "cells",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "JSON 2D array `[[{cell},...],...]`, dimensions must match `--range`; each cell may carry `value` / `formula` / `cell_styles` / `note` / `rich_text` (incl. `type=\"embed-image\"` in-cell image); run `--print-schema` for full fields",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "writes",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Multi-region write as a JSON array (up to 100 items), each `{sheet_name|sheet_id, range, cells}` — the sheet selector LIVES IN EACH ITEM (same convention as +batch-update sub-ops and +styles-put items; the top-level --sheet-name is rejected). cells has the same shape as `--cells` (2D array; per-cell cell_styles/border_styles allowed). The whole array goes out as ONE batched request (fail-fast, no rollback), cross-sheet supported; typical use: fixing formulas scattered across ranges/sheets — do not assemble a +batch-update operations array for this. XOR with `--range`+`--cells`; range-level uniform styling stays with +styles-put afterwards",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "allow-overwrite",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Allow overwriting non-empty cells (default true); set false to error if any target cell is non-empty",
|
||
"default": "true"
|
||
},
|
||
{
|
||
"name": "max-cells",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Safety cap; default 50000",
|
||
"default": "50000",
|
||
"hidden": true
|
||
},
|
||
{
|
||
"name": "copy-to-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Copy-to range (A1 notation): replicate what --cells wrote into --range (values/formulas/styles, per the fields actually passed) to this range; formula refs auto-shift (C2=B2 -> C3=B3). Write a one-row/one-block template then fill a whole column/area. Supports full rows '3:6', full columns 'C:E', to-col-end 'D3:D', to-row-end 'D3:3', and comma-separated multiple targets like 'C1:D2,E5:F6'."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-set-style": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target range (A1 notation, e.g. `A1:B2`)"
|
||
},
|
||
{
|
||
"name": "background-color",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Background color (hex, e.g. `#ffffff`)"
|
||
},
|
||
{
|
||
"name": "font-color",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font color (hex, e.g. `#000000`)"
|
||
},
|
||
{
|
||
"name": "font-family",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font family name (e.g. `Arial`, `Microsoft YaHei`)"
|
||
},
|
||
{
|
||
"name": "font-size",
|
||
"kind": "own",
|
||
"type": "float64",
|
||
"required": "optional",
|
||
"desc": "Font size in px (e.g. 10, 12, 14)"
|
||
},
|
||
{
|
||
"name": "font-style",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font style",
|
||
"enum": [
|
||
"normal",
|
||
"italic"
|
||
]
|
||
},
|
||
{
|
||
"name": "font-weight",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font weight",
|
||
"enum": [
|
||
"normal",
|
||
"bold"
|
||
]
|
||
},
|
||
{
|
||
"name": "font-line",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font line style",
|
||
"enum": [
|
||
"none",
|
||
"underline",
|
||
"line-through"
|
||
]
|
||
},
|
||
{
|
||
"name": "horizontal-alignment",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Horizontal alignment",
|
||
"enum": [
|
||
"left",
|
||
"center",
|
||
"right"
|
||
]
|
||
},
|
||
{
|
||
"name": "vertical-alignment",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Vertical alignment",
|
||
"enum": [
|
||
"top",
|
||
"middle",
|
||
"bottom"
|
||
]
|
||
},
|
||
{
|
||
"name": "word-wrap",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Word-wrap strategy",
|
||
"enum": [
|
||
"overflow",
|
||
"auto-wrap",
|
||
"word-clip"
|
||
]
|
||
},
|
||
{
|
||
"name": "number-format",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Number format pattern (e.g. text `@`, number `0.00`, currency `$#,##0.00`, date `mm/dd/yyyy`)"
|
||
},
|
||
{
|
||
"name": "border-styles",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Border config JSON: `{ top: {style,weight,color}, bottom: ..., left: ..., right: ... }`; same shape for all 4 sides. style = line type (solid|dashed|dotted|double|none); weight = thickness (thin|medium|thick — a string, not a pixel number); color = hex like #000000. { all: {...} } sets all four sides at once. This is the only border flag: no --border-all / --border-top / --border-color exist",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-set-image": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target cell (A1 notation; must be a single cell, e.g. `A1`; start and end must be identical)"
|
||
},
|
||
{
|
||
"name": "image",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Local image path (PNG / JPEG / JPG / GIF / BMP / JFIF / EXIF / TIFF / BPG / HEIC)"
|
||
},
|
||
{
|
||
"name": "name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Image file name (with extension); defaults to the basename of `--image`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dropdown-set": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target range (A1 notation, e.g. `A2:A100`)"
|
||
},
|
||
{
|
||
"name": "options",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Options as a JSON array, e.g. `[\"opt1\",\"opt2\"]`. Server enforces no item-count cap and no per-item length cap; values containing commas are accepted (they are escape-encoded on the wire). For very large lists prefer `--source-range`.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "colors",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Per-option pill colors, RGB hex array (e.g. `[\"#1FB6C1\",\"#F006C2\"]`). Length may be shorter than the source (`--options` items / `--source-range` cells) — extras cycle through a 10-color palette — but never longer (CLI Validate rejects: `--colors length (N) must not exceed dropdown source size (M)`). **Applies on its own**; ignored when `--highlight=false`.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "multiple",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Enable multi-select; default `false`"
|
||
},
|
||
{
|
||
"name": "highlight",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Pill-highlight switch. **Omitted = ON** (options cycle through a 10-color palette). Pass `--highlight=false` for a plain dropdown. Override colors via `--colors`."
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Source range for listFromRange dropdown (A1 + sheet prefix, e.g. `'Sheet1'!T1:T3`); maps to server `data_validation.range` and auto-sets `data_validation.type='listFromRange'`. XOR with `--options`: pass `--options` for an inline list (type=list), pass this for a range reference (type=listFromRange). `--colors` length rule unchanged (≤ source range cell count); `--highlight` / `--multiple` behave the same. When `--highlight` is on and the source covers more than 2000 cells, the server flags the dropdown as option-error (highlight + large source is an unsupported combo); CLI emits a stderr warning. Pass `--highlight=false` to suppress."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+csv-put": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "start-cell",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Top-left A1 anchor (e.g. `A1`, `B5`; no sheet prefix — use `--sheet-id` / `--sheet-name` to select the sheet); must be a single cell, range notation not accepted; the bottom-right is inferred from CSV row/column counts",
|
||
"default": "A1"
|
||
},
|
||
{
|
||
"name": "csv",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "RFC 4180 CSV text; values or formulas (a leading = is evaluated as a formula); no styles / comments / images (use +cells-set for those).",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "allow-overwrite",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Allow overwriting (default true); set false to error if any target cell is non-empty",
|
||
"default": "true"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "alias for --start-cell (parity with +csv-get / +cells-set, which locate with --range); a range like A1:H17 collapses to its top-left cell",
|
||
"hidden": true
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+table-put": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL to write into (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token to write into (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheets",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Typed table payload (pandas-DataFrame-shaped) as JSON: top-level `{\"sheets\":[...]}`, with each array item a sub-sheet `{name, start_cell?, mode?, header?, allow_overwrite?, columns:[\"colA\",\"colB\",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` — `name` and the outer `sheets` envelope are both required. Agents typically use `df_to_sheet(df, name)` from `scripts/sheets_df.py` to pack each DataFrame into one item, then wrap the list in `{\"sheets\":[...]}`. `dtypes` values are pandas dtype strings (`int64`, `float64`, `Int64`, `bool`, `boolean`, `datetime64[ns]`, `object`, ...); the writer maps them to internal string/number/date/bool — omit `dtypes` and a column writes as text (good for raw CSV-shaped data). `formats[col]` is an Excel number_format string (e.g. `#,##0.00`, `0.0%`, `yyyy-mm`); when absent, date columns default to `yyyy-mm-dd` and string columns to text format (`@`).",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "styles",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Visual operations applied after the typed write, as JSON: top-level `{styles:[...]}`. Each item corresponds to one written sheet and must include `name`, plus at least one of `cell_styles` / `row_sizes` / `col_sizes` / `cell_merges`. `cell_styles` entries use +cells-set-style fields with a cell range; row/col sizes use dimension ranges plus type/size; merges use cell ranges plus optional merge_type. The styles array length/order/name must match the written sheets in --sheets.sheets. Run `+table-put --print-schema --flag-name styles` for the full cell_styles field schema.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-clear": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Range to clear (A1 notation)"
|
||
},
|
||
{
|
||
"name": "scope",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Clear scope: `content` (default, values only) / `formats` (formats only) / `all` (values and formats)",
|
||
"default": "content",
|
||
"enum": [
|
||
"content",
|
||
"formats",
|
||
"all"
|
||
]
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); clear is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-merge": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Range to merge / unmerge (A1 notation)"
|
||
},
|
||
{
|
||
"name": "merge-type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Merge direction (`+cells-merge` only)",
|
||
"default": "all",
|
||
"enum": [
|
||
"all",
|
||
"rows",
|
||
"columns"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-unmerge": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Range to merge / unmerge (A1 notation)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+rows-resize": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "height",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "xor",
|
||
"desc": "Uniform row height in pixels (e.g. 30 / 40 / 60; NOT points), used with `--range`. Passing --height implies pixel mode; --type may be omitted (or set to `pixel` — equivalent). For per-row heights use `--heights`",
|
||
"default": "0"
|
||
},
|
||
{
|
||
"name": "heights",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Per-row height map — set different heights for many rows in one batched call (fail-fast, no rollback). Keys: single row (`\"1\"`) or closed range (`\"2:20\"`); values: pixel height (e.g. 30 / 50), `\"auto\"` (fit content) or `\"standard\"` (reset to default). Units are pixels, NOT points. Mutually exclusive with `--range` / `--height` / `--type`",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sizing mode: `pixel` (requires `--height`) / `standard` (reset to default row height) / `auto` (fit content). Passing --height alone is the common form; `--type standard` / `--type auto` cannot be combined with `--height`",
|
||
"enum": [
|
||
"pixel",
|
||
"standard",
|
||
"auto"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Row closed range to resize; 1-based row numbers like `2:10` or `5` (single row). Required for the uniform form (with `--height` or `--type`); omit with the map form (`--heights`)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cols-resize": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "width",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "xor",
|
||
"desc": "Uniform column width in pixels (e.g. 80 / 120 / 200; NOT Excel character units), used with `--range`. Passing --width implies pixel mode; --type may be omitted (or set to `pixel` — equivalent). For per-column widths use `--widths`",
|
||
"default": "0"
|
||
},
|
||
{
|
||
"name": "widths",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Per-column width map — set different widths for many columns in one batched call (fail-fast, no rollback). Keys: single column (`\"A\"`) or closed range (`\"C:E\"`); values: pixel width (e.g. 80 / 120 / 200) or `\"standard\"` (reset to default). Units are pixels, NOT Excel character units (px ≈ chars × 8 + 16). Mutually exclusive with `--range` / `--width` / `--type`",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sizing mode: `pixel` (requires `--width`) / `standard` (reset to default column width). Passing --width alone is the common form; `--type standard` cannot be combined with `--width`",
|
||
"enum": [
|
||
"pixel",
|
||
"standard"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Column closed range to resize; column letters like `A:E` or `C` (single column). Required for the uniform form (with `--width` or `--type`); omit with the map form (`--widths`)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+range-move": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Source A1 range"
|
||
},
|
||
{
|
||
"name": "target-sheet-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Destination sub-sheet id; defaults to the same sheet as the source"
|
||
},
|
||
{
|
||
"name": "target-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Destination A1 range (anchor cell is enough; size inferred from the source)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+range-copy": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Source A1 range"
|
||
},
|
||
{
|
||
"name": "target-sheet-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Destination sub-sheet id; defaults to the same sheet as the source"
|
||
},
|
||
{
|
||
"name": "target-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Destination A1 range (anchor cell is enough; size inferred from the source)"
|
||
},
|
||
{
|
||
"name": "paste-type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Paste content type (`+range-copy` only)",
|
||
"default": "all",
|
||
"enum": [
|
||
"values",
|
||
"formulas",
|
||
"formats",
|
||
"all"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+range-fill": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Fill template range (seed cells for the series)"
|
||
},
|
||
{
|
||
"name": "target-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Destination fill range (A1 notation)"
|
||
},
|
||
{
|
||
"name": "series-type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Fill series type",
|
||
"default": "auto",
|
||
"enum": [
|
||
"auto",
|
||
"linear",
|
||
"growth",
|
||
"date",
|
||
"copy"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+range-sort": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Sort range (A1 notation; whether the header is included depends on `--has-header`)"
|
||
},
|
||
{
|
||
"name": "sort-keys",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "JSON array: `[{\"column\":\"<col letter>\",\"ascending\":<bool>}, ...]`",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "has-header",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Treat the first row as a header and exclude from sort; default `false`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+styles-put": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator (target sheets are named inside --styles items)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "styles",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Visual spec JSON applied to an EXISTING spreadsheet: top-level `{styles:[...]}`, one item per target sheet (`name` is the real sheet name), each giving at least one of `cell_styles` / `cell_merges` / `row_sizes` / `col_sizes` / `freeze`. The vocabulary is identical to `--styles` on `+workbook-create` / `+table-put` (cell_styles = A1 range + flat style fields, borders via the `border` shorthand {style,weight,color} applied to all four sides — border_styles only for per-side differences; row/col sizes = row/column range + size in px — type only for standard/auto; merges = cell range; freeze = `{rows:N, cols:N}`). The whole spec expands into one batched request (fail-fast, no rollback: applied sub-operations stay); ranges may target any region of the sheet",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Print the batched request template for each expanded operation; no network side effects"
|
||
}
|
||
]
|
||
},
|
||
"+batch-update": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator (independent from per-operation sheet locator)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator (independent from per-operation sheet locator)"
|
||
},
|
||
{
|
||
"name": "operations",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "JSON array: [{\"shortcut\":\"+xxx-yyy\",\"input\":{...}}, ...]. shortcut uses CLI names; input is that shortcut's flag set — it includes the per-operation sheet locator (sheet_id or sheet_name) but not the spreadsheet token/url (pass that once at the top level via --url/--spreadsheet-token; +batch-update has no top-level --sheet-id). input keys are the shortcut's flags flattened into JSON (e.g. \"range\":\"A11:B12\"), not another nested layer. For basic flags use lark-cli sheets <shortcut> --help; for composite JSON flags use --print-schema --flag-name <flag>. Do not pass an explicit operation field. Fail-fast by default: the first failure aborts the remaining operations and already-applied sub-operations are NOT rolled back (on \"N succeeded, M failed\" resend only the failed tail, not the whole batch); pass --continue-on-error to keep going past failures; no nesting; executed serially.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "continue-on-error",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Continue with remaining operations when a sub-operation fails; default false (abort on first failure)"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm high-risk write (exit code 10 without this flag)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Print the request template for each sub-operation; no network side effects"
|
||
}
|
||
]
|
||
},
|
||
"+cells-batch-set-style": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target ranges as a JSON array (up to 100 items, e.g. `[\"Sheet1!A1:B2\",\"Sheet2!D1:D10\"]`, prefix written bare without quotes); each prefix must exactly match the sheet display name (case-sensitive), not the sheet reference_id; ranges may target different sheets; the same style is applied to every range",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "background-color",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Background color (hex, e.g. `#ffffff`)"
|
||
},
|
||
{
|
||
"name": "font-color",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font color (hex, e.g. `#000000`)"
|
||
},
|
||
{
|
||
"name": "font-family",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font family name (e.g. `Arial`, `Microsoft YaHei`)"
|
||
},
|
||
{
|
||
"name": "font-size",
|
||
"kind": "own",
|
||
"type": "float64",
|
||
"required": "optional",
|
||
"desc": "Font size in px (e.g. 10, 12, 14)"
|
||
},
|
||
{
|
||
"name": "font-style",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font style",
|
||
"enum": [
|
||
"normal",
|
||
"italic"
|
||
]
|
||
},
|
||
{
|
||
"name": "font-weight",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font weight",
|
||
"enum": [
|
||
"normal",
|
||
"bold"
|
||
]
|
||
},
|
||
{
|
||
"name": "font-line",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Font line style",
|
||
"enum": [
|
||
"none",
|
||
"underline",
|
||
"line-through"
|
||
]
|
||
},
|
||
{
|
||
"name": "horizontal-alignment",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Horizontal alignment",
|
||
"enum": [
|
||
"left",
|
||
"center",
|
||
"right"
|
||
]
|
||
},
|
||
{
|
||
"name": "vertical-alignment",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Vertical alignment",
|
||
"enum": [
|
||
"top",
|
||
"middle",
|
||
"bottom"
|
||
]
|
||
},
|
||
{
|
||
"name": "word-wrap",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Word-wrap strategy",
|
||
"enum": [
|
||
"overflow",
|
||
"auto-wrap",
|
||
"word-clip"
|
||
]
|
||
},
|
||
{
|
||
"name": "number-format",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Number format pattern (e.g. text `@`, number `0.00`, currency `$#,##0.00`, date `mm/dd/yyyy`)"
|
||
},
|
||
{
|
||
"name": "border-styles",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Border config JSON (same shape as in +cells-set-style): `{ top|bottom|left|right|all: {style,weight,color} }`; style = solid|dashed|dotted|double|none, weight = thin|medium|thick (string), color = hex like #000000",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dropdown-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target ranges as a JSON array (up to 100 items, e.g. `[\"Sheet1!A2:A100\",\"Sheet1!C2:C100\"]`, prefix written bare without quotes); each item must include a sheet prefix; the prefix must exactly match the sheet display name (case-sensitive), not the sheet reference_id",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "options",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Options as a JSON array, e.g. `[\"opt1\",\"opt2\"]`. Server enforces no item-count cap and no per-item length cap; values containing commas are accepted (they are escape-encoded on the wire). For very large lists prefer `--source-range`.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "colors",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Per-option pill colors, RGB hex array (e.g. `[\"#1FB6C1\",\"#F006C2\"]`). Length may be shorter than the source (`--options` items / `--source-range` cells) — extras cycle through a 10-color palette — but never longer (CLI Validate rejects: `--colors length (N) must not exceed dropdown source size (M)`). **Applies on its own**; ignored when `--highlight=false`.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "multiple",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Enable multi-select"
|
||
},
|
||
{
|
||
"name": "highlight",
|
||
"kind": "own",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Pill-highlight switch. **Omitted = ON** (options cycle through a 10-color palette). Pass `--highlight=false` for a plain dropdown. Override colors via `--colors`."
|
||
},
|
||
{
|
||
"name": "source-range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Source range for listFromRange dropdown (A1 + sheet prefix, e.g. `'Sheet1'!T1:T3`); maps to server `data_validation.range` and auto-sets `data_validation.type='listFromRange'`. XOR with `--options`: pass `--options` for an inline list (type=list), pass this for a range reference (type=listFromRange). `--colors` length rule unchanged (≤ source range cell count); `--highlight` / `--multiple` behave the same. When `--highlight` is on and the source covers more than 2000 cells, the server flags the dropdown as option-error (highlight + large source is an unsupported combo); CLI emits a stderr warning. Pass `--highlight=false` to suppress."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+dropdown-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target ranges as a JSON array (up to 100 items, e.g. `[\"Sheet1!E2:E6\"]`, prefix written bare without quotes); each item must include a sheet prefix; the prefix must exactly match the sheet display name (case-sensitive), not the sheet reference_id",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm high-risk write (exit code 10 without this flag)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cells-batch-clear": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target ranges as a JSON array (up to 100 items, e.g. `[\"Sheet1!A2:Z1000\",\"Sheet2!A2:Z1000\"]`, prefix written bare without quotes); each prefix must exactly match the sheet display name (case-sensitive), not the sheet reference_id; ranges may target different sheets; the same scope is cleared from every range",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "scope",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Clear scope: `content` (default, values only) / `formats` (formats only) / `all` (values and formats)",
|
||
"default": "content",
|
||
"enum": [
|
||
"content",
|
||
"formats",
|
||
"all"
|
||
]
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); batch clear is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+chart-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "chart-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter to a single chart reference_id"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+chart-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Full chart config JSON. Top-level keys: `position` / `offset` / `size` / `snapshot` (no top-level `data`, no extra nested `properties`); chart data config lives under `snapshot.data` (`refs` / `headerMode` / `dim1` / `dim2`); must include at least one of `snapshot.data.dim1.serie.index` or `dim2.series[].index`, otherwise the server rejects it. Deeply nested — run `--print-schema --flag-name properties` for the full structure.",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "print-example",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Print a minimal ready-to-edit --properties template for a chart type (area|bar|column|combo|line|pie|radar|scatter) and exit. Purely local: no locator flags, no network; an unknown type lists the available ones"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": "Print the request template; no side effects"
|
||
}
|
||
]
|
||
},
|
||
"+chart-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "chart-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target chart reference_id"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Full or sufficiently complete chart config JSON (read back with `+chart-list` first, then patch)",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+chart-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "chart-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target chart reference_id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+pivot-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "pivot-table-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter by id"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+pivot-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "JSON: {\"rows\":[...],\"columns\":[...],\"values\":[...],\"filters\":[...],\"show_row_grand_total\":true,\"show_col_grand_total\":true} (data source goes through --source; do not put source here)",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "target-position",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Top-left cell within the target sub-sheet (A1 notation, e.g. `A1`); maps to the top-level `target_position`, default `A1` (not sent when the value is A1). It and `--range` both express placement but map to different wire fields — avoid passing conflicting values for both.",
|
||
"default": "A1"
|
||
},
|
||
{
|
||
"name": "target-sheet-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Reference_id of the target sub-sheet where the pivot table will be placed (mutually exclusive with `--target-sheet-name`; takes priority when both given; when both omitted, a new sub-sheet is auto-created to host the pivot — recommended). Distinct from the data-source sheet, which lives inside --source as a 'Sheet'-prefixed A1 reference like 'Sheet1'!A1:D100."
|
||
},
|
||
{
|
||
"name": "target-sheet-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Name of the target sub-sheet where the pivot table will be placed (mutually exclusive with `--target-sheet-id`; when both omitted, a new sub-sheet is auto-created to host the pivot — recommended). Distinct from the data-source sheet, which lives inside --source as a 'Sheet'-prefixed A1 reference like 'Sheet1'!A1:D100."
|
||
},
|
||
{
|
||
"name": "source",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Pivot table source range (A1 notation; format `'SheetName'!StartCell:EndCell`, e.g. `'Sheet1'!A1:D100`)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Pivot table top-left placement (single A1 value, e.g. `F1`; create only), maps to `properties.range`; placed at the top-left of the target sub-sheet (a newly created one by default) when omitted. It and `--target-position` both express placement but map to different wire fields — avoid passing conflicting values for both."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+pivot-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "pivot-table-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target pivot table id"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Full or sufficiently complete pivot config (read back with `+pivot-list --pivot-table-id <id>` first, then patch)",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+pivot-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "pivot-table-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target pivot table id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); delete is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cond-format-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "rule-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter by rule id"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cond-format-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Rule config JSON: `style` (required, applied on match), `attrs?` (rule-type-dependent params), `has_ref?`. `rule_type` and `ranges` are separate flags",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "rule-type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Conditional format rule type; takes precedence over the same-named field inside `--properties`",
|
||
"enum": [
|
||
"duplicateValues",
|
||
"uniqueValues",
|
||
"cellIs",
|
||
"containsText",
|
||
"timePeriod",
|
||
"containsBlanks",
|
||
"notContainsBlanks",
|
||
"dataBar",
|
||
"colorScale",
|
||
"rank",
|
||
"aboveAverage",
|
||
"expression",
|
||
"iconSet"
|
||
]
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "A1 ranges where the conditional format applies, as a JSON array (e.g. `[\"A1:A100\",\"C2:C50\"]`); takes precedence over the same-named field inside `--properties`",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cond-format-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "rule-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target rule id"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Rule config JSON, same shape as `+cond-format-create --properties`; update overwrites the entire rule",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "rule-type",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Conditional format rule type; takes precedence over the same-named field inside `--properties`",
|
||
"enum": [
|
||
"duplicateValues",
|
||
"uniqueValues",
|
||
"cellIs",
|
||
"containsText",
|
||
"timePeriod",
|
||
"containsBlanks",
|
||
"notContainsBlanks",
|
||
"dataBar",
|
||
"colorScale",
|
||
"rank",
|
||
"aboveAverage",
|
||
"expression",
|
||
"iconSet"
|
||
]
|
||
},
|
||
{
|
||
"name": "ranges",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "A1 ranges where the conditional format applies, as a JSON array (e.g. `[\"A1:A100\",\"C2:C50\"]`); takes precedence over the same-named field inside `--properties`",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+cond-format-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "rule-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target rule id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); delete is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Filter range (A1 notation, including header row, e.g. `A1:F1000`); do not duplicate the range field inside `--properties`"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter rule JSON: `rules` (per-column rule array), `filtered_columns?` (active column index hint). The flag is optional overall — if provided, `rules` must be non-empty; if omitted, an empty filter is created on `--range` (no column conditions). `range` is a separate flag (do not duplicate inside this JSON)",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Filter rule JSON: `rules` and `filtered_columns?`; update overwrites the entire rule set (pass `rules: []` to clear). `range` is a separate flag",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Range the filter applies to (A1 notation, e.g. `A1:F1000`); takes precedence over the same-named field inside `--properties`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); delete is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-view-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "view-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter by filter-view reference_id (returns the matching single view)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-view-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Filter-view rule JSON: `rules?` (per-column rule array), `filtered_columns?`. `range` and `view_name` are separate flags",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Range the filter view applies to (A1 notation, e.g. `A1:F1000`); takes precedence over the same-named field inside `--properties`; required on create and must cover the header row"
|
||
},
|
||
{
|
||
"name": "view-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter-view name; auto-assigned by the server when omitted; takes precedence over the same-named field inside `--properties`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-view-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "view-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target filter-view reference_id"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Filter-view rule JSON: `rules?`, `filtered_columns?`; update overwrites the entire rule set (read back with `+filter-view-list` first, then patch; pass `rules: []` to clear). `range` and `view_name` are separate flags",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "range",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Range the filter view applies to (A1 notation, e.g. `A1:F1000`); takes precedence over the same-named field inside `--properties`; omit to keep the current range on update"
|
||
},
|
||
{
|
||
"name": "view-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter-view name; auto-assigned by the server when omitted on create, kept unchanged when omitted on update; takes precedence over the same-named field inside `--properties`"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+filter-view-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "view-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target filter-view reference_id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm high-risk write (exit code 10 without this flag)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sparkline-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "group-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter by group_id"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sparkline-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "JSON: `{config (shared style), sparklines (array of mini-charts)}`; run `--print-schema` for the full structure",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sparkline-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "group-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target group id"
|
||
},
|
||
{
|
||
"name": "properties",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "JSON: `{config, sparklines}`; read back with `+sparkline-list --group-id <id>` first, then patch; run `--print-schema` for the full structure",
|
||
"input": [
|
||
"file",
|
||
"stdin"
|
||
]
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+sparkline-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "group-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target group id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); delete is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+float-image-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "float-image-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Filter by id; lists all float images on the sheet when omitted"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+float-image-create": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "image-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Image name, including extension (e.g. `logo.png`)"
|
||
},
|
||
{
|
||
"name": "image-token",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Image file_token (XOR with `--image-uri`). Common source: `image_token` returned by `+float-image-list`"
|
||
},
|
||
{
|
||
"name": "image-uri",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Image URI handle returned by the upload flow (not a sheet object reference_id; XOR with `--image-token`); converted to file_token automatically"
|
||
},
|
||
{
|
||
"name": "position-row",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Row anchor of the image's top-left corner (0-based)"
|
||
},
|
||
{
|
||
"name": "position-col",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Column anchor of the image's top-left corner (column letter, e.g. `A` / `B`)"
|
||
},
|
||
{
|
||
"name": "size-width",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Image width in pixels"
|
||
},
|
||
{
|
||
"name": "size-height",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Image height in pixels"
|
||
},
|
||
{
|
||
"name": "offset-row",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Pixel offset within the anchor row, on top of `--position-row`"
|
||
},
|
||
{
|
||
"name": "offset-col",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Pixel offset within the anchor column, on top of `--position-col`"
|
||
},
|
||
{
|
||
"name": "z-index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Image z-index controlling stacking order"
|
||
},
|
||
{
|
||
"name": "image",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Local image path; the CLI uploads it as a sheet_image and uses the returned file_token (XOR with --image-token / --image-uri)"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+float-image-update": {
|
||
"risk": "write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "float-image-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target float image id"
|
||
},
|
||
{
|
||
"name": "image-name",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Image name, including extension (e.g. `logo.png`)"
|
||
},
|
||
{
|
||
"name": "image-token",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Optional image file_token; mutually exclusive with `--image-uri`; omit both to keep the current image. Common source: `image_token` returned by `+float-image-list`"
|
||
},
|
||
{
|
||
"name": "image-uri",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "optional",
|
||
"desc": "Optional image URI handle returned by the upload flow (not a sheet object reference_id); mutually exclusive with `--image-token`; omit both to keep the current image; converted to file_token automatically"
|
||
},
|
||
{
|
||
"name": "position-row",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Row anchor of the image's top-left corner (0-based)"
|
||
},
|
||
{
|
||
"name": "position-col",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Column anchor of the image's top-left corner (column letter, e.g. `A` / `B`)"
|
||
},
|
||
{
|
||
"name": "size-width",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Image width in pixels"
|
||
},
|
||
{
|
||
"name": "size-height",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Image height in pixels"
|
||
},
|
||
{
|
||
"name": "offset-row",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Pixel offset within the anchor row, on top of `--position-row`"
|
||
},
|
||
{
|
||
"name": "offset-col",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Pixel offset within the anchor column, on top of `--position-col`"
|
||
},
|
||
{
|
||
"name": "z-index",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Image z-index controlling stacking order"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+float-image-delete": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "sheet-id",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet reference_id — required: pass this or `--sheet-name` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "sheet-name",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Sheet name — required: pass this or `--sheet-id` (exactly one of the two)"
|
||
},
|
||
{
|
||
"name": "float-image-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Target float image id"
|
||
},
|
||
{
|
||
"name": "yes",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "required",
|
||
"desc": "Confirm destructive write (exit code 10 without this flag); delete is irreversible"
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+history-list": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "end-version",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "Max version to query (descending pagination). Omit on the first call; pass next_end_version from the previous response."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+history-revert": {
|
||
"risk": "high-risk-write",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "history-version-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "History version to revert to (from +history-list)."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+history-revert-status": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet locator"
|
||
},
|
||
{
|
||
"name": "transaction-id",
|
||
"kind": "own",
|
||
"type": "string",
|
||
"required": "required",
|
||
"desc": "Async revert transaction id (from +history-revert)."
|
||
},
|
||
{
|
||
"name": "dry-run",
|
||
"kind": "system",
|
||
"type": "bool",
|
||
"required": "optional",
|
||
"desc": ""
|
||
}
|
||
]
|
||
},
|
||
"+changeset-get": {
|
||
"risk": "read",
|
||
"flags": [
|
||
{
|
||
"name": "url",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet URL (XOR with `--spreadsheet-token`)"
|
||
},
|
||
{
|
||
"name": "spreadsheet-token",
|
||
"kind": "public",
|
||
"type": "string",
|
||
"required": "xor",
|
||
"desc": "Spreadsheet token (XOR with `--url`)"
|
||
},
|
||
{
|
||
"name": "start-revision",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "required",
|
||
"desc": "Start version (CS revision); the before baseline for review (must be >= 1)"
|
||
},
|
||
{
|
||
"name": "end-revision",
|
||
"kind": "own",
|
||
"type": "int",
|
||
"required": "optional",
|
||
"desc": "End version (CS revision); defaults to the latest revision. Gap (end-start+1) must be <= 20",
|
||
"default": "-1"
|
||
}
|
||
]
|
||
}
|
||
}
|