diff --git a/apps/sim/blocks/blocks/google_sheets.ts b/apps/sim/blocks/blocks/google_sheets.ts index bde2bec45dc..5c0232555b6 100644 --- a/apps/sim/blocks/blocks/google_sheets.ts +++ b/apps/sim/blocks/blocks/google_sheets.ts @@ -440,6 +440,36 @@ Return ONLY the range string - no sheet name, no explanations, no quotes.`, placeholder: 'Describe the range (e.g., "first 50 rows" or "column A")...', }, }, + // Read Filter Fields (advanced mode only) + { + id: 'filterColumn', + title: 'Filter Column', + type: 'short-input', + placeholder: 'Column header name to filter on (e.g., Email, Status)', + condition: { field: 'operation', value: 'read' }, + mode: 'advanced', + }, + { + id: 'filterValue', + title: 'Filter Value', + type: 'short-input', + placeholder: 'Value to match against', + condition: { field: 'operation', value: 'read' }, + mode: 'advanced', + }, + { + id: 'filterMatchType', + title: 'Match Type', + type: 'dropdown', + options: [ + { label: 'Contains', id: 'contains' }, + { label: 'Exact Match', id: 'exact' }, + { label: 'Starts With', id: 'starts_with' }, + { label: 'Ends With', id: 'ends_with' }, + ], + condition: { field: 'operation', value: 'read' }, + mode: 'advanced', + }, // Write-specific Fields { id: 'values', @@ -748,6 +778,9 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, batchData, sheetId, destinationSpreadsheetId, + filterColumn, + filterValue, + filterMatchType, ...rest } = params @@ -836,6 +869,11 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, cellRange: cellRange ? (cellRange as string).trim() : undefined, values: parsedValues, oauthCredential, + ...(filterColumn ? { filterColumn: (filterColumn as string).trim() } : {}), + ...(filterValue !== undefined && filterValue !== '' + ? { filterValue: filterValue as string } + : {}), + ...(filterMatchType ? { filterMatchType: filterMatchType as string } : {}), } }, }, @@ -858,6 +896,12 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, type: 'string', description: 'Destination spreadsheet ID for copy', }, + filterColumn: { type: 'string', description: 'Column header name to filter on' }, + filterValue: { type: 'string', description: 'Value to match against the filter column' }, + filterMatchType: { + type: 'string', + description: 'Match type: contains, exact, starts_with, or ends_with', + }, }, outputs: { // Read outputs diff --git a/apps/sim/tools/google_sheets/read.ts b/apps/sim/tools/google_sheets/read.ts index 2ee88b7c271..74948847275 100644 --- a/apps/sim/tools/google_sheets/read.ts +++ b/apps/sim/tools/google_sheets/read.ts @@ -154,6 +154,26 @@ export const readV2Tool: ToolConfig 1) { + const headers = values[0] as string[] + const columnIndex = headers.findIndex( + (h) => String(h).toLowerCase() === params.filterColumn!.toLowerCase() + ) + + if (columnIndex !== -1) { + const matchType = params.filterMatchType ?? 'contains' + const filterVal = params.filterValue.toLowerCase() + + const filteredRows = values.slice(1).filter((row) => { + const cellValue = String(row[columnIndex] ?? '').toLowerCase() + switch (matchType) { + case 'exact': + return cellValue === filterVal + case 'starts_with': + return cellValue.startsWith(filterVal) + case 'ends_with': + return cellValue.endsWith(filterVal) + default: + return cellValue.includes(filterVal) + } + }) + + // Return header row + matching rows + values = [values[0], ...filteredRows] + } + } + return { success: true, output: { sheetName: params?.sheetName ?? '', range: data.range ?? '', - values: data.values ?? [], + values, metadata: { spreadsheetId: metadata.spreadsheetId, spreadsheetUrl: metadata.spreadsheetUrl, diff --git a/apps/sim/tools/google_sheets/types.ts b/apps/sim/tools/google_sheets/types.ts index 74fdc84a1a9..2c0c7aa5a42 100644 --- a/apps/sim/tools/google_sheets/types.ts +++ b/apps/sim/tools/google_sheets/types.ts @@ -129,6 +129,9 @@ export interface GoogleSheetsV2ToolParams { includeValuesInResponse?: boolean responseValueRenderOption?: 'FORMATTED_VALUE' | 'UNFORMATTED_VALUE' | 'FORMULA' majorDimension?: 'ROWS' | 'COLUMNS' + filterColumn?: string + filterValue?: string + filterMatchType?: 'contains' | 'exact' | 'starts_with' | 'ends_with' } export type GoogleSheetsV2Response =