25 votes

Chargement d'un fichier CSV dans une feuille de calcul Google Drive à l'aide de l'API Drive v2

Comment puis-je télécharger un fichier local CSV sur Google Drive à l'aide de l'option Drive API v2 afin que le fichier téléchargé se trouve dans le répertoire feuille de calcul Google native format. De préférence en Python, mais une requête HTTP brute suffira.

Ce que j'ai essayé :

  1. request body content-type : 'application/vnd.google-apps.spreadsheet', media_body content-type : 'text/csv'. --> 401 Bad Request

  2. request body content-type : 'application/vnd.google-apps.spreadsheet', media_body content-type : 'application/vnd.google-apps.spreadsheet'. --> 400 Bad Request

  3. ... (quelques autres, comme l'omission d'une propriété et autres, ont généralement obtenu 400 ou Drive n'a pas reconnu qu'il s'agissait d'une feuille de calcul native).

24voto

Claudio Cherubino Points 10519

Votre demande d'insertion doit préciser text/csv comme type de contenu. L'astuce pour convertir le fichier consiste à ajouter l'élément ?convert=true au paramètre de requête de l'url de la demande :

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

11voto

wescpy Points 2127

(mars 2017) Remarque : bien que la question porte spécifiquement sur Drive API v2, les développeurs doivent savoir que l'API Google Drive API équipe publié v3 à la fin de l'année 2015, et dans ce communiqué, insert() a changé de nom pour devenir create() afin de mieux refléter le fonctionnement du fichier. Il n'y a plus non plus de drapeau de conversion -- il suffit de spécifier les types de MIME... imaginez ça !

La documentation a également été améliorée : il y a maintenant un guide spécial consacré aux téléchargements (simple, multipartite et résumable) qui comprend des exemples de code en Java, Python, PHP, C#/.NET, Ruby, JavaScript/Node.js et iOS/Obj-C pour télécharger un fichier et un autre qui importe un fichier CSV en tant que feuille Google.

Juste pour montrer à quel point c'est simple, voici une solution Python alternative (à l'exemple dans les documents) pour les fichiers courts ("simple upload") où vous n'avez pas besoin de l'option apiclient.http.MediaFileUpload classe. Cet extrait suppose que votre code d'authentification fonctionne à l'endroit où se trouve le point de terminaison de votre service. DRIVE avec une portée d'authentification minimale de 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']))

7voto

Talos Points 96

La réponse de Claudio Cherubino est correcte - vous devez ajouter le paramètre manuellement. Puisque vous avez posé votre question en Python, voici un exemple concret :

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'

7voto

Cad Points 334

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());

0voto

pinoyyid Points 4390

La meilleure façon de commencer est d'utiliser le formulaire web à l'adresse suivante https://developers.google.com/drive/v2/reference/files/insert#try-it

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X