Maison >développement back-end >Tutoriel Python >Comment insérer un modèle HTML rendu dans un document Google à l'aide de Python

Comment insérer un modèle HTML rendu dans un document Google à l'aide de Python

王林
王林avant
2024-02-11 20:18:041334parcourir

如何使用 Python 将渲染的 HTML 模板插入 Google 文档

Contenu de la question

Je suis confronté à un défi pour insérer par programme un modèle HTML dans un document Google à l'aide de Python. Je sais qu'il n'existe aucune fonctionnalité native/intégrée dans l'éditeur Google Docs ou l'API Google Docs qui puisse résoudre mon problème, mais j'ai essayé quelques astuces pour atteindre mon objectif. Ici, nous ignorons "où" dans le document nous devrions insérer, pour l'instant, une simple insertion réussie suffit.

Ma méthode est la suivante :

  1. Téléchargez le fichier html dans Google Drive avec le nom application/vnd.google-apps.document car Google Docs convertira automatiquement le HTML en doc. (Pas parfait, mais efficace)
  2. Utilisez google docs api get() pour obtenir le contenu du fichier (format google docs json).
  3. Utilisez google docs batchupdate() pour mettre à jour le fichier cible avec le nouveau contenu.
def insert_template_to_file(target_file_id, content):
    media = MediaIoBaseUpload(BytesIO(content.encode('utf-8')), mimetype='text/html', resumable=True)
    body = {
        'name': 'document_test_html',
        'mimeType': 'application/vnd.google-apps.document',
        'parents': [DOC_FOLDER_ID]
    }

    try:
        # Create HTML as docs because it automatically convert html to docs
        content_file = driver_service.files().create(body=body, media_body=media).execute()
        content_file_id = content_file.get('id')

        # Collect html content from Google Docs after created
        doc = docs_service.documents().get(documentId=content_file_id, fields='body').execute()
        request_content = doc.get('body').get('content')

        # Insert the content from html to target file
        result = docs_service.documents().batchUpdate(documentId=target_file_id, body={'requests': request_content}).execute()
        print(result)

        # Delete html docs
        driver_service.files().delete(fileId=content_file_id).execute()
        print("Content inserted successfuly")
    except HttpError as error:
        # Delete html docs even if failed
        driver_service.files().delete(fileId=content_file_id).execute()
        print(f"An error occurred: {error}")

Le problème est le suivant : Ce que je déduis de l'étape 2 ne correspond pas à ce qu'exige batchupdate(). J'essaie d'ajuster les choses à l'étape 2 pour qu'elles correspondent à l'étape 3, mais je n'ai pas encore réussi.

Solution cible : Obtenez la chaîne avec le code html, Insérez le code HTML rendu dans le fichier cible sur Google Docs. L'objectif est d'ajouter le contenu existant du fichier cible au code HTML, et non de l'écraser.

Mon approche a-t-elle du sens ? Avez-vous d'autres idées pour atteindre mon objectif ?


Bonne réponse


Je crois que vos objectifs sont les suivants.

  • Vous souhaitez ajouter des données HTML à un document Google en rendant le HTML.
  • Vous souhaitez utiliser googleapis pour python pour y parvenir.

Malheureusement, à ce stade, l'objet json récupéré par "method:documents.get" ne semble pas être directement utilisé comme corps de requête de "method:documents.batchupdate".

Cependant, si vous souhaitez ajouter du HTML à un document Google existant, je pense que vous pouvez le faire en utilisant uniquement l'API du lecteur. Qu’en est-il de l’exemple de script ci-dessous lorsque cela se reflète dans l’exemple de script ?

Exemple de script :

def insert_template_to_file(target_file_id, content):
    request = drive_service.files().export(fileId=target_file_id, mimeType="text/html")
    file = BytesIO()
    downloader = MediaIoBaseDownload(file, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%" % int(status.progress() * 100))
    file.seek(0)
    current_html = file.read()

    media = MediaIoBaseUpload(BytesIO(current_html + content.encode('utf-8')), mimetype='text/html', resumable=True)
    body = {'mimeType': 'application/vnd.google-apps.document'}

    try:
        result = drive_service.files().update(fileId=target_file_id, body=body, media_body=media).execute()
        print(result)
        print("Content inserted successfuly")
    except HttpError as error:
        print(f"An error occurred: {error}")
  • Dans ce script modifié, les données HTML sont récupérées à partir d'un document Google existant et le nouveau code HTML est ajouté au code HTML récupéré. De plus, les documents Google sont mis à jour avec du HTML mis à jour. Dans votre cas, les données brutes semblent être du HTML. Je pense donc que cette méthode peut fonctionner.

Remarque :

  • Ce script écrasera les documents Google de target_file_id. Ainsi, lorsque vous testez ce script, je vous recommande d'utiliser les exemples de documents Google.

Référence :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer