Подтвердить что ты не робот

Загрузка CSV в электронную таблицу на Диске с помощью API v2

Как загрузить локальный файл CSV на Google Диск с помощью Дискового API v2, чтобы загруженный файл находился в родной таблице Google. > . Предпочтительно в Python, но необработанный HTTP-запрос будет достаточным.

Что я пробовал:

  • Запросить тип содержимого тела: 'application/vnd.google-apps.spreadsheet', media_body content-type: 'text/csv'. → 401 Плохой запрос

  • Запросить тип содержимого тела: 'application/vnd.google-apps.spreadsheet', media_body content-type: 'application/vnd.google-apps.spreadsheet'. → 400 Bad Request

  • ... (пара других, таких как выход из свойства и т.п., обычно получает 400 или диск не распознал его как родную электронную таблицу)

4b9b3361

Ответ 1

Ваш запрос на вставку должен указывать text/csv как тип содержимого. Уловкой для преобразования файла является добавление параметра запроса ?convert=true к URL-адресу запроса:

https://developers.google.com/drive/v2/reference/files/insert

Ответ 2

(март 2017 г.). Примечание. В то время как вопрос конкретно задает вопрос о драйвере API v2, разработчики должны знать, что Google Drive API команда выпустила v3 в конце 2015 года, а в этом выпуске insert() изменила имена на create(), чтобы лучше отразить операция файла. Там также больше нет флага конвертации - вы просто указываете MIMEtypes... представьте, что!

Документация также была улучшена: теперь существует специальное руководство, посвященное загрузкам (простое, многократное и возобновляемое), которое поставляется с образцом кода в Java, Python, PHP, С#/. NET, Ruby, JavaScript/ Node.js и iOS/Obj-C, чтобы загрузить файл, а другой, который импортирует CSV файл в качестве Листа Google.

Просто для того, чтобы прямо показать это, ниже представлено одно альтернативное решение Python (к образцу в документах) для коротких файлов ( "простая загрузка" ), где вам не нужен класс apiclient.http.MediaFileUpload. Этот фрагмент предполагает, что ваш auth-код работает там, где конечная точка службы DRIVE с минимальным объемом полномочий https://www.googleapis.com/auth/drive.file.

# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'

# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
    print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))

Ответ 3

Ответ Клаудио Керубино правильный - вам нужно добавить параметр вручную. Так как вы спросили в Python, вот конкретный пример:

body = {
    'mimeType':'text/csv',
    'title': 'title'
}

# service: your authenticated service
# media: your apiclient.http.MediaFileUpload object, with 'text/csv' mimeType
req = service.files().insert(media_body=media, body=body)

# patch the uri to ensure conversion, as the documented kwarg seems to be borked.
# you may need to use '?convert=true' depending on the uri, not taking that into
# account here for sake of simplicity.
req.uri = req.uri + '&convert=true'

# now we can execute the response.
resp = req.execute()

# should be OK
assert resp['mimeType'] == u'application/vnd.google-apps.spreadsheet'

Ответ 4

Java:

    //Insert a file  
    File body = new File();
    body.setTitle("CSV");
    body.setDescription("A test document");
    body.setMimeType("text/csv");

    java.io.File fileContent = new java.io.File("document.csv");
    FileContent mediaContent = new FileContent("text/csv", fileContent);

    Insert insert = service.files().insert(body, mediaContent);
    insert.setConvert(true);
    File file = insert.execute();
    System.out.println("File ID: " + file.getId());