Ich versuche, HTML-Inhalte in ein formatiertes Google Doc zu konvertieren. Mein aktueller Workflow verwendet einen Code-Knoten, um die Basisdaten zu generieren, die dann an einen HTML-Knoten übergeben werden, um den Inhalt zu strukturieren. Ich muss die Ausgabe dieses HTML-Knotens nehmen und ein neues Google-Dokument erstellen, während die HTML-Formatierung erhalten bleibt. Der Standard-Google-Docs-Knoten verarbeitet Klartext problemlos, aber ich suche nach der richtigen Methode oder einem Workaround, um die HTML-Ausgabe hochzuladen, damit die Formatierung intakt bleibt.
Hallo @Benry_Hendix
Das Problem ist, dass der Standard-Google-Docs-Node in n8n nur für einfachen Text ausgelegt ist. Wenn du HTML-Code an den Node sendest, „liest
@Benry_Hendix du wirst es leider schwierig finden, HTML zuverlässig in Google Docs zu konvertieren. HTML/CSS und Google Docs funktionieren intern ganz anders. Text, Überschriften und Listen sollten sich ziemlich einfach konvertieren lassen, aber die anderen Komponenten (besonders die stärker gestylten) werden wahrscheinlich ganz anders aussehen.
Zwei mögliche alternative Ansätze
- Konvertiere das HTML zu Markdown und DANN zu einem Google Doc, aber das wird ziemlich chaotisch.
- Konvertiere das HTML stattdessen zu einer PDF
Wenn jemand eine gute Lösung kennt, würde ich sie gerne hören, aber mir ist keine zuverlässige Methode für HTML → Google Doc-Konvertierungen bekannt.
Nicht die Antwort, die du dir wahrscheinlich erhofft hast, aber hoffentlich trotzdem einigermaßen nützlich.
Alex
Der zuverlässigste Weg, den ich dafür gefunden habe, ist, den Google Docs Node zu überspringen und stattdessen die Google Docs API documents.batchUpdate über einen HTTP Request Node zu verwenden. Der Ansatz: Erstelle ein leeres Dokument mit dem Docs Node, sende dann eine batchUpdate-Anfrage mit einer Reihe von insertText + updateParagraphStyle Anfragen, die aus deiner geparsten HTML-Struktur aufgebaut sind. Es ist mehr Aufwand beim Einrichten, aber gibt dir tatsächliche Überschriftenstile (HEADING_1, HEADING_2, NORMAL_TEXT) und Fett-/Kursiv-Runs, die Docs tatsächlich erkennt.
Wenn deine HTML-Struktur einfach ist (h1-h3, p, ul/li), reicht normalerweise ein Code Node aus, der Tags entfernt und das Requests-Array aufbaut – keine externen Bibliotheken nötig. Ich teile gerne einen Code-Snippet, wenn du ein Beispiel deiner HTML-Ausgabe posten kannst.
Der Google Docs-Knoten funktioniert dafür nicht; er verarbeitet nur Klartext. Die Lösung besteht darin, deine HTML direkt auf Google Drive hochzuladen und dabei den integrierten Konverter zu nutzen. Wenn du eine HTML-Datei hochlädst und Drive anweist, sie als Google Doc zu speichern, liest es die HTML-Tags aus und wandelt sie in echte Formatierung um – Überschriften, fetter Text, Aufzählungslisten, Tabellen, alles davon.
Hier ist die genaue Anleitung in zwei Schritten:
Schritt 1 – Füge nach deinem HTML-Knoten einen Code-Knoten hinzu. Dieser wandelt deinen HTML-Text in eine Datei um, die hochgeladen werden kann
Schritt 2 – Füge danach einen HTTP Request-Knoten hinzu. Das ist der Knoten, der deine Datei zu Google Drive sendet.
Eine Sache, auf die du achten solltest: CSS wird nicht übertragen. Falls deine Formatierung von style=-Attributen oder CSS-Klassen kommt, ignoriert Google Drive diese. Es liest nur HTML-Tags wie <h1>, <strong>, <ul> und <table>. Falls dein HTML-Knoten diese Tags bereits verwendet, bist du auf der sicheren Seite.
Hier geht es los
Node: PDF API Hub
Schritt 1, PDF zu HTML
Schritt 2, PDF zu DOCX
hier ist der Workflow
Wenn du Änderungen am Node oder Format brauchst, gib mir Bescheid, ich kann ein Update pushen.
Du kannst zunächst die Lösungen der anderen Nutzer ausprobieren und dann diese hier versuchen. Ich hatte das gleiche Problem mit Google Docs und wollte Google Drive nicht nutzen. Deshalb habe ich einfach eine .gs-Datei im App Script von Google Docs erstellt, die jede Minute ausgelöst wird (basierend auf meinem Anwendungsfall). Dann parst sie das HTML oder MD, egal was du nach der Auslösung an das Dokument anhängst. Du kannst die Dauer des Triggers je nach Bedarf verkürzen oder verlängern. Hoffentlich behebt das dein Problem.
@Benry_Hendix Ausgehend vom batchUpdate-Ansatz oben finden Sie hier einen Code-Node-Ausschnitt, der die Konvertierung von einfachen HTML-Elementen (h1–h3, p, strong, ul/li) in ein Array von Docs-API-Anfragen durchführt. Dies findet nach der Erstellung eines leeren Dokuments und der Verfügbarkeit seiner ID statt
// Eingabe: {{ $json.html }} — Ihre HTML-Zeichenkette
// Eingabe: {{ $json.html }} — Ihre HTML-Zeichenkette
// Ausgabe: Array von batchUpdate-Anfragen
const html = $input.first().json.html;
const requests = [];
let index = 1;
const lines = html
.replace(/
(.\*?)<\\/h1>/gi, '##H1##$1\\n')
.replace(/
(.*?)<\/h2>/gi, ‘##H2##$1\n’)
.replace(/
(.*?)<\/h3>/gi, ‘##H3##$1\n’)
.replace(/
(.*?)<\/p>/gi, ‘$1\n’)
.replace(/
.replace(/<[^
]+>/g, ‘’)
.split(‘\n’)
.filter(l => l.trim());
for (const line of lines) {
const isH1 = line.startsWith(‘##H1##’);
const isH2 = line.startsWith(‘##H2##’);
const isH3 = line.startsWith(‘##H3##’);
const text = line.replace(/##H[123]##/, ‘’) + ‘\n’;
const style = isH1 ? ‘HEADING_1’ : isH2 ? ‘HEADING_2’ : isH3 ? ‘HEADING_3’ : ‘NORMAL_TEXT’;
requests.push({ insertText: { location: { index }, text } });
if (style !== ‘NORMAL_TEXT’) {
requests.push({
updateParagraphStyle: {
range: { startIndex: index, endIndex: index + text.length },
paragraphStyle: { namedStyleType: style },
fields: 'namedStyleType'
}
});
}
index += text.length;
}
return [{ json: { requests } }];
Übergeben Sie das requests-Array an einen HTTP-Request-Node, der POST https://docs.googleapis.com/v1/documents/{docId}:batchUpdate mit Ihren Google-OAuth2-Anmeldedaten aufruft. CSS wird nicht übernommen, aber strukturelle Tags schon.
