import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getGoogleSheetsApi, normalizeSheet, normalizeSpreadsheetId, resolveSheet, } from "../lib/google-sheets" import { GOOGLE_SHEETS_WRITE_REQUIREMENT } from "../lib/scopes" import { SHEET_REFERENCE_SCHEMA, SHEET_SCHEMA, SPREADSHEET_REFERENCE_SCHEMA, } from "../lib/schemas" /** Updates a sheet's title, position, visibility, direction, or grid size. */ export const updateGoogleSheet = defineAction("Update Google sheet") .describe("Updates the common properties of one Google sheet.") .account("google", GOOGLE_SHEETS_WRITE_REQUIREMENT) .input( z .object({ /** New allocated column count. */ columnCount: z.number().int().positive().optional(), /** New frozen-column count. */ frozenColumnCount: z.number().int().nonnegative().optional(), /** New frozen-row count. */ frozenRowCount: z.number().int().nonnegative().optional(), /** Whether the sheet is hidden. */ hidden: z.boolean().optional(), /** New zero-based display position. */ index: z.number().int().nonnegative().optional(), /** Whether columns lay out right-to-left. */ rightToLeft: z.boolean().optional(), /** New allocated row count. */ rowCount: z.number().int().positive().optional(), /** Sheet title or immutable numeric sheet ID. */ sheet: SHEET_REFERENCE_SCHEMA, /** Spreadsheet ID or standard Google Sheets URL. */ spreadsheet: SPREADSHEET_REFERENCE_SCHEMA, /** New human-readable sheet title. */ title: z.string().trim().min(1).optional(), }) .refine( ({ columnCount, frozenColumnCount, frozenRowCount, hidden, index, rightToLeft, rowCount, title, }) => [ columnCount, frozenColumnCount, frozenRowCount, hidden, index, rightToLeft, rowCount, title, ].some((value) => value !== undefined), "At least one sheet property must be updated.", ), ) .output(SHEET_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => { const spreadsheetId = normalizeSpreadsheetId(input.spreadsheet) const sheetsApi = getGoogleSheetsApi(account.secret) const existing = await resolveSheet(sheetsApi, spreadsheetId, input.sheet) await sheetsApi.spreadsheets.batchUpdate({ requestBody: { requests: [ { updateSheetProperties: { fields: [ input.columnCount === undefined ? undefined : "gridProperties.columnCount", input.frozenColumnCount === undefined ? undefined : "gridProperties.frozenColumnCount", input.frozenRowCount === undefined ? undefined : "gridProperties.frozenRowCount", input.hidden === undefined ? undefined : "hidden", input.index === undefined ? undefined : "index", input.rightToLeft === undefined ? undefined : "rightToLeft", input.rowCount === undefined ? undefined : "gridProperties.rowCount", input.title === undefined ? undefined : "title", ] .filter((field) => field !== undefined) .join(","), properties: { gridProperties: { columnCount: input.columnCount, frozenColumnCount: input.frozenColumnCount, frozenRowCount: input.frozenRowCount, rowCount: input.rowCount, }, hidden: input.hidden, index: input.index, rightToLeft: input.rightToLeft, sheetId: existing.properties!.sheetId!, title: input.title, }, }, }, ], }, spreadsheetId, }) return normalizeSheet( await resolveSheet( sheetsApi, spreadsheetId, existing.properties!.sheetId!, ), ) })