sync_manager.py aktualisiert

This commit is contained in:
2025-08-28 14:40:02 +00:00
parent 0d0ee0d45b
commit 0a0eacbbb5

View File

@@ -86,6 +86,7 @@ class SyncManager:
"""Lädt und bereitet die Daten aus D365 und Google Sheets vor.""" """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}'...") self.logger.info(f"Lade Daten aus D365-Export: '{self.d365_export_path}'...")
try: try:
# D365-Ladelogik ist korrekt und bleibt unverändert
temp_d365_df = pd.read_excel(self.d365_export_path, dtype=str).fillna('') temp_d365_df = pd.read_excel(self.d365_export_path, dtype=str).fillna('')
for d365_col in self.d365_to_gsheet_map.keys(): for d365_col in self.d365_to_gsheet_map.keys():
if d365_col not in temp_d365_df.columns: 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...") self.logger.info("Lade bestehende Daten aus dem Google Sheet...")
try: try:
# --- KORREKTUR DES API-PARAMETERS --- # Wir verwenden wieder den Standard-API-Aufruf, da 'FORMATTED_VALUE' nicht das Problem war.
all_data_with_headers = self.sheet_handler.sheet.get_all_values(value_render_option='FORMATTED_VALUE') 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: 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).fillna('')
@@ -109,22 +110,18 @@ class SyncManager:
actual_header = all_data_with_headers[self.sheet_handler._header_rows - 1] actual_header = all_data_with_headers[self.sheet_handler._header_rows - 1]
data_rows = all_data_with_headers[self.sheet_handler._header_rows:] data_rows = all_data_with_headers[self.sheet_handler._header_rows:]
temp_df = pd.DataFrame(data_rows) # --- FINALER DATAFRAME-ERSTELLUNGS-FIX ---
if not temp_df.empty: # Erstelle das DataFrame direkt mit den korrekten Spaltennamen.
num_cols_to_match = len(actual_header) # Pandas wird Zeilen, die zu kurz sind, automatisch mit 'None' auffüllen.
if temp_df.shape[1] > num_cols_to_match: temp_df = pd.DataFrame(data_rows, columns=actual_header)
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)
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: for col_name in COLUMN_ORDER:
if col_name not in temp_df.columns: if col_name not in temp_df.columns:
temp_df[col_name] = '' temp_df[col_name] = ''
self.gsheet_df = temp_df[COLUMN_ORDER] self.gsheet_df = temp_df[COLUMN_ORDER]
except Exception as e: except Exception as e:
self.logger.critical(f"Fehler beim Laden/Umwandeln der GSheet-Daten: {e}", exc_info=True) self.logger.critical(f"Fehler beim Laden/Umwandeln der GSheet-Daten: {e}", exc_info=True)