From 2c6a816462b97f3781eac107f57afb2b14ecd6df Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 26 May 2025 19:04:37 +0000 Subject: [PATCH] bugfix --- list_generator.py | 86 ++++++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/list_generator.py b/list_generator.py index 58970ce3..2025ebd6 100644 --- a/list_generator.py +++ b/list_generator.py @@ -61,11 +61,14 @@ def get_services_with_service_account(): # Umbenannt für Klarheit return docs_service, drive_service # Gibt beide Services zurück -def create_and_fill_doc(docs_service, drive_service, folder_id, doc_title): # Umbenannt für Konsistenz - """Erstellt ein Dokument (idealerweise im Ordner) und befüllt es mit CSV-Daten.""" +def create_and_fill_doc(docs_service, drive_service, folder_id, doc_title): # Name beibehalten + """ + Erstellt ein Dokument (idealerweise im Ordner) und befüllt es mit CSV-Daten, + wobei Tabellen als tabulatorgetrennter Text formatiert werden. + """ document_id = None - # 1. Dokument erstellen + # 1. Dokument erstellen (Logik bleibt gleich) if drive_service and folder_id: file_metadata = { 'name': doc_title, @@ -104,7 +107,7 @@ def create_and_fill_doc(docs_service, drive_service, folder_id, doc_title): # Um print("Konnte keine Dokumenten-ID für die Befüllung erhalten.") return None - # 2. Daten aus CSV lesen + # 2. Daten aus CSV lesen (Logik bleibt gleich) kinder_nach_gruppen = collections.defaultdict(list) try: with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile: @@ -128,52 +131,71 @@ def create_and_fill_doc(docs_service, drive_service, folder_id, doc_title): # Um sorted_gruppen_namen = sorted(kinder_nach_gruppen.keys()) stand_zeit = datetime.now().strftime("%d.%m.%Y %H:%M Uhr") - # 3. Dokument befüllen + # 3. Dokument befüllen - JETZT MIT VEREINFACHTER TEXTFORMATIERUNG requests = [] for i, gruppe_original in enumerate(sorted_gruppen_namen): kinder_liste = kinder_nach_gruppen[gruppe_original] anzahl_kinder = len(kinder_liste) gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX - header_text_for_page = (f"{EINRICHTUNG}\t\t\t{FOTOGRAF_NAME}\n{FOTODATUM}\n\n") - if i == 0: - requests.append({'insertText': {'location': {'index': 1}, 'text': header_text_for_page}}) - else: - requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': header_text_for_page}}) + # Baue den gesamten Textblock für diese Seite/Gruppe + page_text_lines = [] - num_rows_for_table = len(kinder_liste) + 1 - num_cols_for_table = 3 - requests.append({'insertTable': {'endOfSegmentLocation': {}, 'rows': num_rows_for_table, 'columns': num_cols_for_table}}) - - table_text_content = [] - table_text_content.append("Nachname\tVorname\tGruppe") - for kind in kinder_liste: - table_text_content.append(f"{kind['Nachname']}\t{kind['Vorname']}\t{gruppe_display_name}") - full_table_text = "\n".join(table_text_content) + "\n" - requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_table_text}}) - - footer_text_for_page = (f"\n{anzahl_kinder} angemeldete Kinder\n\nDies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden\nKinder an die Anmeldung erinnern.\n\nStand {stand_zeit}\n\n{FOTOGRAF_NAME}\n{FOTOGRAF_ADRESSE}\n{FOTOGRAF_WEB}\n{FOTOGRAF_TEL}\n") - requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': footer_text_for_page }}) + # Seiten-Header + page_text_lines.append(f"{EINRICHTUNG}\t\t\t{FOTOGRAF_NAME}") # Tabs für rudimentäre Ausrichtung + page_text_lines.append(FOTODATUM) + page_text_lines.append("") # Leerzeile + # "Tabellen"-Daten als Text + page_text_lines.append("Nachname\tVorname\tGruppe") # Kopfzeile mit Tabs + for kind in kinder_liste: + page_text_lines.append(f"{kind['Nachname']}\t{kind['Vorname']}\t{gruppe_display_name}") + page_text_lines.append("") # Leerzeile nach der "Tabelle" + + # Footer-Text + page_text_lines.append(f"{anzahl_kinder} angemeldete Kinder") + page_text_lines.append("") + page_text_lines.append("Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden") + page_text_lines.append("Kinder an die Anmeldung erinnern.") + page_text_lines.append("") + page_text_lines.append(f"Stand {stand_zeit}") + page_text_lines.append("") + page_text_lines.append(FOTOGRAF_NAME) + page_text_lines.append(FOTOGRAF_ADRESSE) + page_text_lines.append(FOTOGRAF_WEB) + page_text_lines.append(FOTOGRAF_TEL) + + full_page_text = "\n".join(page_text_lines) + "\n" # Alle Zeilen mit Newline verbinden + + # Einfügen des gesamten Textblocks für die Seite + if i == 0: + requests.append({'insertText': {'location': {'index': 1}, 'text': full_page_text}}) + else: + # Nach einem PageBreak sollte der nächste Textblock angehängt werden + requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_page_text}}) + + # Seitenumbruch nach jeder Gruppe, außer der letzten if i < len(sorted_gruppen_namen) - 1: requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) + # Batch-Update ausführen if requests: if not docs_service: print("FEHLER: Docs API Service nicht verfügbar, kann Dokument nicht befüllen.") - return document_id # Gibt ID des (wahrscheinlich leeren) Dokuments zurück + return document_id try: - print(f"Sende Batch Update für Dokument ID '{document_id}'...") + print(f"Sende Batch Update für Dokument ID '{document_id}' (vereinfachte Textformatierung)...") docs_service.documents().batchUpdate( documentId=document_id, body={'requests': requests} ).execute() - print("Dokument erfolgreich befüllt.") + print("Dokument erfolgreich befüllt (mit tabulatorgetrenntem Text).") + print("Sie können den Text in Google Docs markieren und über 'Einfügen' > 'Tabelle' > 'Tabelle aus Text erstellen' umwandeln.") except HttpError as err: print(f"Fehler beim Befüllen des Dokuments ID '{document_id}': {err}") error_details = "Keine Fehlerdetails im Content." if err.content: try: error_details = err.content.decode('utf-8') - except: pass + except: pass # Ignoriere Dekodierungsfehler print(f"Details zum Fehler ({err.resp.status} {err._get_reason()}): {error_details}") return document_id @@ -185,10 +207,10 @@ if __name__ == "__main__": print(f"Info: Gruppennamen werden mit Suffix '{GRUPPENNAME_SUFFIX}' versehen.") print(f"Info: Zieldokumente sollen in Ordner-ID '{TARGET_FOLDER_ID}' landen.") - docs_api_service, drive_api_service = get_services_with_service_account() + docs_api_service, drive_api_service = get_services_with_service_account() # Definition oben im Skript - if docs_api_service: # Mindestens Docs Service muss vorhanden sein - final_doc_id = create_and_fill_doc( # Name der Funktion hier korrigiert + if docs_api_service: + final_doc_id = create_and_fill_doc( # Definition oben im Skript docs_api_service, drive_api_service, TARGET_FOLDER_ID, @@ -198,8 +220,10 @@ if __name__ == "__main__": print(f"\n--- SKRIPT BEENDET ---") print(f"Dokument-ID: {final_doc_id}") print(f"Link: https://docs.google.com/document/d/{final_doc_id}/edit") - if not drive_api_service or not TARGET_FOLDER_ID: # Hinweis, falls nicht im Ordner erstellt + if not drive_api_service or not TARGET_FOLDER_ID: print("Das Dokument wurde im Root-Verzeichnis des Servicekontos erstellt.") + print("HINWEIS: Die 'Tabellen' wurden als tabulatorgetrennter Text eingefügt.") + print(" Öffnen Sie das Dokument und formatieren Sie den Text bei Bedarf als Tabelle.") else: print("\n--- FEHLGESCHLAGEN ---") print("Konnte Dokument nicht erstellen oder befüllen.")