Usar la API de Google Drive para descargar una hoja de cálculo en formato csv

Lo siento si esta es una pregunta obvia, todavía soy bastante nuevo en la API. Estoy usando la biblioteca de api de la unidad de Python e bash descargar una hoja de cálculo de google como un csv.
Cuando utilicé files.get, escupió un archivo sin downloadUrl y sin la tecla ‘text / csv’ en el campo de enlaces de exportación.
Si no es posible, puedo encontrar una solución, pero espero que lo sea, ya que es posible hacerlo manualmente (file-> download_as-> csv)

¿Debo usar la API api de la lista de documentos?

gracias, Matt

Actualización: publiqué otra respuesta que funciona con la API de hojas de cálculo v4.

Vieja respuesta:

La respuesta de Alain es correcta, pero también debe establecer el gid=parameter para especificar qué hoja de trabajo exportar.

Por ejemplo, si su enlace de exportación ‘application / pdf’ es así:

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

Simplemente puede cambiarlo para descargar la primera hoja de trabajo:

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

Existe un pequeño problema, aunque no existe una forma confiable de obtener el GID para una hoja de trabajo dada a través de la API y no son índices basados ​​en cero. Si elimina una hoja de trabajo, ese gid no se vuelve a utilizar. Sin embargo, puede ver el gid en la URL de su navegador, de modo que si la información de su hoja de cálculo es constante, puede obtenerla desde allí. Consulte http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=1813 y http://code.google.com/a/google.com/p. / apps-api-issues / issues / detail? id = 3240 para obtener más información sobre ese problema.

La colección exportLinks no expone el formato CSV, ya que solo exportará la primera hoja de cálculo de una hoja de cálculo. Si recuperar la primera hoja de trabajo como CSV es el comportamiento que está buscando, puede construir el enlace manualmente y establecer el parámetro de ?exportFormat=csv en ?exportFormat=csv .

Aquí hay una implementación de la sugerencia de Alain que me funciona:

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

No estoy seguro de si es lo que necesitaba el PO, pero en la nueva versión de Hojas de cálculo de Google parece que se volvió un poco difícil vincular una versión CSV de su hoja de cálculo.

En caso de que esté interesado en un script de aplicaciones de Google que exportará todas las hojas en una hoja de cálculo a archivos csv individuales (en lugar de descargar cada uno individualmente), aquí tiene:

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

Nota : Este script utiliza el método DocsList.createFile (), que solo está disponible para las cuentas de Google Apps.

Si necesita más explicaciones, vaya aquí: http://drzon.net/export-all-google-sheets-to-csv/

Tenga en cuenta que, a partir de abril de 2015, DocsList se depreció y se reemplazó por DriveApp. Muchos de los métodos de DriveApp son idénticos a DocsList. Por lo tanto, en muchos casos, simplemente puede reemplazar DocsList con DriveApp. Reemplace DocsList.createFile () con DriveApp.createFile ()

Cómo actualizar DocsList a DriveApp en mi código

(Jul 2016) Esta pregunta está redactada correctamente, pero en esencia es un duplicado de otro hilo ( Descargue una hoja de cálculo de Google Docs usando Python ). Si bien algunas de las respuestas anteriores a esta pregunta aún pueden funcionar (aunque las respuestas se encuentran en JS / Apps Script no en Python), una nueva versión de Drive API (v3) y una nueva versión de Sheets API (v4) las hacen obsoletas aunque las versiones anteriores de ambos no han sido desaprobados (todavía). El acceso moderno a la API de Google se produce mediante el uso de claves API o la autorización OAuth2, principalmente con las bibliotecas de cliente API de Google , incluida la de Python .

Para realizar la tarea solicitada en / por el OP, quizás desee consultar Hojas de cálculo específicas para descargar y luego realizar las exportaciones reales con Drive API. Como esta es una operación común, escribí un blog que comparte un fragmento de código que hace esto por usted. Si desea seguir exportando, tengo otro par de publicaciones junto con un video que describe cómo cargar y descargar archivos de Google Drive.

Tenga en cuenta que también hay una API de Hojas de cálculo de Google , pero principalmente para operaciones orientadas a hojas de cálculo, es decir, insertar datos, leer filas de hojas de cálculo, formatear celdas, crear gráficos, agregar tablas dinámicas, etc., no solicitudes basadas en archivos como exportar donde Drive API es el correcto para usar.

Como muchas otras personas han señalado, mi respuesta original está un poco desactualizada. Así que aquí está mi respuesta actualizada para v4 de la API de Google Spreadsheets. Ahora hay una forma de obtener los gids, pero no podemos usar la API drive files.export porque solo exporta la primera hoja de trabajo en la hoja de cálculo (incluso si especifica el gid).

Para exportar todas las hojas de cálculo como archivos CSV, necesita obtener los gids de las hojas de trabajo que desea exportar utilizando la API spreadsheets.get . Esa llamada API devuelve un montón de información sobre la hoja de cálculo que incluye cada una de las hojas de trabajo. Puede obtener el gid de la propiedad properties.sheetId para cada hoja de trabajo.

Una vez que tenga eso, puede simplemente comstackr la misma URL que usa Sheets cuando selecciona Archivo-> Descargar como-> CSV. Puede tomar el valor de data.spreadsheetUrl de spreadsheets.get y reemplazar /edit con /export y luego agregar el gid como parámetro. También deberá incluir Authorization Bearer en el encabezado HTTP de la solicitud.

Aquí hay un script de python basado en su ejemplo de inicio rápido que descarga todas las hojas de la hoja de cálculo con un ID especificado. Necesita reemplazar con la ID de una hoja de cálculo a la que tiene acceso:

 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 = '' 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)