1

Я хочу автоматически конвертировать xlsx файлы в электронные таблицы Google, когда я загружаю их с помощью своего кода на Google Диск. Однако, хотя конверсия успешно работает для файлов csv, я получаю:Как преобразовать XLSX в таблицы в API Google Диска v3

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

при попытке загрузить xlsx.

Вот мой код:

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") 

Как я могу сделать это в v3? Очень ясно, как это сделать в версии v2, но не в обновленном API.

ответ

4

В APIv3, вам нужно указать очень специфический тип MIME для преобразования происходят.

В https://developers.google.com/drive/v3/web/manage-uploads#importing_to_google_docs_types_wzxhzdk8wzxhzdk9 вы заметите утверждение «Поддерживаемые конверсии доступны динамически в массиве importFormats« О ресурсе ». Получить importFormats список, используя либо

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

или собирается https://developers.google.com/drive/v3/reference/about/get#try-it и ввод importFormats

Вы заметите в ответ:

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

В коде использования:

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

(обратите внимание на дополнительный vnd.), и он должен хорошо работать!

+0

Это сработало для меня! – Elliptica

0

Основано на Official Google Documentation, вы получили 400: Bad Request, что означает, что обязательное поле или параметр не предоставлен, указанное значение недействительно или комбинация предоставленных полей недействительна. Эта ошибка может возникнуть при попытке добавить родителя, который создаст цикл в графе каталога.

При столкновении с этой ошибкой предлагаемым действием является использование exponential backoff. это стандартная стратегия обработки ошибок для сетевых приложений, в которой клиент периодически повторяет неудавшийся запрос за все большее количество времени.

Вы можете использовать официальный Google Docs для справки Существует параметр convertconvert=true, преобразовать файл в соответствующий формат Документов Google (по умолчанию: ложь).

Вам также необходимо использовать Python client library, вы можете использовать эту библиотеку для поддержки загрузки файлов.

Найдено этот Stack Overflow билет, проверить решения, предлагаемые сообществом: python + google drive: upload xlsx, convert to google sheet, get sharable link

+0

Параметр, на который вы ссылаетесь, является опцией Google v2, тогда как этот вопрос относится к v3. Google v3 не предоставляет этот параметр и метод, предложенный [docs] (https://developers.google.com/drive/v3/web/migration#notable_changes), не работает. – Elliptica