From 1068243ca9ac108e585b697c9251099c0efe43b2 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 28 Aug 2025 17:44:31 +0000 Subject: [PATCH] sync_manager.py aktualisiert --- sync_manager.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/sync_manager.py b/sync_manager.py index 2ef83651..c1034465 100644 --- a/sync_manager.py +++ b/sync_manager.py @@ -86,12 +86,11 @@ class SyncManager: """Lädt und bereitet die Daten aus D365 und Google Sheets vor.""" self.logger.info(f"Lade Daten aus D365-Export: '{self.d365_export_path}'...") try: - # D365-Ladelogik ist korrekt und bleibt unverändert - temp_d365_df = pd.read_excel(self.d365_export_path, dtype=str).fillna('') + self.d365_df = pd.read_excel(self.d365_export_path, dtype=str).fillna('') for d365_col in self.d365_to_gsheet_map.keys(): - if d365_col not in temp_d365_df.columns: + if d365_col not in self.d365_df.columns: raise ValueError(f"Erwartete Spalte '{d365_col}' nicht in der D365-Exportdatei gefunden.") - self.d365_df = temp_d365_df[list(self.d365_to_gsheet_map.keys())].copy() + self.d365_df = self.d365_df[list(self.d365_to_gsheet_map.keys())].copy() self.d365_df.rename(columns=self.d365_to_gsheet_map, inplace=True) self.d365_df['CRM ID'] = self.d365_df['CRM ID'].str.strip().str.lower() self.d365_df = self.d365_df[self.d365_df['CRM ID'].str.match(r'^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$', na=False)] @@ -101,28 +100,28 @@ class SyncManager: self.logger.info("Lade bestehende Daten aus dem Google Sheet...") try: - # Wir verwenden wieder den Standard-API-Aufruf, da 'FORMATTED_VALUE' nicht das Problem war. all_data_with_headers = self.sheet_handler.get_all_data_with_headers() if not all_data_with_headers or len(all_data_with_headers) < self.sheet_handler._header_rows: - self.gsheet_df = pd.DataFrame(columns=COLUMN_ORDER).fillna('') + self.gsheet_df = pd.DataFrame(columns=COLUMN_ORDER) else: actual_header = all_data_with_headers[self.sheet_handler._header_rows - 1] data_rows = all_data_with_headers[self.sheet_handler._header_rows:] # --- FINALER DATAFRAME-ERSTELLUNGS-FIX --- - # Erstelle das DataFrame direkt mit den korrekten Spaltennamen. - # Pandas wird Zeilen, die zu kurz sind, automatisch mit 'None' auffüllen. temp_df = pd.DataFrame(data_rows, columns=actual_header) - # Konvertiere ALLES im DataFrame präventiv zu Strings und fülle leere Zellen - temp_df = temp_df.astype(str).fillna('') - + # Sorge dafür, dass alle Spalten aus unserer Config existieren for col_name in COLUMN_ORDER: if col_name not in temp_df.columns: temp_df[col_name] = '' - self.gsheet_df = temp_df[COLUMN_ORDER] + # Wähle nur die Spalten aus, die wir wollen, in der korrekten Reihenfolge + temp_df = temp_df[COLUMN_ORDER] + + # Konvertiere ALLES im DataFrame präventiv zu Strings und fülle leere Zellen + self.gsheet_df = temp_df.astype(str).fillna('') + except Exception as e: self.logger.critical(f"Fehler beim Laden/Umwandeln der GSheet-Daten: {e}", exc_info=True) return False