diff --git a/components/google_sheets/package.json b/components/google_sheets/package.json index 84fb89efdd197..7a7be6eba48d2 100644 --- a/components/google_sheets/package.json +++ b/components/google_sheets/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/google_sheets", - "version": "0.8.7", + "version": "0.8.8", "description": "Pipedream Google_sheets Components", "main": "google_sheets.app.mjs", "keywords": [ diff --git a/components/google_sheets/sources/common/new-row-added.mjs b/components/google_sheets/sources/common/new-row-added.mjs index 33ac5eed3d736..7b360d43ad2d6 100644 --- a/components/google_sheets/sources/common/new-row-added.mjs +++ b/components/google_sheets/sources/common/new-row-added.mjs @@ -20,6 +20,20 @@ export default { label: "Worksheet ID(s)", description: "Select one or more worksheet(s), or provide an array of worksheet IDs.", }, + hasHeaders: { + type: "boolean", + label: "Has Headers", + description: "Set to true if your spreadsheet contains column headers. When enabled, webhook responses will use column headers as keys instead of positional array indices.", + default: false, + optional: true, + }, + headerRow: { + type: "integer", + label: "Header Row Number", + description: "The row number containing the column headers (e.g., 1 for the first row). Only used when 'Has Headers' is enabled.", + default: 1, + optional: true, + }, }, methods: { _getRowHashes() { @@ -28,6 +42,49 @@ export default { _setRowHashes(rowHashes) { this.db.set("rowHashes", rowHashes); }, + _getHeaders(worksheetId) { + return this.db.get(`headers_${worksheetId}`) || {}; + }, + _setHeaders(worksheetId, headers) { + this.db.set(`headers_${worksheetId}`, headers); + }, + async _fetchHeaders(sheetId, worksheetTitle) { + if (!this.hasHeaders) { + return []; + } + + const range = `${worksheetTitle}!${this.headerRow}:${this.headerRow}`; + const response = await this.googleSheets.getSpreadsheetValues(sheetId, range); + return response.values?.[0] || []; + }, + async _getOrFetchHeaders(sheetId, worksheetId, worksheetTitle) { + if (!this.hasHeaders) { + return []; + } + + let headers = this._getHeaders(worksheetId); + if (!headers.length) { + headers = await this._fetchHeaders(sheetId, worksheetTitle); + this._setHeaders(worksheetId, headers); + } + + return headers; + }, + _transformRowToObject(rowArray, headers) { + if (!this.hasHeaders || !headers.length) { + return rowArray; + } + + return headers.reduce((obj, header, index) => { + const value = rowArray[index]; + if (header && header.trim()) { + obj[header.trim()] = value !== undefined + ? value + : ""; + } + return obj; + }, {}); + }, getMeta(worksheet, rowNumber, rowHashString) { const ts = Date.now(); const id = rowHashString; @@ -156,6 +213,9 @@ export default { : newRowCount, ); + // Fetch headers for this worksheet if enabled + const headers = await this._getOrFetchHeaders(sheetId, worksheetId, worksheetTitle); + const rowHashes = this._getRowHashes(); for (const [ index, @@ -171,9 +231,13 @@ export default { continue; } rowHashes[rowHashString] = true; + + // Transform row to object using headers if enabled + const transformedRow = this._transformRowToObject(newRow, headers); + this.$emit( { - newRow, + newRow: transformedRow, range, worksheet, rowNumber, diff --git a/components/google_sheets/sources/new-row-added-polling/new-row-added-polling.mjs b/components/google_sheets/sources/new-row-added-polling/new-row-added-polling.mjs index 7536bc1de8845..3bac3ad0ef23b 100644 --- a/components/google_sheets/sources/new-row-added-polling/new-row-added-polling.mjs +++ b/components/google_sheets/sources/new-row-added-polling/new-row-added-polling.mjs @@ -8,7 +8,7 @@ export default { key: "google_sheets-new-row-added-polling", name: "New Row Added", description: "Emit new event each time a row or rows are added to the bottom of a spreadsheet.", - version: "0.0.6", + version: "0.0.7", dedupe: "unique", type: "source", props: { diff --git a/components/google_sheets/sources/new-row-added/new-row-added.mjs b/components/google_sheets/sources/new-row-added/new-row-added.mjs index a7d689b0d0421..b55ebff49b100 100644 --- a/components/google_sheets/sources/new-row-added/new-row-added.mjs +++ b/components/google_sheets/sources/new-row-added/new-row-added.mjs @@ -8,7 +8,7 @@ export default { key: "google_sheets-new-row-added", name: "New Row Added (Instant)", description: "Emit new event each time a row or rows are added to the bottom of a spreadsheet.", - version: "0.1.14", + version: "0.1.15", dedupe: "unique", type: "source", props: { diff --git a/components/google_sheets/sources/new-row-added/test-event.mjs b/components/google_sheets/sources/new-row-added/test-event.mjs index 4df198f8611f2..2239367a5615b 100644 --- a/components/google_sheets/sources/new-row-added/test-event.mjs +++ b/components/google_sheets/sources/new-row-added/test-event.mjs @@ -1,8 +1,10 @@ export default { - "newRow": [ - "a" - ], - "range": "Sheet1!1:1000", + "newRow": { + "Name": "John Doe", + "Email": "john@example.com", + "Age": "30" + }, + "range": "Sheet1!2:2", "worksheet": { "properties": { "sheetId": 1942312195, @@ -15,5 +17,5 @@ export default { } } }, - "rowNumber": 1 + "rowNumber": 2 } \ No newline at end of file