This commit is contained in:
2025-05-27 05:55:59 +00:00
parent f6a2b530a9
commit 32ca0b8a1b

View File

@@ -40,8 +40,8 @@ def get_services_with_service_account():
return docs_service, drive_service return docs_service, drive_service
def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill): def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
# ... (CSV-Lesen, sorted_gruppen_namen, stand_zeit bleiben gleich) ... # ... (CSV-Lesen, sorted_gruppen_namen, stand_zeit wie in der letzten funktionierenden Version) ...
kinder_nach_gruppen = collections.defaultdict(list) # Definition hier oben kinder_nach_gruppen = collections.defaultdict(list)
try: try:
with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile: with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=';') reader = csv.DictReader(csvfile, delimiter=';')
@@ -56,13 +56,13 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
sorted_gruppen_namen = sorted(kinder_nach_gruppen.keys()) sorted_gruppen_namen = sorted(kinder_nach_gruppen.keys())
stand_zeit = datetime.now().strftime("%d.%m.%Y %H:%M Uhr") stand_zeit = datetime.now().strftime("%d.%m.%Y %H:%M Uhr")
try: try:
resource_for_lib = {"docsService": docs_api_service, "documentId": document_id_to_fill} resource_for_lib = {"docsService": docs_api_service, "documentId": document_id_to_fill}
gtable_manager = gdoctableapp(resource_for_lib) gtable_manager = gdoctableapp(resource_for_lib)
except Exception as e_dta_init: except Exception as e_dta_init:
print(f"Fehler bei der Initialisierung von gdoctableapp: {e_dta_init}"); return False print(f"Fehler bei der Initialisierung von gdoctableapp: {e_dta_init}"); return False
# Diese Liste sammelt Requests für Text außerhalb von Tabellen und für Seitenumbrüche
non_table_requests = [] non_table_requests = []
for i, gruppe_original in enumerate(sorted_gruppen_namen): for i, gruppe_original in enumerate(sorted_gruppen_namen):
@@ -70,45 +70,77 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
anzahl_kinder = len(kinder_liste) anzahl_kinder = len(kinder_liste)
gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX
table_values = [] # table_values ist hier unsere Liste von Listen für die Tabellendaten
# Kopfzeile (wird nicht fett per API in dieser Version) table_values_for_lib = []
table_values.append(["Nachname", "Vorname", "Gruppe"]) table_values_for_lib.append(["Nachname", "Vorname", "Gruppe"])
for kind in kinder_liste: for kind in kinder_liste:
table_values.append([kind['Nachname'], kind['Vorname'], gruppe_display_name]) table_values_for_lib.append([kind['Nachname'], kind['Vorname'], gruppe_display_name])
try: try:
print(f"Erstelle Tabelle für Gruppe '{gruppe_original}' mit gdoctableapp...") 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
# Text unter der Tabelle (Anzahl Kinder, etc.) # KORREKTER PARAMETERNAME: tableData
# Die Methode `createTable` benötigt entweder `rows` und `columns` (für eine leere Tabelle)
# ODER `tableData` (für eine Tabelle mit Inhalt).
# Wenn tableData gegeben ist, werden rows/columns daraus abgeleitet.
res_table = gtable_manager.createTable(tableData=table_values_for_lib, index=None)
# ^^^^^^^^^
print(f" Tabelle für '{gruppe_original}' erstellt. Antwort: {res_table}")
# Fettformatierung der Kopfzeile (bleibt als Versuch, Methodennamen müssen stimmen)
# Die Fettformatierung ist nach wie vor schwierig, da wir die genaue
# Methode und die Struktur des table_range Objekts für set_text_style_to_range
# aus der Bibliothek nicht 100% kennen.
# Für den Moment lassen wir den Versuch drin, aber mit geringer Erfolgserwartung.
if res_table and "table_object" in res_table and "created_table" in res_table["table_object"]:
created_table_info = res_table["table_object"]["created_table"]
table_start_idx_for_style = created_table_info.get("startIndex")
if table_start_idx_for_style is not None:
# Versuchen wir, ob set_text_style_to_range auf gtable_manager existiert.
# Wenn nicht, wird dies einen AttributeError geben.
if hasattr(gtable_manager, 'set_text_style_to_range'):
header_range_for_style = { "tableStartIndex": table_start_idx_for_style, "rowIndex": 0, "columnIndex": 0, "rowSpan": 1, "colSpan": 3}
text_style_bold = {"bold": True}; fields_bold = "bold"
gtable_manager.set_text_style_to_range(text_style_bold, fields_bold, table_range=header_range_for_style)
print(f" Kopfzeile für Tabelle '{gruppe_original}' versucht fett zu formatieren.")
else:
print(f" Methode 'set_text_style_to_range' nicht auf gtable_manager gefunden. Kopfzeile nicht fett formatiert.")
else: print(f" Konnte startIndex für Formatierung von Tabelle '{gruppe_original}' nicht erhalten.")
else: print(f" Unerwartete Antwort von createTable für Formatierung: {res_table}")
footer_lines_for_group = ["", f"{anzahl_kinder} angemeldete Kinder", "", footer_lines_for_group = ["", f"{anzahl_kinder} angemeldete Kinder", "",
"Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden", "Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden",
"Kinder an die Anmeldung erinnern.", "", "Kinder an die Anmeldung erinnern.", "",
f"Stand {stand_zeit}", ""] f"Stand {stand_zeit}", ""]
full_footer_text_for_group = "\n".join(footer_lines_for_group) + "\n" full_footer_text_for_group = "\n".join(footer_lines_for_group) + "\n"
# Da gdoctableapp keine einfache 'add_text' Methode für reinen Text hat, # Wenn gdoctableapp eine Methode zum Einfügen von Text hat (z.B. insert_text), verwenden wir die.
# fügen wir diesen Text über unseren eigenen BatchUpdate Request hinzu. # Andernfalls sammeln wir es für einen manuellen Batch.
if hasattr(gtable_manager, 'insert_text'):
if full_footer_text_for_group.strip():
gtable_manager.insert_text(text=full_footer_text_for_group, index=None)
else:
non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_footer_text_for_group}}) non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_footer_text_for_group}})
except AttributeError as e_attr: # Fängt Fehler ab, wenn Methoden nicht existieren
print(f"AttributeError bei Tabelle/Footer für Gruppe '{gruppe_original}': {e_attr}")
non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nATTRIBUTE_ERROR BEI TABELLE {gruppe_original}: {e_attr}\n"}})
except Exception as e_table: except Exception as e_table:
print(f"Fehler bei Tabelle für Gruppe '{gruppe_original}': {e_table}") print(f"Allgemeiner Fehler bei Tabelle für Gruppe '{gruppe_original}': {e_table}")
non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nFEHLER BEI TABELLE {gruppe_original}\n"}}) non_table_requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nFEHLER BEI TABELLE {gruppe_original}\n"}})
if i < len(sorted_gruppen_namen) - 1: if i < len(sorted_gruppen_namen) - 1:
if hasattr(gtable_manager, 'insert_page_break'):
try:
gtable_manager.insert_page_break(index=None)
except Exception as e_pb:
print(f"Fehler bei gtable_manager.insert_page_break nach {gruppe_original}: {e_pb}")
non_table_requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}})
else:
non_table_requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) non_table_requests.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 non_table_requests and docs_api_service: if non_table_requests and docs_api_service:
try: try:
@@ -117,8 +149,7 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
print("Text- und PageBreak-Requests erfolgreich ausgeführt.") print("Text- und PageBreak-Requests erfolgreich ausgeführt.")
except HttpError as err: except HttpError as err:
print(f"Fehler bei gesammelten Text-/PageBreak-Requests: {err}") print(f"Fehler bei gesammelten Text-/PageBreak-Requests: {err}")
# ... (Fehlerdetails) ... return False
return False # Befüllen war nicht vollständig erfolgreich
return True return True