2
0

🐛 (sheets) Make sure update cells do not overwrite existing…

This commit is contained in:
Baptiste Arnaud
2024-06-27 11:25:43 +02:00
parent 898ed529b0
commit 1431898b82
5 changed files with 41 additions and 10 deletions

View File

@@ -87,7 +87,7 @@ test.describe.parallel('Google sheets integration', () => {
.press('Enter') .press('Enter')
await expect( await expect(
page.getByText('Succesfully updated matching rows').nth(0) page.getByText('Succesfully updated matching rows').nth(0)
).toBeVisible() ).toBeVisible({ timeout: 10000 })
}) })
test('Get row should work', async ({ page }) => { test('Get row should work', async ({ page }) => {

View File

@@ -0,0 +1,22 @@
import { Variable, Cell } from '@typebot.io/schemas'
import { parseVariables } from '@typebot.io/variables/parseVariables'
export const parseNewCellValuesObject =
(variables: Variable[]) =>
(
cells: Cell[],
headerValues?: string[]
): { [key: string]: { value: string; columnIndex: number } } =>
cells.reduce((row, cell) => {
return !cell.column || !cell.value
? row
: {
...row,
[cell.column]: {
value: parseVariables(variables)(cell.value),
columnIndex: headerValues?.findIndex(
(headerValue) => headerValue === cell.column
),
},
}
}, {})

View File

@@ -1,7 +1,7 @@
import { Variable, Cell } from '@typebot.io/schemas' import { Variable, Cell } from '@typebot.io/schemas'
import { parseVariables } from '@typebot.io/variables/parseVariables' import { parseVariables } from '@typebot.io/variables/parseVariables'
export const parseCellValues = export const parseNewRowObject =
(variables: Variable[]) => (variables: Variable[]) =>
(cells: Cell[]): { [key: string]: string } => (cells: Cell[]): { [key: string]: string } =>
cells.reduce((row, cell) => { cells.reduce((row, cell) => {

View File

@@ -3,7 +3,7 @@ import {
GoogleSheetsInsertRowOptions, GoogleSheetsInsertRowOptions,
ChatLog, ChatLog,
} from '@typebot.io/schemas' } from '@typebot.io/schemas'
import { parseCellValues } from './helpers/parseCellValues' import { parseNewRowObject } from './helpers/parseNewRowObject'
import { getAuthenticatedGoogleDoc } from './helpers/getAuthenticatedGoogleDoc' import { getAuthenticatedGoogleDoc } from './helpers/getAuthenticatedGoogleDoc'
import { ExecuteIntegrationResponse } from '../../../types' import { ExecuteIntegrationResponse } from '../../../types'
@@ -24,7 +24,7 @@ export const insertRow = async (
spreadsheetId: options.spreadsheetId, spreadsheetId: options.spreadsheetId,
}) })
const parsedValues = parseCellValues(variables)(options.cellsToInsert) const parsedValues = parseNewRowObject(variables)(options.cellsToInsert)
try { try {
await doc.loadInfo() await doc.loadInfo()

View File

@@ -3,7 +3,7 @@ import {
GoogleSheetsUpdateRowOptions, GoogleSheetsUpdateRowOptions,
ChatLog, ChatLog,
} from '@typebot.io/schemas' } from '@typebot.io/schemas'
import { parseCellValues } from './helpers/parseCellValues' import { parseNewCellValuesObject } from './helpers/parseNewCellValuesObject'
import { getAuthenticatedGoogleDoc } from './helpers/getAuthenticatedGoogleDoc' import { getAuthenticatedGoogleDoc } from './helpers/getAuthenticatedGoogleDoc'
import { ExecuteIntegrationResponse } from '../../../types' import { ExecuteIntegrationResponse } from '../../../types'
import { matchFilter } from './helpers/matchFilter' import { matchFilter } from './helpers/matchFilter'
@@ -36,8 +36,6 @@ export const updateRow = async (
spreadsheetId: options.spreadsheetId, spreadsheetId: options.spreadsheetId,
}) })
const parsedValues = parseCellValues(variables)(options.cellsToUpsert)
await doc.loadInfo() await doc.loadInfo()
const sheet = doc.sheetsById[Number(sheetId)] const sheet = doc.sheetsById[Number(sheetId)]
const rows = await sheet.getRows() const rows = await sheet.getRows()
@@ -55,13 +53,24 @@ export const updateRow = async (
return { outgoingEdgeId, logs } return { outgoingEdgeId, logs }
} }
const parsedValues = parseNewCellValuesObject(variables)(
options.cellsToUpsert,
sheet.headerValues
)
try { try {
for (const filteredRow of filteredRows) { for (const filteredRow of filteredRows) {
const rowIndex = filteredRow.rowNumber - 2 // -1 for 1-indexing, -1 for header row const cellsRange = filteredRow.a1Range.split('!').pop()
await sheet.loadCells(cellsRange)
const rowIndex = filteredRow.rowNumber - 1
for (const key in parsedValues) { for (const key in parsedValues) {
rows[rowIndex].set(key, parsedValues[key]) const cellToUpdate = sheet.getCell(
rowIndex,
parsedValues[key].columnIndex
)
cellToUpdate.value = parsedValues[key].value
} }
await rows[rowIndex].save() await sheet.saveUpdatedCells()
} }
logs.push({ logs.push({