This commit is contained in:
2025-04-16 12:34:16 +00:00
parent 362a3fc8d5
commit eaf388bf40

View File

@@ -1004,11 +1004,19 @@ class GoogleSheetHandler:
return self.sheet_values return self.sheet_values
# Angepasste Methode, um den Startindex basierend auf einer spezifischen Spalte zu finden # Angepasste Methode, um den Startindex basierend auf einer spezifischen Spalte zu finden
def get_start_row_index(self, check_column_index=COLUMN_MAP["Website Scrape Timestamp"], min_sheet_row=7): def get_start_row_index(self, check_column_index, min_sheet_row=7): # Entferne Standardwert hier
""" """
Findet den Index der ersten Zeile (0-basiert für Daten nach Header), Findet den Index der ersten Zeile (0-basiert für Daten nach Header),
ab einer Mindestzeilennummer im Sheet, in der der Timestamp in der ab einer Mindestzeilennummer im Sheet, in der der Timestamp in der
angegebenen Spalte fehlt. angegebenen Spalte fehlt.
Args:
check_column_index (int): Der 0-basierte Index der zu prüfenden Spalte.
min_sheet_row (int): Die 1-basierte Zeilennummer im Sheet, ab der gesucht werden soll.
Returns:
int: Der 0-basierte Index in der Datenliste (ohne Header),
oder der Index nach der letzten Zeile, wenn alle gefüllt sind.
""" """
header_rows = 5 header_rows = 5
data_rows = self.get_data() data_rows = self.get_data()
@@ -1019,25 +1027,36 @@ class GoogleSheetHandler:
search_start_index_in_data = max(0, min_sheet_row - header_rows - 1) search_start_index_in_data = max(0, min_sheet_row - header_rows - 1)
# Stelle sicher, dass der Startindex nicht außerhalb der Liste liegt # DEBUG: Logge, welche Spalte tatsächlich geprüft wird
actual_col_letter = self._get_col_letter(check_column_index + 1)
debug_print(f"get_start_row_index: Suche ab Daten-Index {search_start_index_in_data} nach leerem Timestamp in Spalte {actual_col_letter} (Index {check_column_index}).")
if search_start_index_in_data >= len(data_rows): if search_start_index_in_data >= len(data_rows):
col_letter = self._get_col_letter(check_column_index + 1) debug_print(f"Start-Suchindex ({search_start_index_in_data}) liegt nach oder auf letzter Datenzeile ({len(data_rows)-1}).")
debug_print(f"Start-Suchindex ({search_start_index_in_data}) liegt nach der letzten Datenzeile ({len(data_rows)-1}). Suche ab letzter Zeile für Spalte {col_letter}.") # Prüfe die *letzte* Zeile, falls der Index genau darauf zeigt
search_start_index_in_data = len(data_rows) -1 # Beginne bei der letzten Zeile falls Start zu weit if search_start_index_in_data == len(data_rows) -1:
if search_start_index_in_data < 0: return 0 # Falls gar keine Datenzeilen last_row = data_rows[search_start_index_in_data]
if len(last_row) <= check_column_index or not last_row[check_column_index].strip():
debug_print(f"Letzte Zeile (Daten-Index {search_start_index_in_data}) hat keinen Timestamp in Spalte {actual_col_letter}. Starte hier.")
return search_start_index_in_data
# Ansonsten sind alle vorherigen gefüllt
debug_print(f"Alle Zeilen ab Zeile {min_sheet_row} scheinen einen Zeitstempel in Spalte {actual_col_letter} zu haben. Nächster Daten-Index wäre {len(data_rows)}.")
return len(data_rows)
for i, row in enumerate(data_rows[search_start_index_in_data:], start=search_start_index_in_data): for i, row in enumerate(data_rows[search_start_index_in_data:], start=search_start_index_in_data):
# Sicherheitscheck für Zeilenlänge # DEBUG: Logge den geprüften Wert für die ersten paar Iterationen
# if i < search_start_index_in_data + 5:
# checked_value = row[check_column_index].strip() if len(row) > check_column_index else "INDEX_FEHLER"
# debug_print(f" -> Prüfe Zeile {i + header_rows + 1}: Wert in Spalte {actual_col_letter} = '{checked_value}'")
if len(row) <= check_column_index or not row[check_column_index].strip(): if len(row) <= check_column_index or not row[check_column_index].strip():
actual_sheet_row = i + header_rows + 1 actual_sheet_row = i + header_rows + 1
col_letter = self._get_col_letter(check_column_index + 1) debug_print(f"Erste Zeile ab Zeile {min_sheet_row} ohne Zeitstempel in Spalte {actual_col_letter} (Index {check_column_index}) gefunden: Zeile {actual_sheet_row} (Daten-Index {i})")
debug_print(f"Erste Zeile ab Zeile {min_sheet_row} ohne Zeitstempel in Spalte {col_letter} (Index {check_column_index}) gefunden: Zeile {actual_sheet_row} (Daten-Index {i})")
return i return i
last_index = len(data_rows) last_index = len(data_rows)
col_letter = self._get_col_letter(check_column_index + 1) debug_print(f"Alle Zeilen ab Zeile {min_sheet_row} haben einen Zeitstempel in Spalte {actual_col_letter}. Nächster Daten-Index wäre {last_index}.")
debug_print(f"Alle Zeilen ab Zeile {min_sheet_row} haben einen Zeitstempel in Spalte {col_letter}. Nächster Daten-Index wäre {last_index}.")
return last_index return last_index
def _get_col_letter(self, col_idx): def _get_col_letter(self, col_idx):
@@ -2104,7 +2123,18 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index
all_data = sheet_handler.get_all_data_with_headers() all_data = sheet_handler.get_all_data_with_headers()
sheet = sheet_handler.sheet sheet = sheet_handler.sheet
timestamp_col_index = COLUMN_MAP["Website Scrape Timestamp"] # Prüfe Spalte AT # HIER KORRIGIERT: Sicherstellen, dass der Index für AT verwendet wird
timestamp_col_index = COLUMN_MAP.get("Website Scrape Timestamp")
website_col_index = COLUMN_MAP.get("CRM Website")
rohtext_col_index = COLUMN_MAP.get("Website Rohtext")
summary_col_index = COLUMN_MAP.get("Website Zusammenfassung")
version_col_index = COLUMN_MAP.get("Version")
# Fehlerprüfung für Indizes
if None in [timestamp_col_index, website_col_index, rohtext_col_index, summary_col_index, version_col_index]:
debug_print("FEHLER: Mindestens ein benötigter Spaltenindex für process_website_batch fehlt in COLUMN_MAP.")
return
processed_count = 0 processed_count = 0
skipped_count = 0 skipped_count = 0
@@ -2113,46 +2143,55 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index
if row_index_in_list >= len(all_data): continue if row_index_in_list >= len(all_data): continue
row = all_data[row_index_in_list] row = all_data[row_index_in_list]
# --- NEU: Timestamp-Prüfung für jede Zeile --- # --- KORRIGIERTE Timestamp-Prüfung für jede Zeile ---
if len(row) > timestamp_col_index and row[timestamp_col_index].strip(): if len(row) > timestamp_col_index and row[timestamp_col_index].strip():
debug_print(f"Zeile {i}: Überspringe Website-Scraping (Timestamp AT bereits vorhanden: '{row[timestamp_col_index]}').") # Optional: Weniger Lärm im Log, nur alle X Zeilen loggen
# if skipped_count % 100 == 0:
# debug_print(f"Zeile {i}: Überspringe Website-Scraping (Timestamp AT vorhanden: '{row[timestamp_col_index]}')...")
skipped_count += 1 skipped_count += 1
continue continue
# --- Ende Timestamp-Prüfung --- # --- Ende Timestamp-Prüfung ---
website_url = row[COLUMN_MAP["CRM Website"]] if len(row) > COLUMN_MAP["CRM Website"] else "" website_url = row[website_col_index] if len(row) > website_col_index else ""
if not website_url or website_url.strip().lower() == "k.a.": if not website_url or website_url.strip().lower() == "k.a.":
debug_print(f"Zeile {i}: Kein gültiger Website-Eintrag, überspringe Website-Scraping.") # debug_print(f"Zeile {i}: Kein gültiger Website-Eintrag, überspringe Website-Scraping.")
# Optional: Zeitstempel trotzdem setzen als "geprüft, keine URL"? Eher nicht. skipped_count += 1
skipped_count += 1 # Zähle als übersprungen
continue continue
debug_print(f"Zeile {i}: Verarbeite Website {website_url}...") # debug_print(f"Zeile {i}: Verarbeite Website {website_url}...") # Weniger Lärm
raw_text = get_website_raw(website_url) raw_text = get_website_raw(website_url)
summary = summarize_website_content(raw_text) # Braucht OpenAI Key summary = summarize_website_content(raw_text)
processed_count += 1 processed_count += 1
updates = [] updates = []
current_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") current_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
current_version = Config.VERSION current_version = Config.VERSION
updates.append({'range': f'AR{i}', 'values': [[raw_text]]}) # Spalte AR # Spaltenbuchstaben für die Ranges ermitteln
updates.append({'range': f'AS{i}', 'values': [[summary]]}) # Spalte AS rohtext_col_letter = sheet_handler._get_col_letter(rohtext_col_index + 1)
updates.append({'range': f'AT{i}', 'values': [[current_timestamp]]}) # Spalte AT (NEU) summary_col_letter = sheet_handler._get_col_letter(summary_col_index + 1)
updates.append({'range': f'AP{i}', 'values': [[current_version]]}) # Spalte AP (Version) ts_col_letter = sheet_handler._get_col_letter(timestamp_col_index + 1)
# AO (Letzte Prüfung) wird hier *nicht* gesetzt, das macht der Branch- oder Full-Run version_col_letter = sheet_handler._get_col_letter(version_col_index + 1)
updates.append({'range': f'{rohtext_col_letter}{i}', 'values': [[raw_text]]})
updates.append({'range': f'{summary_col_letter}{i}', 'values': [[summary]]})
updates.append({'range': f'{ts_col_letter}{i}', 'values': [[current_timestamp]]}) # AT Timestamp
updates.append({'range': f'{version_col_letter}{i}', 'values': [[current_version]]}) # AP Version
# Führe Batch-Update für diese eine Zeile durch # Führe Batch-Update für diese eine Zeile durch
if updates: if updates:
sheet_handler.batch_update_cells(updates) success = sheet_handler.batch_update_cells(updates)
# Weniger Lärm im Log: debug_print(f"Zeile {i}: Website-Daten aktualisiert | Zeitstempel AT: {current_timestamp}, Version: {current_version}") if not success:
debug_print(f"FEHLER beim Schreiben der Updates für Zeile {i}.")
# Weniger Lärm im Log bei Erfolg:
# else: debug_print(f"Zeile {i}: Website-Daten aktualisiert...")
# Pause zwischen den Zeilen/Websites # Pause zwischen den Zeilen/Websites
time.sleep(Config.RETRY_DELAY) time.sleep(Config.RETRY_DELAY)
debug_print(f"Website-Scraping (Batch) abgeschlossen. {processed_count} Websites gescraped, {skipped_count} Zeilen übersprungen.") debug_print(f"Website-Scraping (Batch) abgeschlossen. {processed_count} Websites gescraped, {skipped_count} Zeilen übersprungen.")
# Komplette Funktion process_branch_batch (prüft jetzt Timestamp AO) # Komplette Funktion process_branch_batch (prüft jetzt Timestamp AO)
def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet): def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet):
"""Batch-Prozess für Brancheneinschätzung.""" """Batch-Prozess für Brancheneinschätzung."""