I am facing a challenge to programmatically insert an html template into a google doc using python. I know there is no native/built-in functionality in google docs editor or google docs api that can solve my problem, but I tried some tricks to achieve my goal. Here we are ignoring "where" in the document we should insert, for now just successful insertion is enough.
My method is:
application/vnd.google-apps.document
, because google docs will automatically convert html to document. (Not perfect, but effective) 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}")
The problem is: What I gathered from step 2 does not match what batchupdate() requires. I'm trying to adjust things in step 2 to match step 3, but haven't been successful yet.
Target solution: Get the string with the html code, Insert the rendered html into the target file on google docs. The goal is to append the existing content of the target file to the html, not overwrite it.
Does my approach make sense? Do you have any other ideas to achieve my goal?
I believe your goals are as follows.
Unfortunately, at this stage, the json object retrieved by "method:documents.get" does not seem to be directly used as the request body of "method:documents.batchupdate".
However, if you want to append html to an existing google doc, I think you can do it just using the drive api. How about the example script below when this is reflected in the example 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}")
target_file_id
. So when you test this script, I recommend you use the sample google docs. The above is the detailed content of How to insert a rendered HTML template into a Google Doc using Python. For more information, please follow other related articles on the PHP Chinese website!