From c89ab1c81883abed14be7f7daaac80926da5b65d Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 8 Jun 2026 23:56:22 +0200 Subject: [PATCH] feat: lire tous les onglets Google Sheets (un onglet par famille de produits) --- src/lib/googleSheets.ts | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/lib/googleSheets.ts b/src/lib/googleSheets.ts index 40d89fe..57879e1 100644 --- a/src/lib/googleSheets.ts +++ b/src/lib/googleSheets.ts @@ -36,27 +36,49 @@ export function parseSheetRows(rows: string[][]): SyncProduct[] { /** * Lit tous les produits depuis Google Sheets via l'API v4 (API Key publique). + * Si GOOGLE_SHEETS_TAB est défini, lit uniquement cet onglet. + * Sinon, lit tous les onglets du fichier et combine les produits. * Le fichier Sheets doit être partagé en lecture ("Toute personne avec le lien"). */ export async function readSheetProducts(): Promise { const apiKey = process.env.GOOGLE_API_KEY const sheetId = process.env.GOOGLE_SHEETS_ID - const sheetName = process.env.GOOGLE_SHEETS_TAB ?? 'MATRICE' + const singleTab = process.env.GOOGLE_SHEETS_TAB if (!apiKey || !sheetId) { throw new Error('Variables GOOGLE_API_KEY et GOOGLE_SHEETS_ID requises') } - const range = encodeURIComponent(`${sheetName}!A2:F`) - const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${range}?key=${apiKey}` + const sheetNames = singleTab ? [singleTab] : await listSheetTabs(sheetId, apiKey) + const results = await Promise.all( + sheetNames.map((name) => readOneTab(sheetId, apiKey, name)), + ) + + return results.flat() +} + +async function listSheetTabs(sheetId: string, apiKey: string): Promise { + const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}?key=${apiKey}&fields=sheets.properties.title` const res = await fetch(url) if (!res.ok) { const err = await res.text() throw new Error(`Google Sheets API error: ${res.status} — ${err}`) } - const data = await res.json() - const rows = (data.values ?? []) as string[][] - return parseSheetRows(rows) + return (data.sheets as Array<{ properties: { title: string } }>).map( + (s) => s.properties.title, + ) +} + +async function readOneTab(sheetId: string, apiKey: string, sheetName: string): Promise { + const range = encodeURIComponent(`${sheetName}!A2:F`) + const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${range}?key=${apiKey}` + const res = await fetch(url) + if (!res.ok) { + const err = await res.text() + throw new Error(`Google Sheets API error (onglet "${sheetName}"): ${res.status} — ${err}`) + } + const data = await res.json() + return parseSheetRows((data.values ?? []) as string[][]) }