""" Sincroniza filas del tablero RTC con Google Sheets. Requiere una cuenta de servicio con acceso de edicion a la hoja que publica el HTML. """ from __future__ import annotations from pathlib import Path from config import GOOGLE_CREDENTIALS_PATH, GOOGLE_SHEET_NAME, GOOGLE_SPREADSHEET_ID class GoogleSheetSyncError(Exception): pass def validate_google_config() -> list[str]: missing = [] if not GOOGLE_SPREADSHEET_ID: missing.append("GOOGLE_SPREADSHEET_ID") if not GOOGLE_CREDENTIALS_PATH: missing.append("GOOGLE_CREDENTIALS_PATH") elif not Path(GOOGLE_CREDENTIALS_PATH).is_file(): missing.append("GOOGLE_CREDENTIALS_PATH (archivo no encontrado)") return missing def sync_rows_to_google_sheet(rows: list[list[str]]) -> int: """ Reemplaza el contenido de la hoja configurada con las filas dadas. Devuelve la cantidad de filas escritas (sin contar encabezado). """ missing = validate_google_config() if missing: raise GoogleSheetSyncError( "Faltan variables para sincronizar Google Sheets: " + ", ".join(missing) ) try: import gspread from google.oauth2.service_account import Credentials except ImportError as exc: raise GoogleSheetSyncError( "Instala dependencias: pip install gspread google-auth" ) from exc scopes = ["https://www.googleapis.com/auth/spreadsheets"] credentials = Credentials.from_service_account_file( GOOGLE_CREDENTIALS_PATH, scopes=scopes, ) client = gspread.authorize(credentials) spreadsheet = client.open_by_key(GOOGLE_SPREADSHEET_ID) worksheet = spreadsheet.worksheet(GOOGLE_SHEET_NAME) worksheet.clear() worksheet.update(rows, value_input_option="RAW") data_rows = max(len(rows) - 1, 0) return data_rows