This commit is contained in:
2025-05-26 19:04:37 +00:00
parent 1c4d26bd18
commit 2c6a816462

View File

@@ -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.")