import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getGoogleSheetsApi, normalizeSpreadsheetId, normalizeValueRange, toGoogleDateTimeRender, toGoogleMajorDimension, toGoogleValueRender, } from "../lib/google-sheets" import { GOOGLE_SHEETS_READ_REQUIREMENT } from "../lib/scopes" import { DATE_TIME_RENDER_SCHEMA, MAJOR_DIMENSION_SCHEMA, SPREADSHEET_REFERENCE_SCHEMA, VALUE_RANGE_SCHEMA, VALUE_RENDER_SCHEMA, } from "../lib/schemas" /** Reads one or more A1 ranges in a single Sheets API request. */ export const readGoogleSheetsValues = defineAction("Read Google Sheets values") .describe("Reads one or more ranges as row- or column-major matrices.") .account("google", GOOGLE_SHEETS_READ_REQUIREMENT) .input( z.object({ /** Date and time representation for non-formatted values. */ dateTimeRender: DATE_TIME_RENDER_SCHEMA.optional(), /** Whether outer arrays represent rows or columns. */ majorDimension: MAJOR_DIMENSION_SCHEMA.optional(), /** One or more A1 ranges or named ranges. */ ranges: z.union([z.string().min(1), z.string().min(1).array().min(1)]), /** Spreadsheet ID or standard Google Sheets URL. */ spreadsheet: SPREADSHEET_REFERENCE_SCHEMA, /** How formulas and formatted cells are represented. */ valueRender: VALUE_RENDER_SCHEMA.optional(), }), ) .output(VALUE_RANGE_SCHEMA.array()) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => { const { data } = await getGoogleSheetsApi( account.secret, ).spreadsheets.values.batchGet({ dateTimeRenderOption: toGoogleDateTimeRender(input.dateTimeRender), majorDimension: toGoogleMajorDimension(input.majorDimension), ranges: Array.isArray(input.ranges) ? input.ranges : [input.ranges], spreadsheetId: normalizeSpreadsheetId(input.spreadsheet), valueRenderOption: toGoogleValueRender(input.valueRender), }) return (data.valueRanges ?? []).map(normalizeValueRange) })