From f6a2b530a9ea8ed6e0e105bab4d2dc4b9bfef581 Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 27 May 2025 05:52:27 +0000 Subject: [PATCH] bugfix --- list_generator.py | 92 +++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/list_generator.py b/list_generator.py index 6c617919..f0d45560 100644 --- a/list_generator.py +++ b/list_generator.py @@ -40,7 +40,8 @@ def get_services_with_service_account(): return docs_service, drive_service def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill): - kinder_nach_gruppen = collections.defaultdict(list) + # ... (CSV-Lesen, sorted_gruppen_namen, stand_zeit bleiben gleich) ... + kinder_nach_gruppen = collections.defaultdict(list) # Definition hier oben try: with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile: reader = csv.DictReader(csvfile, delimiter=';') @@ -58,19 +59,11 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill): try: resource_for_lib = {"docsService": docs_api_service, "documentId": document_id_to_fill} gtable_manager = gdoctableapp(resource_for_lib) - - # --- DEBUGGING: Methoden der Instanz anzeigen --- - print("\n--- Verfügbare Methoden/Attribute auf gtable_manager Objekt: ---") - print(dir(gtable_manager)) - print("--- Ende Debugging Ausgabe ---\n") - print("INFO: Skript wird nach dir() Ausgabe beendet für Debugging.") - exit() # Das Skript hier abbrechen, um die Ausgabe zu sehen - # --- ENDE DEBUGGING --- - except Exception as e_dta_init: print(f"Fehler bei der Initialisierung von gdoctableapp: {e_dta_init}"); return False - additional_requests_fallback = [] # Nur für den unwahrscheinlichen Fall, dass wir es brauchen + # Diese Liste sammelt Requests für Text außerhalb von Tabellen und für Seitenumbrüche + non_table_requests = [] for i, gruppe_original in enumerate(sorted_gruppen_namen): kinder_liste = kinder_nach_gruppen[gruppe_original] @@ -78,46 +71,60 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill): gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX table_values = [] + # Kopfzeile (wird nicht fett per API in dieser Version) table_values.append(["Nachname", "Vorname", "Gruppe"]) for kind in kinder_liste: table_values.append([kind['Nachname'], kind['Vorname'], gruppe_display_name]) try: - print(f"Versuche Tabelle für Gruppe '{gruppe_original}' mit gdoctableapp einzufügen...") - # HIER WÜRDEN DIE KORREKTEN METHODENAUFRUFE STEHEN, SOBALD WIR SIE KENNEN - # z.B. res_table_obj = gtable_manager.RICHTIGER_NAME_FUER_CREATE_TABLE(values=table_values, index=None) - - # ... (Logik für Fettformatierung mit korrekten Methodennamen) ... - - # ... (Logik für Footer-Text mit korrekten Methodennamen) ... + print(f"Erstelle Tabelle für Gruppe '{gruppe_original}' mit gdoctableapp...") + # index=None sollte die Tabelle am Ende des Dokuments anhängen. + # Da die Bibliothek das BatchUpdate intern durchführt, wird jede Tabelle + # und der nachfolgende Text sequenziell hinzugefügt. + res_table = gtable_manager.createTable(values=table_values, index=None) + print(f" Tabelle für '{gruppe_original}' erstellt. Antwort: {res_table}") # Logge die Antwort für Debugging - pass # Platzhalter, da die eigentlichen Aufrufe noch unklar sind + # Text unter der Tabelle (Anzahl Kinder, etc.) + footer_lines_for_group = ["", f"{anzahl_kinder} angemeldete Kinder", "", + "Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden", + "Kinder an die Anmeldung erinnern.", "", + f"Stand {stand_zeit}", ""] + full_footer_text_for_group = "\n".join(footer_lines_for_group) + "\n" + + # Da gdoctableapp keine einfache 'add_text' Methode für reinen Text hat, + # fügen wir diesen Text über unseren eigenen BatchUpdate Request hinzu. + non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_footer_text_for_group}}) - except AttributeError as e_attr: - print(f"AttributeError bei Gruppe '{gruppe_original}': {e_attr}") except Exception as e_table: - print(f"Allgemeiner Fehler bei Tabelle/Footer für Gruppe '{gruppe_original}': {e_table}") - additional_requests_fallback.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nFEHLER BEI TABELLE {gruppe_original}\n"}}) + print(f"Fehler bei Tabelle für Gruppe '{gruppe_original}': {e_table}") + non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nFEHLER BEI TABELLE {gruppe_original}\n"}}) + if i < len(sorted_gruppen_namen) - 1: + non_table_requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) - # if i < len(sorted_gruppen_namen) - 1: - # try: - # # HIER DER KORREKTE METHODENAUFRUF FÜR PAGEBREAK - # # gtable_manager.RICHTIGER_NAME_FUER_PAGEBREAK(index=None) - # pass - # except Exception as e_pb: - # print(f"Fehler beim Einfügen des PageBreak nach {gruppe_original}: {e_pb}") - # additional_requests_fallback.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) + # Führe die gesammelten non-table Requests aus, NACHDEM alle Tabellen erstellt wurden. + # Dies ist wichtig, weil `createTable` bereits API-Aufrufe macht. + # Wenn wir `non_table_requests` nach jedem `createTable` senden, könnte es die Positionierung stören. + # Besser: Erst alle Tabellen erstellen lassen, dann alle restlichen Texte/Umbrüche. + # + # Überlegung: Wenn `createTable` die Tabelle ans Ende anfügt, und wir dann + # `non_table_requests` ans Ende anfügen, sollte die Reihenfolge stimmen. - if additional_requests_fallback and docs_api_service: + if non_table_requests and docs_api_service: try: - print(f"Sende zusätzliche Fallback-Requests für Doc ID '{document_id_to_fill}'...") - docs_api_service.documents().batchUpdate(documentId=document_id_to_fill, body={'requests': additional_requests_fallback}).execute() - except HttpError as err: print(f"Fehler bei zusätzlichen Fallback-Requests: {err}") + print(f"Sende gesammelte Text- und PageBreak-Requests für Doc ID '{document_id_to_fill}'...") + docs_api_service.documents().batchUpdate(documentId=document_id_to_fill, body={'requests': non_table_requests}).execute() + print("Text- und PageBreak-Requests erfolgreich ausgeführt.") + except HttpError as err: + print(f"Fehler bei gesammelten Text-/PageBreak-Requests: {err}") + # ... (Fehlerdetails) ... + return False # Befüllen war nicht vollständig erfolgreich return True # --- Main execution block --- +# (Bleibt exakt so wie in der letzten Version, die die einmalige Info eingefügt hat +# und dann generate_tables_with_gdoctableapp aufruft) if __name__ == "__main__": print(f"Info: Ordner-ID für Dokument: '{TARGET_FOLDER_ID}'") docs_api_service, drive_api_service = get_services_with_service_account() @@ -149,13 +156,12 @@ if __name__ == "__main__": try: docs_api_service.documents().batchUpdate(documentId=document_id, body={'requests': initial_requests}).execute(); print("Einmalige Info eingefügt.") except HttpError as err: print(f"Fehler bei einmaliger Info: {err}") - # 3. Dokument mit Tabellen befüllen (wird nach dir() Ausgabe beendet) - success_filling = generate_tables_with_gdoctableapp(docs_api_service, document_id) # Name beibehalten + # 3. Dokument mit Tabellen befüllen + success_filling = generate_tables_with_gdoctableapp(docs_api_service, document_id) # Name der Funktion hier wichtig - if success_filling: # Wird hier nicht viel bedeuten, da das Skript vorher abbricht - print(f"\n--- SKRIPT DEBUG-LAUF BEENDET (NACH dir()) ---") - print(f"Dokument-ID: {document_id}") - print(f"Link: https://docs.google.com/document/d/{document_id}/edit") - print("Bitte die Ausgabe von 'dir(gtable_manager)' prüfen.") - else: print("\n--- FEHLER VOR DEM EIGENTLICHEN BEFÜLLEN (DEBUG-LAUF) ---") + if success_filling: + print(f"\n--- SKRIPT BEENDET ---"); print(f"Dokument-ID: {document_id}"); print(f"Link: https://docs.google.com/document/d/{document_id}/edit") + print("HINWEIS: Es wurde versucht, echte Tabellen via gdoctableapppy zu erstellen.") + print(" Bitte Kopfzeilen ggf. manuell fett formatieren.") + else: print("\n--- FEHLER BEIM BEFÜLLEN MIT TABELLEN ---") else: print("\n--- FEHLGESCHLAGEN: Kein Dokument erstellt ---") \ No newline at end of file