import * as z from "zod" import { defineAction } from "../../../automation/actions" import { assertSourceRowNumbers, buildA1Range, getGoogleSheetsApi, normalizeRows, normalizeSpreadsheetId, resolveRowSource, toGoogleValueRender, } from "../lib/google-sheets" import { GOOGLE_SHEETS_READ_REQUIREMENT } from "../lib/scopes" import { ROW_SOURCE_SCHEMA, SHEET_ROW_SCHEMA, SPREADSHEET_REFERENCE_SCHEMA, VALUE_RENDER_SCHEMA, } from "../lib/schemas" /** Gets explicitly numbered rows as header-keyed records. */ export const getGoogleSheetsRows = defineAction("Get Google Sheets rows") .describe("Gets specific sheet rows and maps values to exact headers.") .account("google", GOOGLE_SHEETS_READ_REQUIREMENT) .input( z.object({ /** One or more one-based row numbers. */ rowNumbers: z.union([ z.number().int().positive(), z.number().int().positive().array().min(1).max(1000), ]), /** Header-backed sheet or native table. */ source: ROW_SOURCE_SCHEMA, /** Spreadsheet ID or standard Google Sheets URL. */ spreadsheet: SPREADSHEET_REFERENCE_SCHEMA, /** How formulas and formatted cells are represented. */ valueRender: VALUE_RENDER_SCHEMA.optional(), }), ) .output(SHEET_ROW_SCHEMA.array()) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => { const sheetsApi = getGoogleSheetsApi(account.secret) const spreadsheetId = normalizeSpreadsheetId(input.spreadsheet) const source = await resolveRowSource( sheetsApi, spreadsheetId, input.source, ) const rowNumbers = Array.isArray(input.rowNumbers) ? input.rowNumbers : [input.rowNumbers] assertSourceRowNumbers(source, rowNumbers) const { data } = await sheetsApi.spreadsheets.values.batchGet({ majorDimension: "ROWS", ranges: rowNumbers.map((rowNumber) => buildA1Range(source.sheetTitle, { endColumn: source.columnCount, endRow: rowNumber, startColumn: 1, startRow: rowNumber, }), ), spreadsheetId, valueRenderOption: toGoogleValueRender(input.valueRender), }) return rowNumbers.map( (rowNumber, index) => normalizeRows( [data.valueRanges?.[index]?.values?.[0] ?? []], source, rowNumber, )[0]!, ) })