import * as z from "zod" import { defineAction } from "../../../automation/actions" import { toGoogleBandingProperties } from "../lib/formatting" import { getGoogleSheetsApi, normalizeBandedRange, normalizeSpreadsheetId, resolveGridRange, } from "../lib/google-sheets" import { GOOGLE_SHEETS_WRITE_REQUIREMENT } from "../lib/scopes" import { BANDED_RANGE_SCHEMA, BANDING_PROPERTIES_SCHEMA, GRID_RANGE_SCHEMA, SPREADSHEET_REFERENCE_SCHEMA, } from "../lib/schemas" /** Adds alternating row or column colors to an ordinary grid range. */ export const createGoogleSheetsBandedRange = defineAction( "Create Google Sheets banded range", ) .describe("Adds row or column banding to a grid range.") .account("google", GOOGLE_SHEETS_WRITE_REQUIREMENT) .input( z .object({ /** Optional caller-selected numeric ID. */ bandedRangeId: z.number().int().optional(), /** Column-by-column band colors. */ columns: BANDING_PROPERTIES_SCHEMA.optional(), /** One-based structured grid range. */ range: GRID_RANGE_SCHEMA, /** Row-by-row band colors. */ rows: BANDING_PROPERTIES_SCHEMA.optional(), /** Spreadsheet ID or standard Google Sheets URL. */ spreadsheet: SPREADSHEET_REFERENCE_SCHEMA, }) .refine( ({ columns, rows }) => columns !== undefined || rows !== undefined, "Row or column banding must be supplied.", ), ) .output(BANDED_RANGE_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const sheetsApi = getGoogleSheetsApi(account.secret) const spreadsheetId = normalizeSpreadsheetId(input.spreadsheet) const { data } = await sheetsApi.spreadsheets.batchUpdate({ requestBody: { requests: [ { addBanding: { bandedRange: { bandedRangeId: input.bandedRangeId, columnProperties: input.columns ? toGoogleBandingProperties(input.columns) : undefined, range: await resolveGridRange( sheetsApi, spreadsheetId, input.range, ), rowProperties: input.rows ? toGoogleBandingProperties(input.rows) : undefined, }, }, }, ], }, spreadsheetId, }) const bandedRange = data.replies?.[0]?.addBanding?.bandedRange if (!bandedRange) { throw new Error("Google did not return the created banded range.") } return normalizeBandedRange(bandedRange) })