gogcli/internal/cmd/sheets_resize.go
2026-03-09 03:33:30 +00:00

170 lines
5.2 KiB
Go

package cmd
import (
"context"
"fmt"
"strings"
"google.golang.org/api/sheets/v4"
)
type SheetsResizeColumnsCmd struct {
SpreadsheetID string `arg:"" name:"spreadsheetId" help:"Spreadsheet ID"`
Columns string `arg:"" name:"columns" help:"Columns range (eg. Sheet1!A:C)"`
Width int64 `name:"width" help:"Column width in pixels"`
Auto bool `name:"auto" help:"Auto-fit columns to content"`
}
func (c *SheetsResizeColumnsCmd) Run(ctx context.Context, flags *RootFlags) error {
spreadsheetID := normalizeGoogleID(strings.TrimSpace(c.SpreadsheetID))
columnsSpec := cleanRange(c.Columns)
if spreadsheetID == "" {
return usage("empty spreadsheetId")
}
if strings.TrimSpace(columnsSpec) == "" {
return usage("empty columns")
}
if c.Auto && c.Width > 0 {
return usage("use either --width or --auto")
}
if !c.Auto && c.Width <= 0 {
return usage("--width must be > 0 when --auto is not set")
}
span, err := parseColumnsSpan(columnsSpec, "columns")
if err != nil {
return err
}
return runSheetsMutation(ctx, flags, "sheets.resize-columns", map[string]any{
"spreadsheet_id": spreadsheetID,
"columns": columnsSpec,
"sheet": span.SheetName,
"start_index": span.StartIndex,
"end_index": span.EndIndex,
"auto": c.Auto,
"width": c.Width,
}, func(ctx context.Context, svc *sheets.Service) (map[string]any, string, error) {
sheetID, resolvedSheet, err := resolveSheetIDByNameOrFirst(ctx, svc, spreadsheetID, span.SheetName)
if err != nil {
return nil, "", err
}
dimRange := &sheets.DimensionRange{
SheetId: sheetID,
Dimension: "COLUMNS",
StartIndex: span.StartIndex,
EndIndex: span.EndIndex,
}
forceSendDimensionRangeZeroes(dimRange)
request := &sheets.Request{}
if c.Auto {
request.AutoResizeDimensions = &sheets.AutoResizeDimensionsRequest{
Dimensions: dimRange,
}
} else {
request.UpdateDimensionProperties = &sheets.UpdateDimensionPropertiesRequest{
Range: dimRange,
Properties: &sheets.DimensionProperties{
PixelSize: c.Width,
},
Fields: "pixelSize",
}
}
req := &sheets.BatchUpdateSpreadsheetRequest{Requests: []*sheets.Request{request}}
if err := applySheetsBatchUpdate(ctx, svc, spreadsheetID, req); err != nil {
return nil, "", err
}
text := fmt.Sprintf("Resized columns %s to %dpx", columnsSpec, c.Width)
if c.Auto {
text = fmt.Sprintf("Auto-resized columns %s", columnsSpec)
}
return map[string]any{
"sheet": resolvedSheet,
"sheet_id": sheetID,
"start_index": span.StartIndex,
"end_index": span.EndIndex,
"auto": c.Auto,
"width": c.Width,
}, text, nil
})
}
type SheetsResizeRowsCmd struct {
SpreadsheetID string `arg:"" name:"spreadsheetId" help:"Spreadsheet ID"`
Rows string `arg:"" name:"rows" help:"Rows range (eg. Sheet1!1:10)"`
Height int64 `name:"height" help:"Row height in pixels"`
Auto bool `name:"auto" help:"Auto-fit rows to content"`
}
func (c *SheetsResizeRowsCmd) Run(ctx context.Context, flags *RootFlags) error {
spreadsheetID := normalizeGoogleID(strings.TrimSpace(c.SpreadsheetID))
rowsSpec := cleanRange(c.Rows)
if spreadsheetID == "" {
return usage("empty spreadsheetId")
}
if strings.TrimSpace(rowsSpec) == "" {
return usage("empty rows")
}
if c.Auto && c.Height > 0 {
return usage("use either --height or --auto")
}
if !c.Auto && c.Height <= 0 {
return usage("--height must be > 0 when --auto is not set")
}
span, err := parseRowsSpan(rowsSpec, "rows")
if err != nil {
return err
}
return runSheetsMutation(ctx, flags, "sheets.resize-rows", map[string]any{
"spreadsheet_id": spreadsheetID,
"rows": rowsSpec,
"sheet": span.SheetName,
"start_index": span.StartIndex,
"end_index": span.EndIndex,
"auto": c.Auto,
"height": c.Height,
}, func(ctx context.Context, svc *sheets.Service) (map[string]any, string, error) {
sheetID, resolvedSheet, err := resolveSheetIDByNameOrFirst(ctx, svc, spreadsheetID, span.SheetName)
if err != nil {
return nil, "", err
}
dimRange := &sheets.DimensionRange{
SheetId: sheetID,
Dimension: "ROWS",
StartIndex: span.StartIndex,
EndIndex: span.EndIndex,
}
forceSendDimensionRangeZeroes(dimRange)
request := &sheets.Request{}
if c.Auto {
request.AutoResizeDimensions = &sheets.AutoResizeDimensionsRequest{
Dimensions: dimRange,
}
} else {
request.UpdateDimensionProperties = &sheets.UpdateDimensionPropertiesRequest{
Range: dimRange,
Properties: &sheets.DimensionProperties{PixelSize: c.Height},
Fields: "pixelSize",
}
}
req := &sheets.BatchUpdateSpreadsheetRequest{Requests: []*sheets.Request{request}}
if err := applySheetsBatchUpdate(ctx, svc, spreadsheetID, req); err != nil {
return nil, "", err
}
text := fmt.Sprintf("Resized rows %s to %dpx", rowsSpec, c.Height)
if c.Auto {
text = fmt.Sprintf("Auto-resized rows %s", rowsSpec)
}
return map[string]any{
"sheet": resolvedSheet,
"sheet_id": sheetID,
"start_index": span.StartIndex,
"end_index": span.EndIndex,
"auto": c.Auto,
"height": c.Height,
}, text, nil
})
}