bugfix
This commit is contained in:
@@ -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.")
|
||||
|
||||
Reference in New Issue
Block a user