From a30eb6ea8b7ebc7806337d1e5dfdff918fb7f261 Mon Sep 17 00:00:00 2001 From: Rohit Date: Thu, 27 Feb 2025 16:47:12 +0530 Subject: [PATCH 1/2] feat: check for headers and append data --- .../integrations/gsheet.ts | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/server/src/workflow-management/integrations/gsheet.ts b/server/src/workflow-management/integrations/gsheet.ts index 47dda84e..858c2063 100644 --- a/server/src/workflow-management/integrations/gsheet.ts +++ b/server/src/workflow-management/integrations/gsheet.ts @@ -49,11 +49,7 @@ export async function updateGoogleSheet(robotId: string, runId: string) { if (plainRobot.google_sheet_email && spreadsheetId) { console.log(`Preparing to write data to Google Sheet for robot: ${robotId}, spreadsheetId: ${spreadsheetId}`); - const headers = Object.keys(data[0]); - const rows = data.map((row: { [key: string]: any }) => Object.values(row)); - const outputData = [headers, ...rows]; - - await writeDataToSheet(robotId, spreadsheetId, outputData); + await writeDataToSheet(robotId, spreadsheetId, data); console.log(`Data written to Google Sheet successfully for Robot: ${robotId} and Run: ${runId}`); } else { console.log('Google Sheets integration not configured.'); @@ -102,7 +98,38 @@ export async function writeDataToSheet(robotId: string, spreadsheetId: string, d const sheets = google.sheets({ version: 'v4', auth: oauth2Client }); - const resource = { values: data }; + const checkResponse = await sheets.spreadsheets.values.get({ + spreadsheetId, + range: 'Sheet1!1:1', + }); + + const expectedHeaders = Object.keys(data[0]); + + const rows = data.map(item => Object.values(item)); + + const existingHeaders = + checkResponse.data.values && + checkResponse.data.values[0] ? + checkResponse.data.values[0].map(String) : + []; + + const isSheetEmpty = existingHeaders.length === 0; + + const headersMatch = + !isSheetEmpty && + existingHeaders.length === expectedHeaders.length && + expectedHeaders.every((header, index) => existingHeaders[index] === header); + + let resource; + + if (isSheetEmpty || !headersMatch) { + resource = { values: [expectedHeaders, ...rows] }; + console.log('Including headers in the append operation.'); + } else { + resource = { values: rows }; + console.log('Headers already exist and match, only appending data rows.'); + } + console.log('Attempting to write to spreadsheet:', spreadsheetId); const response = await sheets.spreadsheets.values.append({ From 5f56d3d1e0d90e150e3cfa2a388bc338c1805605 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 28 Feb 2025 19:53:09 +0530 Subject: [PATCH 2/2] feat: add check if data empty and return --- server/src/workflow-management/integrations/gsheet.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/workflow-management/integrations/gsheet.ts b/server/src/workflow-management/integrations/gsheet.ts index 858c2063..b492a7df 100644 --- a/server/src/workflow-management/integrations/gsheet.ts +++ b/server/src/workflow-management/integrations/gsheet.ts @@ -103,6 +103,11 @@ export async function writeDataToSheet(robotId: string, spreadsheetId: string, d range: 'Sheet1!1:1', }); + if (!data || data.length === 0) { + console.log('No data to write. Exiting early.'); + return; + } + const expectedHeaders = Object.keys(data[0]); const rows = data.map(item => Object.values(item));