From 9c133d52fa7d58f08c4cdfe3d7addb70b05a96e2 Mon Sep 17 00:00:00 2001 From: Omri Ariav Date: Thu, 19 Feb 2026 23:46:30 +0200 Subject: [PATCH 1/2] fix(sheets): PIE chart domain/series split, conditional format --value validation, negative index guard - add-chart PIE: split data range into separate domain (first column) and series (remaining columns) instead of passing the same full range for both, which produced incorrect chart data. - add-conditional-format: validate that --value is provided for rule types that require it (>, <, =, !=, contains, not-contains, formula). Previously the empty value was silently sent to the API. - delete-conditional-format: reject negative --index values before the API call. Co-Authored-By: Claude Opus 4.6 --- cmd/sheets.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/cmd/sheets.go b/cmd/sheets.go index 4c34b41..6a69b27 100644 --- a/cmd/sheets.go +++ b/cmd/sheets.go @@ -2612,9 +2612,24 @@ func runSheetsAddChart(cmd *cobra.Command, args []string) error { spec := &sheets.ChartSpec{Title: title} if chartType == "PIE" { + // PIE: first column = labels (domain), remaining columns = data (series) + domainRange := &sheets.GridRange{ + SheetId: gridRange.SheetId, + StartRowIndex: gridRange.StartRowIndex, + EndRowIndex: gridRange.EndRowIndex, + StartColumnIndex: gridRange.StartColumnIndex, + EndColumnIndex: gridRange.StartColumnIndex + 1, + } + seriesRange := &sheets.GridRange{ + SheetId: gridRange.SheetId, + StartRowIndex: gridRange.StartRowIndex, + EndRowIndex: gridRange.EndRowIndex, + StartColumnIndex: gridRange.StartColumnIndex + 1, + EndColumnIndex: gridRange.EndColumnIndex, + } spec.PieChart = &sheets.PieChartSpec{ - Domain: chartData, - Series: &sheets.ChartData{SourceRange: sourceRange}, + Domain: &sheets.ChartData{SourceRange: &sheets.ChartSourceRange{Sources: []*sheets.GridRange{domainRange}}}, + Series: &sheets.ChartData{SourceRange: &sheets.ChartSourceRange{Sources: []*sheets.GridRange{seriesRange}}}, } } else { spec.BasicChart = &sheets.BasicChartSpec{ @@ -2823,6 +2838,12 @@ func runSheetsAddConditionalFormat(cmd *cobra.Command, args []string) error { return p.PrintError(err) } + // Validate --value is provided for rules that require it + needsValue := map[string]bool{">": true, "<": true, "=": true, "!=": true, "contains": true, "not-contains": true, "formula": true} + if needsValue[rule] && value == "" { + return p.PrintError(fmt.Errorf("--value is required for rule type %q", rule)) + } + _, gridRange, err := parseRange(svc, spreadsheetID, rangeStr) if err != nil { return p.PrintError(err) @@ -3016,6 +3037,10 @@ func runSheetsDeleteConditionalFormat(cmd *cobra.Command, args []string) error { sheetName, _ := cmd.Flags().GetString("sheet") index, _ := cmd.Flags().GetInt64("index") + if index < 0 { + return p.PrintError(fmt.Errorf("--index must be >= 0, got %d", index)) + } + sheetID, err := getSheetID(svc, spreadsheetID, sheetName) if err != nil { return p.PrintError(err) From a2c46ede37293b0321d64e42ca51ac803ea02bdb Mon Sep 17 00:00:00 2001 From: Omri Ariav Date: Thu, 19 Feb 2026 23:50:50 +0200 Subject: [PATCH 2/2] fix(sheets): guard PIE chart against single-column range PIE charts require at least 2 columns (labels + data). A single-column range would produce an empty series range, causing an opaque API error. Now fails fast with a clear message. Co-Authored-By: Claude Opus 4.6 --- cmd/sheets.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/sheets.go b/cmd/sheets.go index 6a69b27..18d67b1 100644 --- a/cmd/sheets.go +++ b/cmd/sheets.go @@ -2613,6 +2613,9 @@ func runSheetsAddChart(cmd *cobra.Command, args []string) error { if chartType == "PIE" { // PIE: first column = labels (domain), remaining columns = data (series) + if gridRange.EndColumnIndex-gridRange.StartColumnIndex < 2 { + return p.PrintError(fmt.Errorf("PIE chart requires at least 2 columns (labels + data), got range with %d column(s)", gridRange.EndColumnIndex-gridRange.StartColumnIndex)) + } domainRange := &sheets.GridRange{ SheetId: gridRange.SheetId, StartRowIndex: gridRange.StartRowIndex,