From 5ef9735ea5f29eb30f48e90beb32786a420eb070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Kr=C4=8Dek?= Date: Tue, 2 Sep 2025 19:30:33 +0200 Subject: [PATCH] Fixed hardcoded range --- src/lib/google/sheets/server.ts | 49 ++++++++++++++----- .../google/sheets/[sheetId]/data/+server.ts | 7 +-- .../private/events/event/new/+page.svelte | 4 +- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/lib/google/sheets/server.ts b/src/lib/google/sheets/server.ts index 1323fa9..331a2c6 100644 --- a/src/lib/google/sheets/server.ts +++ b/src/lib/google/sheets/server.ts @@ -51,25 +51,48 @@ export async function getRecentSpreadsheets( * Get data from a Google Sheet * @param refreshToken - Google refresh token * @param spreadsheetId - ID of the spreadsheet - * @param range - Cell range to retrieve (default: A1:Z10) + * @param range - Optional cell range. If not provided, it will fetch the entire first sheet. * @returns Sheet data as a 2D array */ export async function getSpreadsheetData( - refreshToken: string, - spreadsheetId: string, - range: string = 'A1:Z10' + refreshToken: string, + spreadsheetId: string, + range?: string ): Promise { - const oauth = getAuthenticatedClient(refreshToken); - const sheets = google.sheets({ version: 'v4', auth: oauth }); + const oauth = getAuthenticatedClient(refreshToken); + const sheets = google.sheets({ version: 'v4', auth: oauth }); - const response = await sheets.spreadsheets.values.get({ - spreadsheetId, - range - }); + let effectiveRange = range; - return { - values: response.data.values || [] - }; + // If no range is provided, get the name of the first sheet and use that as the range + // to fetch all its content. + if (!effectiveRange) { + try { + const info = await getSpreadsheetInfo(refreshToken, spreadsheetId); + const firstSheetName = info.sheets?.[0]?.properties?.title; + + if (firstSheetName) { + // To use a sheet name as a range, it must be quoted if it contains spaces or special characters. + effectiveRange = `'${firstSheetName}'`; + } else { + // Fallback if sheet name can't be determined. + effectiveRange = 'A1:Z1000'; // A sensible default for a large preview + } + } catch (error) { + console.error(`Failed to get sheet info for spreadsheet ${spreadsheetId}`, error); + // Fallback if the info call fails + effectiveRange = 'A1:Z1000'; + } + } + + const response = await sheets.spreadsheets.values.get({ + spreadsheetId, + range: effectiveRange + }); + + return { + values: response.data.values || [] + }; } /** diff --git a/src/routes/private/api/google/sheets/[sheetId]/data/+server.ts b/src/routes/private/api/google/sheets/[sheetId]/data/+server.ts index e0ca677..086bfdd 100644 --- a/src/routes/private/api/google/sheets/[sheetId]/data/+server.ts +++ b/src/routes/private/api/google/sheets/[sheetId]/data/+server.ts @@ -2,17 +2,18 @@ import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; import { googleSheetsServer } from '$lib/google/sheets/server.js'; -export const GET: RequestHandler = async ({ params, request }) => { +export const GET: RequestHandler = async ({ params, request, url }) => { try { const { sheetId } = params; const authHeader = request.headers.get('authorization'); - + const range = url.searchParams.get('range') || undefined; + if (!authHeader?.startsWith('Bearer ')) { return json({ error: 'Missing or invalid authorization header' }, { status: 401 }); } const refreshToken = authHeader.slice(7); - const sheetData = await googleSheetsServer.getSpreadsheetData(refreshToken, sheetId, 'A1:Z10'); + const sheetData = await googleSheetsServer.getSpreadsheetData(refreshToken, sheetId, range); return json(sheetData); } catch (error) { diff --git a/src/routes/private/events/event/new/+page.svelte b/src/routes/private/events/event/new/+page.svelte index 741592b..5642b85 100644 --- a/src/routes/private/events/event/new/+page.svelte +++ b/src/routes/private/events/event/new/+page.svelte @@ -172,8 +172,8 @@ } try { - // Use the new unified API endpoint - const response = await fetch(`/private/api/google/sheets/${sheet.id}/data`, { + // Use the new unified API endpoint, requesting only a preview range + const response = await fetch(`/private/api/google/sheets/${sheet.id}/data?range=A1:Z10`, { method: 'GET', headers: { Authorization: `Bearer ${localStorage.getItem('google_refresh_token')}`