web-dev-qa-db-fra.com

Utilisation de l'API Google Drive pour télécharger une feuille de calcul au format CSV

Je suis désolé si c'est une question évidente, je suis encore assez nouveau pour l'API. J'utilise la bibliothèque api du lecteur python, et j'essaie de télécharger une feuille de calcul google en tant que csv.
Lorsque j'ai utilisé files.get, il a craché un fichier sans downloadUrl et sans clé 'text/csv' dans le champ des liens d'exportation.
Si ce n'est pas possible, je peux trouver une solution de contournement, mais j'espère que c'est le cas, car il est possible de le faire manuellement (fichier-> download_as-> csv)

Dois-je utiliser l'API de la liste des documents Google?

merci, Matt

46
user1546842

Mise à jour: J'ai publié ne autre réponse qui fonctionne avec l'API Spreadsheets v4.

Ancienne réponse:

La réponse d'Alain est correcte, mais vous devez également définir le gid=parameter pour spécifier la feuille de calcul à exporter.

Par exemple, si votre lien d'exportation 'application/pdf' est comme ceci:

docs.google.com/feeds/download/spreadsheets/Export?key=<FILE_ID>&exportFormat=pdf

Vous pouvez simplement le changer pour télécharger la première feuille de calcul:

docs.google.com/feeds/download/spreadsheets/Export?key<FILE_ID>&exportFormat=csv&gid=0

Il y a un petit problème, car il n'y a pas de moyen fiable d'obtenir le gid pour une feuille de calcul donnée via l'API et ce ne sont pas des index basés sur zéro. Si vous supprimez une feuille de calcul, ce gid n'est pas réutilisé. Vous pouvez voir le gid dans l'URL dans votre navigateur, donc si les informations de votre feuille de calcul sont constantes, vous pouvez simplement les obtenir à partir de là. Voir http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=181 et http: // code. google.com/a/google.com/p/apps-api-issues/issues/detail?id=324 pour plus d'informations sur ce problème.

45
Peter Haight

La collection exportLinks n'expose pas le format CSV car cela n'exportera que la première feuille de calcul d'une feuille de calcul. Si la récupération de la première feuille de calcul au format CSV est le comportement que vous recherchez, vous pouvez créer le lien manuellement et définir le ?exportFormat= paramètre de requête à ?exportFormat=csv.

10
Alain

Voici une mise en œuvre de la suggestion d'Alain qui fonctionne pour moi:

downloadUrl = entry.get('exportLinks')['application/pdf']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"

resp, content = drive_service._http.request(downloadUrl)
7
ryanarn

(Jul 2016) Cette question est formulée correctement, mais est essentiellement un doublon d'un autre thread ( Téléchargez une feuille de calcul à partir de Google Docs en utilisant Python) ). Alors que certaines des réponses précédentes à ceci la question ci-dessous peut toujours fonctionner (bien que les réponses soient en JS/Apps Script pas en Python), une nouvelle Drive API version (v3) et nouveau Sheets API version (v4) les rendent légèrement obsolètes bien que les versions précédentes des deux ne soient pas encore obsolètes. L'accès moderne à l'API Google se fait à l'aide de clés API ou d'une autorisation OAuth2, principalement avec Google APIs Client Libraries , y compris celui pour Python .

Pour effectuer la tâche demandée dans/par l'OP, vous pouvez peut-être rechercher des feuilles spécifiques à télécharger, puis effectuer les exportations réelles avec l'API Drive. Comme il s'agit probablement d'une opération courante, j'ai écrit un blogpost partageant un extrait de code qui le fait pour vous. Si vous souhaitez poursuivre l'exportation, j'ai une autre paire de posts avec une vidéo qui explique comment télécharger des fichiers et télécharger des fichiers depuis Google Drive.

Notez qu'il existe également un API Google Sheets , mais c'est principalement pour les opérations orientées feuille de calcul, c'est-à-dire, l'insertion de données, la lecture de lignes de feuille de calcul, le formatage des cellules, la création de graphiques, l'ajout de tableaux croisés dynamiques, etc., pas le fichier basées sur des requêtes telles que l'exportation où l'API Drive est la bonne à utiliser.

4
wescpy

Comme beaucoup d'autres l'ont souligné, ma réponse originale est quelque peu dépassée. Voici donc ma réponse mise à jour pour la v4 de l'API Google Spreadsheets. Il existe maintenant un moyen d'obtenir les gids, mais nous ne pouvons pas utiliser l'API the drive files.export car il exporte uniquement la première feuille de calcul dans la feuille de calcul (même si vous spécifiez le gid).

Pour exporter toutes les feuilles de calcul en tant que fichiers CSV, vous devez obtenir les gids des feuilles de calcul que vous souhaitez exporter à l'aide de API spreadsheets.get . Cet appel API renvoie un tas d'informations sur la feuille de calcul, y compris chacune des feuilles de calcul. Vous pouvez obtenir le gid à partir de la propriété properties.sheetId pour chaque feuille de calcul.

Une fois que vous avez cela, vous pouvez simplement créer la même URL que les feuilles utilise lorsque vous sélectionnez Fichier-> Télécharger en tant que-> CSV. Vous pouvez prendre la valeur data.spreadsheetUrl de spreadsheets.get et remplacer /edit avec /export, puis ajoutez le gid comme paramètre. Vous devrez également inclure Authorization Bearer <auth token> dans l'en-tête HTTP de la demande.

Voici un script python basé sur leur exemple de démarrage rapide qui télécharge toutes les feuilles de la feuille de calcul avec un ID spécifié. Vous devez remplacer <spreadsheet id> avec l'ID d'une feuille de calcul à laquelle vous avez accès:

import apiclient.discovery
import httplib2
import oauth2client
import re
import requests
import shutil
import urllib.parse

SCOPES = 'https://www.googleapis.com/auth/drive.readonly'
SPREADSHEET_ID = '<spreadsheet id>'

store = oauth2client.file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
  flow = oauth2client.client.flow_from_clientsecrets('client_secret.json', SCOPES)
  creds = oauth2client.tools.run_flow(flow, store)

service = apiclient.discovery.build('sheets', 'v4', http=creds.authorize(httplib2.Http()))

result = service.spreadsheets().get(spreadsheetId = SPREADSHEET_ID).execute()
spreadsheetUrl = result['spreadsheetUrl']
exportUrl = re.sub("\/edit$", '/export', spreadsheetUrl)
headers = {
  'Authorization': 'Bearer ' + creds.access_token,
}
for sheet in result['sheets']:
  params = {
    'format': 'csv',
    'gid': sheet['properties']['sheetId'],
  } 
  queryParams = urllib.parse.urlencode(params)
  url = exportUrl + '?' + queryParams
  response = requests.get(url, headers = headers)
  filePath = '/tmp/foo-%s.csv' % (+ params['gid'])
  with open(filePath, 'wb') as csvFile:
    csvFile.write(response.content)
4
Peter Haight

Je ne sais pas si c'est ce dont l'OP avait besoin, mais dans la nouvelle version de Google Sheets, il semble qu'il soit devenu un peu difficile de lier à chaud une version csv de votre feuille de calcul.

Si vous êtes intéressé par un script d'applications Google qui exportera toutes les feuilles d'une feuille de calcul vers des fichiers csv individuels (au lieu de les télécharger individuellement), voici:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var csvMenuEntries = [{name: "export as csv files", functionName: "saveAsCSV"}];
  ss.addMenu("csv", csvMenuEntries);
};

function saveAsCSV() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  // create a folder from the name of the spreadsheet
  var folder = DocsList.createFolder(ss.getName().toLowerCase().replace(/ /g,'_') + '_csv_' + new Date().getTime());
  for (var i = 0 ; i < sheets.length ; i++) {
    var sheet = sheets[i];
    // append ".csv" extension to the sheet name
    fileName = sheet.getName() + ".csv";
    // convert all available sheet data to csv format
    var csvFile = convertRangeToCsvFile_(fileName, sheet);
    // create a file in the Docs List with the given name and the csv data
    folder.createFile(fileName, csvFile);
  }
  Browser.msgBox('Files are waiting in a folder named ' + folder.getName());
}

function convertRangeToCsvFile_(csvFileName, sheet) {
  // get available data range in the spreadsheet
  var activeRange = sheet.getDataRange();
  try {
    var data = activeRange.getValues();
    var csvFile = undefined;

    // loop through the data in the range and build a string with the csv data
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";
          }
        }

        // join each row's columns
        // add a carriage return to end of each row, except for the last one
        if (row < data.length-1) {
          csv += data[row].join(",") + "\r\n";
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

Remarque : ce script utilise la méthode DocsList.createFile (), qui n'est disponible que pour les comptes Google Apps.

Si vous avez besoin d'explications supplémentaires, allez ici: http://drzon.net/export-all-google-sheets-to-csv/

4
Michael

Remarque: en avril 2015, DocsList était amorti et a été remplacé par DriveApp. De nombreuses méthodes DriveApp sont identiques à DocsList. Ainsi, dans de nombreux cas, vous pouvez simplement remplacer DocsList par DriveApp. Remplacez donc DocsList.createFile () par DriveApp.createFile ()

Comment mettre à jour DocsList vers DriveApp dans mon code

3
user3000439