Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Convert XLSX to Sheets in Google Drive API v3

I want to convert xlsx files automatically to Google spreadsheets when I upload them with my code to Google Drive. However, while the conversion works successfully for csv files, I get:

<HttpError 400 when requesting https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&alt=json returned "Bad Request">

when trying to upload xlsx.

Here is my code:

def upload_service(filepath, name="", description="", fileID="", parentID=""):
    """ Uses a Resource (service) object to upload a file to drive. """

    if service == "": authenticate_service()

    if name == "":
        name = str(os.path.basename(filepath).split(os.extsep)[0])   # Get from filepath

    extension = str(os.path.basename(filepath).split(os.extsep)[1]).lower()

    if extension == "csv":                  # CSV
        mime_type = "text/csv"
    elif extension in ["xls", "xlsx"]:      # EXCEL
        mime_type = "application/ms-excel"
    else:
        return

    media_body = MediaFileUpload(filepath, mimetype=mime_type, resumable=True)

    if parentID == "":
        meta = dict(name=name, mimeType="application/vnd.google-apps.spreadsheet", description=description)
    else:
        meta = dict(name=name, mimeType="application/vnd.google-apps.spreadsheet", description=description, parents=[parentID])

    if fileID == "":   # CREATE 
        upload = service.files().create(
                                    body=meta,
                                    media_body=media_body).execute()
    else:   # REPLACE
        upload = service.files().update(
                                body=meta,
                                media_body=media_body,
                                fileId=fileID).execute()

    print ("\nFINISHED UPLOADING")

How can I do this in v3? It's very clear how to do it in v2, but not in the updated API.

like image 530
Elliptica Avatar asked Apr 29 '16 23:04

Elliptica


1 Answers

In APIv3, you need to specify a very specific MIME Type for the conversion to occur.

At https://developers.google.com/drive/v3/web/manage-uploads#importing_to_google_docs_types_wzxhzdk8wzxhzdk9, you'll notice the statement "The supported conversions are available dynamically in the About resource's importFormats array". Get the importFormats list using either

GET https://www.googleapis.com/drive/v3/about?fields=importFormats&key={YOUR_API_KEY}

or by going to https://developers.google.com/drive/v3/reference/about/get#try-it and entering importFormats

You'll notice in the response:

"application/vnd.ms-excel": [
   "application/vnd.google-apps.spreadsheet"
]

In your code, use:

elif extension in ["xls", "xlsx"]:      # EXCEL
    mime_type = "application/vnd.ms-excel"

(notice the additional vnd.)and it should work well!

like image 144
numeratus Avatar answered Dec 28 '22 10:12

numeratus