diff --git a/src/lib/creationSheets.ts b/src/lib/creationSheets.ts index 4064fb3..84c94c6 100644 --- a/src/lib/creationSheets.ts +++ b/src/lib/creationSheets.ts @@ -32,7 +32,7 @@ export function extractSpecificFields(headers: string[], row: string[]): Record< return result } -export function parseTabRows(tab: string, headers: string[], rows: string[][]): PendingProduct[] { +export function parseTabRows(tab: string, headers: string[], rows: string[][], dataStartRow = 2): PendingProduct[] { const idx = { id: findColIndex(headers, 'ID'), sku: findColIndex(headers, 'UGS'), @@ -60,7 +60,7 @@ export function parseTabRows(tab: string, headers: string[], rows: string[][]): if (id !== '' || publie !== '1') return null return { tab, - rowNumber: rowIdx + 2, + rowNumber: dataStartRow + rowIdx, sku: get(row, idx.sku), title: get(row, idx.nom), priceMarket: get(row, idx.prixMarche).replace(',', '.'), @@ -106,8 +106,15 @@ export async function fetchPendingProducts( const data = await res.json() const rows = (data.values ?? []) as string[][] if (rows.length < 2) continue - const [headers, ...dataRows] = rows - const pending = parseTabRows(tab, headers, dataRows).filter( + // La ligne d'en-têtes est la première ligne qui contient "ID" en col A + // (certains onglets ont une ligne de section en row 1, les vrais en-têtes sont en row 2) + const headerRowIdx = rows.findIndex(r => (r[0] ?? '').trim() === 'ID') + if (headerRowIdx === -1) continue // pas un onglet produit + const headers = rows[headerRowIdx] + const dataRows = rows.slice(headerRowIdx + 1) + // Ignorer les onglets sans colonne "Publié" (COLLECTIONS, LIVRAISONS, etc.) + if (findColIndex(headers, 'Publié') === -1) continue + const pending = parseTabRows(tab, headers, dataRows, headerRowIdx + 2).filter( p => !alreadyCreatedRows.has(`${p.tab}:${p.rowNumber}`), ) all.push(...pending)