import * as z from "zod" import { defineAction } from "../../../automation/actions" import { toGoogleFormatRequests } from "../lib/formatting" import { getGoogleSheetsApi, normalizeSpreadsheetId, resolveRangeTarget, } from "../lib/google-sheets" import { GOOGLE_SHEETS_WRITE_REQUIREMENT } from "../lib/scopes" import { CELL_FORMAT_SCHEMA, NORMALIZED_GRID_RANGE_SCHEMA, RANGE_TARGET_SCHEMA, SPREADSHEET_REFERENCE_SCHEMA, } from "../lib/schemas" /** Applies cell formatting to a structured range or native-table section. */ export const formatGoogleSheetsRange = defineAction( "Format Google Sheets range", ) .describe("Applies cell, text, border, and number formatting.") .account("google", GOOGLE_SHEETS_WRITE_REQUIREMENT) .input( z.object({ /** Formatting properties to merge into every targeted cell. */ format: CELL_FORMAT_SCHEMA, /** One-based grid range or native-table section. */ range: RANGE_TARGET_SCHEMA, /** Spreadsheet ID or standard Google Sheets URL. */ spreadsheet: SPREADSHEET_REFERENCE_SCHEMA, }), ) .output(NORMALIZED_GRID_RANGE_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const sheetsApi = getGoogleSheetsApi(account.secret) const spreadsheetId = normalizeSpreadsheetId(input.spreadsheet) const range = await resolveRangeTarget( sheetsApi, spreadsheetId, input.range, ) await sheetsApi.spreadsheets.batchUpdate({ requestBody: { requests: toGoogleFormatRequests(input.format, range), }, spreadsheetId, }) return range })