bugfix
This commit is contained in:
@@ -4,21 +4,19 @@ import collections
|
|||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
from google.oauth2 import service_account
|
from google.oauth2 import service_account
|
||||||
from googleapiclient.discovery import build # discovery wird für das resource-Objekt der Lib benötigt
|
from googleapiclient.discovery import build
|
||||||
from googleapiclient.errors import HttpError
|
from googleapiclient.errors import HttpError
|
||||||
|
|
||||||
# Importiere die neue Bibliothek - KORRIGIERTER IMPORT und KLASSENNAME
|
# Importiere die Bibliothek - korrigierter Import basierend auf Dateisystem
|
||||||
from gdoctableapppy.gdoctableapp import gdoctableapp # Klasse ist klein geschrieben
|
from gdoctableapppy.gdoctableapp import gdoctableapp
|
||||||
|
|
||||||
# --- Konfiguration ---
|
# --- Konfiguration ---
|
||||||
CSV_FILENAME = 'Namensliste.csv'
|
CSV_FILENAME = 'Namensliste.csv'
|
||||||
GOOGLE_DOC_TITLE = f"Gruppenlisten_{datetime.now().strftime('%Y-%m-%d_%H-%M')}"
|
GOOGLE_DOC_TITLE = f"Gruppenlisten_{datetime.now().strftime('%Y-%m-%d_%H-%M')}"
|
||||||
TARGET_FOLDER_ID = "18DNQaH9zbcBzwhckJI-4Uah-WXTXg6bg"
|
TARGET_FOLDER_ID = "18DNQaH9zbcBzwhckJI-4Uah-WXTXg6bg"
|
||||||
|
|
||||||
# Diese werden nur für den einmaligen Infoblock verwendet
|
|
||||||
EINRICHTUNG_INFO = "Kinderhaus St. Martin Neuching"
|
EINRICHTUNG_INFO = "Kinderhaus St. Martin Neuching"
|
||||||
FOTODATUM_INFO = "02. - 05.06.2025"
|
FOTODATUM_INFO = "02. - 05.06.2025"
|
||||||
|
|
||||||
GRUPPENNAME_SUFFIX = "gruppe"
|
GRUPPENNAME_SUFFIX = "gruppe"
|
||||||
|
|
||||||
SCOPES = [
|
SCOPES = [
|
||||||
@@ -42,8 +40,7 @@ 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) ...
|
kinder_nach_gruppen = collections.defaultdict(list)
|
||||||
kinder_nach_gruppen = collections.defaultdict(list) # Muss hier definiert werden
|
|
||||||
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=';')
|
||||||
@@ -61,10 +58,19 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
|
|||||||
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)
|
||||||
|
|
||||||
|
# --- 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:
|
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
|
||||||
|
|
||||||
additional_requests_fallback = []
|
additional_requests_fallback = [] # Nur für den unwahrscheinlichen Fall, dass wir es brauchen
|
||||||
|
|
||||||
for i, gruppe_original in enumerate(sorted_gruppen_namen):
|
for i, gruppe_original in enumerate(sorted_gruppen_namen):
|
||||||
kinder_liste = kinder_nach_gruppen[gruppe_original]
|
kinder_liste = kinder_nach_gruppen[gruppe_original]
|
||||||
@@ -78,51 +84,30 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
print(f"Versuche Tabelle für Gruppe '{gruppe_original}' mit gdoctableapp einzufügen...")
|
print(f"Versuche Tabelle für Gruppe '{gruppe_original}' mit gdoctableapp einzufügen...")
|
||||||
# KORREKTER METHODENNAME: create_table
|
# HIER WÜRDEN DIE KORREKTEN METHODENAUFRUFE STEHEN, SOBALD WIR SIE KENNEN
|
||||||
res_table_obj = gtable_manager.create_table(values=table_values, index=None)
|
# z.B. res_table_obj = gtable_manager.RICHTIGER_NAME_FUER_CREATE_TABLE(values=table_values, index=None)
|
||||||
|
|
||||||
# Die Doku für create_table sagt:
|
# ... (Logik für Fettformatierung mit korrekten Methodennamen) ...
|
||||||
# "When this is used, the table is created to the last of body. And, this method returns the object including the created table object and the start and end indexes of the table."
|
|
||||||
# Das zurückgegebene Objekt sollte also `{"table_object": {...}, "startIndex": X, "endIndex": Y}` sein.
|
|
||||||
# Und table_object enthält `created_table` mit `startIndex` (was wir als `tableStartIndex` brauchen).
|
|
||||||
|
|
||||||
# Laut der Doku zu `set_text_style_to_range` ist der Key im table_range Objekt `tableStartIndex` (großes S, kleines i).
|
# ... (Logik für Footer-Text mit korrekten Methodennamen) ...
|
||||||
if res_table_obj and "table_object" in res_table_obj and "created_table" in res_table_obj["table_object"]:
|
|
||||||
created_table_info = res_table_obj["table_object"]["created_table"]
|
|
||||||
table_start_idx_for_style = created_table_info.get("startIndex") # Dies ist der StartIndex des Tabellenobjekts selbst
|
|
||||||
|
|
||||||
if table_start_idx_for_style is not None:
|
pass # Platzhalter, da die eigentlichen Aufrufe noch unklar sind
|
||||||
header_range_for_style = {
|
|
||||||
"tableStartIndex": table_start_idx_for_style, # Korrekter Schlüsselname für die Methode
|
|
||||||
"rowIndex": 0,
|
|
||||||
"columnIndex": 0,
|
|
||||||
"rowSpan": 1,
|
|
||||||
"colSpan": 3
|
|
||||||
}
|
|
||||||
text_style_bold = {"bold": True}; fields_bold = "bold"
|
|
||||||
# KORREKTER METHODENNAME: set_text_style_to_range
|
|
||||||
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" Konnte startIndex für Tabelle '{gruppe_original}' nicht erhalten für Formatierung.")
|
|
||||||
else: print(f" Unerwartete Antwort von create_table für Formatierung: {res_table_obj}")
|
|
||||||
|
|
||||||
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"
|
|
||||||
if full_footer_text_for_group.strip():
|
|
||||||
# KORREKTER METHODENNAME: insert_text
|
|
||||||
gtable_manager.insert_text(text=full_footer_text_for_group, index=None)
|
|
||||||
|
|
||||||
|
except AttributeError as e_attr:
|
||||||
|
print(f"AttributeError bei Gruppe '{gruppe_original}': {e_attr}")
|
||||||
except Exception as e_table:
|
except Exception as e_table:
|
||||||
print(f"Fehler bei Tabelle/Footer für Gruppe '{gruppe_original}': {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"}})
|
additional_requests_fallback.append({'insertText': {'endOfSegmentLocation': {}, 'text': f"\nFEHLER BEI TABELLE {gruppe_original}\n"}})
|
||||||
|
|
||||||
if i < len(sorted_gruppen_namen) - 1:
|
|
||||||
try:
|
# if i < len(sorted_gruppen_namen) - 1:
|
||||||
# KORREKTER METHODENNAME: insert_page_break
|
# try:
|
||||||
gtable_manager.insert_page_break(index=None)
|
# # HIER DER KORREKTE METHODENAUFRUF FÜR PAGEBREAK
|
||||||
except Exception as e_pb:
|
# # gtable_manager.RICHTIGER_NAME_FUER_PAGEBREAK(index=None)
|
||||||
print(f"Fehler beim Einfügen des PageBreak nach {gruppe_original}: {e_pb}")
|
# pass
|
||||||
additional_requests_fallback.append({'insertPageBreak': {'endOfSegmentLocation': {}}})
|
# except Exception as e_pb:
|
||||||
|
# print(f"Fehler beim Einfügen des PageBreak nach {gruppe_original}: {e_pb}")
|
||||||
|
# additional_requests_fallback.append({'insertPageBreak': {'endOfSegmentLocation': {}}})
|
||||||
|
|
||||||
if additional_requests_fallback and docs_api_service:
|
if additional_requests_fallback and docs_api_service:
|
||||||
try:
|
try:
|
||||||
@@ -133,24 +118,16 @@ def generate_tables_with_gdoctableapp(docs_api_service, document_id_to_fill):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
# --- Main execution block ---
|
# --- Main execution block ---
|
||||||
# (Bleibt weitgehend gleich, ruft generate_tables_with_gdoctableapp auf)
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print(f"Info: Ordner-ID für Dokument: '{TARGET_FOLDER_ID}'")
|
print(f"Info: Ordner-ID für Dokument: '{TARGET_FOLDER_ID}'")
|
||||||
# Wichtig: discovery.build wird für das resource Objekt der Lib gebraucht,
|
|
||||||
# unser get_services_with_service_account gibt aber das schon gebaute service Objekt zurück.
|
|
||||||
# Wir sollten `creds` zurückgeben und den Service ggf. neu bauen oder das `resource` Objekt anpassen.
|
|
||||||
# Einfacher: `docs_api_service` ist das, was die Lib als `docsService` braucht.
|
|
||||||
|
|
||||||
docs_api_service, drive_api_service = get_services_with_service_account()
|
docs_api_service, drive_api_service = get_services_with_service_account()
|
||||||
|
|
||||||
if not docs_api_service:
|
if not docs_api_service:
|
||||||
print("Konnte Google Docs API Service nicht initialisieren. Skript wird beendet.")
|
print("Konnte Google Docs API Service nicht initialisieren. Skript wird beendet.")
|
||||||
else:
|
else:
|
||||||
document_id = None
|
document_id = None
|
||||||
# 1. Dokument erstellen (wie zuvor)
|
# 1. Dokument erstellen
|
||||||
# ... (Code für Dokumenterstellung bleibt gleich) ...
|
|
||||||
if drive_api_service and TARGET_FOLDER_ID:
|
if drive_api_service and TARGET_FOLDER_ID:
|
||||||
# ... (Drive API Erstellung) ...
|
|
||||||
file_metadata = {'name': GOOGLE_DOC_TITLE, 'mimeType': 'application/vnd.google-apps.document', 'parents': [TARGET_FOLDER_ID]}
|
file_metadata = {'name': GOOGLE_DOC_TITLE, 'mimeType': 'application/vnd.google-apps.document', 'parents': [TARGET_FOLDER_ID]}
|
||||||
try:
|
try:
|
||||||
created_file = drive_api_service.files().create(body=file_metadata, fields='id').execute()
|
created_file = drive_api_service.files().create(body=file_metadata, fields='id').execute()
|
||||||
@@ -167,17 +144,18 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
if document_id:
|
if document_id:
|
||||||
# 2. Einmalige Info am Anfang
|
# 2. Einmalige Info am Anfang
|
||||||
# ... (Code für initial_info bleibt gleich, wird mit docs_api_service.batchUpdate eingefügt) ...
|
|
||||||
initial_info_lines = ["Info zum Kopieren für Ihre manuelle Kopfzeile:", EINRICHTUNG_INFO, FOTODATUM_INFO, "\n" + "="*70 + "\n" ]
|
initial_info_lines = ["Info zum Kopieren für Ihre manuelle Kopfzeile:", EINRICHTUNG_INFO, FOTODATUM_INFO, "\n" + "="*70 + "\n" ]
|
||||||
initial_text = "\n".join(initial_info_lines) + "\n"; initial_requests = [{'insertText': {'location': {'index': 1}, 'text': initial_text}}]
|
initial_text = "\n".join(initial_info_lines) + "\n"; initial_requests = [{'insertText': {'location': {'index': 1}, 'text': initial_text}}]
|
||||||
try: docs_api_service.documents().batchUpdate(documentId=document_id, body={'requests': initial_requests}).execute(); print("Einmalige Info eingefügt.")
|
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}")
|
except HttpError as err: print(f"Fehler bei einmaliger Info: {err}")
|
||||||
|
|
||||||
# 3. Dokument mit Tabellen befüllen
|
# 3. Dokument mit Tabellen befüllen (wird nach dir() Ausgabe beendet)
|
||||||
success_filling = generate_tables_with_gdoctableapp(docs_api_service, document_id)
|
success_filling = generate_tables_with_gdoctableapp(docs_api_service, document_id) # Name beibehalten
|
||||||
|
|
||||||
if success_filling:
|
if success_filling: # Wird hier nicht viel bedeuten, da das Skript vorher abbricht
|
||||||
print(f"\n--- SKRIPT BEENDET ---"); print(f"Dokument-ID: {document_id}"); print(f"Link: https://docs.google.com/document/d/{document_id}/edit")
|
print(f"\n--- SKRIPT DEBUG-LAUF BEENDET (NACH dir()) ---")
|
||||||
print("HINWEIS: Es wurde versucht, echte Tabellen mit fetter Kopfzeile via gdoctableapppy zu erstellen.")
|
print(f"Dokument-ID: {document_id}")
|
||||||
else: print("\n--- FEHLER BEIM BEFÜLLEN MIT TABELLEN ---")
|
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) ---")
|
||||||
else: print("\n--- FEHLGESCHLAGEN: Kein Dokument erstellt ---")
|
else: print("\n--- FEHLGESCHLAGEN: Kein Dokument erstellt ---")
|
||||||
Reference in New Issue
Block a user