diff --git a/sync_manager.py b/sync_manager.py index a4c9634a..dddb24ab 100644 --- a/sync_manager.py +++ b/sync_manager.py @@ -86,6 +86,7 @@ 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('') for d365_col in self.d365_to_gsheet_map.keys(): if d365_col not in temp_d365_df.columns: @@ -100,8 +101,8 @@ class SyncManager: self.logger.info("Lade bestehende Daten aus dem Google Sheet...") try: - # --- KORREKTUR DES API-PARAMETERS --- - all_data_with_headers = self.sheet_handler.sheet.get_all_values(value_render_option='FORMATTED_VALUE') + # 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('') @@ -109,22 +110,18 @@ class SyncManager: actual_header = all_data_with_headers[self.sheet_handler._header_rows - 1] data_rows = all_data_with_headers[self.sheet_handler._header_rows:] - temp_df = pd.DataFrame(data_rows) - if not temp_df.empty: - num_cols_to_match = len(actual_header) - if temp_df.shape[1] > num_cols_to_match: - temp_df = temp_df.iloc[:, :num_cols_to_match] - elif temp_df.shape[1] < num_cols_to_match: - for i in range(num_cols_to_match - temp_df.shape[1]): - temp_df[f'temp_{i}'] = '' - temp_df.columns = actual_header - else: - temp_df = pd.DataFrame(columns=actual_header) + # --- 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) - temp_df = temp_df.fillna('') + # Konvertiere ALLES im DataFrame präventiv zu Strings und fülle leere Zellen + temp_df = temp_df.astype(str).fillna('') + 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] except Exception as e: self.logger.critical(f"Fehler beim Laden/Umwandeln der GSheet-Daten: {e}", exc_info=True)