Merge claude/youthful-mendel-0c569f: fix realTab propagation in Sheets sync

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-05-14 06:46:33 +02:00
+18 -7
View File
@@ -290,21 +290,32 @@ async function getSheetsClient() {
return google.sheets({ version: 'v4', auth });
}
// Returns the actual tab title as it exists in the sheet (case-preserving).
async function ensureSheetTab(sheets, tabName) {
const meta = await sheets.spreadsheets.get({ spreadsheetId: SHEETS_BACKUP_ID });
const exists = meta.data.sheets.some(s => s.properties.title === tabName);
if (!exists) {
const existing = meta.data.sheets.find(s =>
s.properties.title.toLowerCase() === tabName.toLowerCase()
);
if (existing) return existing.properties.title; // already exists, return real name
try {
await sheets.spreadsheets.batchUpdate({
spreadsheetId: SHEETS_BACKUP_ID,
requestBody: { requests: [{ addSheet: { properties: { title: tabName } } }] }
});
} catch (e) {
if (!e.message?.includes('already exists') && !e.message?.includes('Já existe')) throw e;
// Re-fetch to get the real name after race-condition create
const meta2 = await sheets.spreadsheets.get({ spreadsheetId: SHEETS_BACKUP_ID });
const found = meta2.data.sheets.find(s => s.properties.title.toLowerCase() === tabName.toLowerCase());
if (found) return found.properties.title;
}
return tabName;
}
async function pushTableToSheet(tableDef, sheets) {
const { rows } = await pool.query(tableDef.query);
await ensureSheetTab(sheets, tableDef.tab);
await sheets.spreadsheets.values.clear({ spreadsheetId: SHEETS_BACKUP_ID, range: `${tableDef.tab}!A:ZZ` });
const realTab = await ensureSheetTab(sheets, tableDef.tab);
await sheets.spreadsheets.values.clear({ spreadsheetId: SHEETS_BACKUP_ID, range: `${realTab}!A:ZZ` });
const sheetRows = [tableDef.headers, ...rows.map(row =>
tableDef.headers.map(h => {
const v = row[h] ?? row[h.toLowerCase()];
@@ -313,7 +324,7 @@ async function pushTableToSheet(tableDef, sheets) {
)];
await sheets.spreadsheets.values.update({
spreadsheetId: SHEETS_BACKUP_ID,
range: `${tableDef.tab}!A1`,
range: `${realTab}!A1`,
valueInputOption: 'RAW',
requestBody: { values: sheetRows }
});
@@ -321,8 +332,8 @@ async function pushTableToSheet(tableDef, sheets) {
}
async function pullTableFromSheet(tableDef, sheets) {
await ensureSheetTab(sheets, tableDef.tab);
const resp = await sheets.spreadsheets.values.get({ spreadsheetId: SHEETS_BACKUP_ID, range: `${tableDef.tab}!A:ZZ` });
const realTab = await ensureSheetTab(sheets, tableDef.tab);
const resp = await sheets.spreadsheets.values.get({ spreadsheetId: SHEETS_BACKUP_ID, range: `${realTab}!A:ZZ` });
const sheetRows = resp.data.values || [];
if (sheetRows.length < 2) return 0;
const headers = sheetRows[0];