google drive sdk - vincular - Uso de la API de Google Drive para descargar una hoja de cálculo en formato CSV
only files with binary content can be downloaded use export with google docs files (7)
Aquí hay una implementación de la sugerencia de Alain que funciona para mí:
downloadUrl = entry.get(''exportLinks'')[''application/pdf'']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"
resp, content = drive_service._http.request(downloadUrl)
Lo siento si esta es una pregunta obvia, todavía soy bastante nuevo en la API. Estoy usando la biblioteca de la API de Python Drive y estoy intentando descargar una hoja de cálculo de Google como un CSV.
Cuando usé files.get, escupió un archivo sin downloadUrl y sin la clave ''text / csv'' en el campo de exportación de enlaces.
Si no es posible, puedo encontrar una solución alternativa, pero espero que lo sea, ya que es posible hacerlo manualmente (file-> download_as-> csv)
¿Necesito usar la lista de documentos de Google api?
gracias mate
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 hojas de cálculo de Google. Ahora hay una forma de obtener las gids, pero no podemos usar la API de la unidad files.export porque solo exporta la primera hoja de cálculo en la hoja de cálculo (incluso si especifica el gid).
Para exportar todas las hojas de trabajo como archivos CSV, debe obtener los gids para las hojas de trabajo que desea exportar utilizando la API spreadsheets.get . Esa llamada a la API devuelve un montón de información sobre la hoja de cálculo incluyendo 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 crear la misma URL que las Hojas utilizan cuando selecciona Archivo-> Descargar como-> CSV. Puede tomar el valor data.spreadsheetUrl de spreadsheets.get y reemplazar /edit
con /export
y luego agregar el gid como parámetro. También deberá incluir el Authorization Bearer <auth token>
en el encabezado HTTP en la solicitud.
Aquí hay una secuencia de comandos de Python basada en su ejemplo de inicio rápido que descarga todas las hojas de la hoja de cálculo con una identificación específica. Debe reemplazar <spreadsheet id>
con el ID de una hoja de cálculo a la que tenga 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 = ''<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)
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 el comportamiento que está buscando es recuperar la primera hoja de cálculo como CSV, puede crear el enlace manualmente y configurar el parámetro de consulta ?exportFormat=csv
en ?exportFormat=csv
.
No estoy seguro de si es lo que el OP necesitaba, pero en la nueva versión de Google Sheets parece que se hizo 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 exporte todas las hojas de una hoja de cálculo a archivos csv
individuales (en lugar de descargar cada una 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 : esta secuencia de comandos utiliza el método DocsList.createFile (), que solo está disponible para las cuentas de Google Apps.
Si necesita más información, 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. Entonces reemplace DocsList.createFile () con DriveApp.createFile ()
(Jul 2016) Esta pregunta está redactada correctamente, pero en esencia es un duplicado de otro hilo ( Descarga una hoja de cálculo de Google Docs usando Python ). Si bien algunas de las respuestas anteriores a esta pregunta a continuación pueden seguir funcionando (aunque las respuestas están en JS / Apps Script no Python), una nueva versión de Drive API (v3) y una nueva versión de Sheets API (v4) las hacen ligeramente obsoletas, aunque las versiones anteriores de ambos no han quedado en desuso (todavía). El acceso moderno a la API de Google se produce mediante las claves de la API o la autorización OAuth2, principalmente con las bibliotecas de clientes de la API de Google , incluida la de Python .
Para realizar la tarea solicitada en / por el OP, tal vez debería consultar Hojas específicas para descargar, y luego realizar las exportaciones reales con la API de Drive. Como es probable que se trate de una operación común, escribí una entrada de blogpost comparte un fragmento de código que lo hace por usted. Si desea continuar exportando, tengo otro par de posts 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 Google Sheets , pero es 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 La API de unidad es la correcta de usar.
Actualización: he publicado otra respuesta que funciona con la API de Spreadsheets v4.
Respuesta anterior:
La respuesta de Alain es correcta, pero también debe configurar el gid=parameter
para especificar qué hoja de trabajo desea exportar.
Por ejemplo, si su enlace de exportación ''aplicación / pdf'' es así:
docs.google.com/feeds/download/spreadsheets/Export?key=<FILE_ID>&exportFormat=pdf
Simplemente puede cambiarlo para descargar la primera hoja de trabajo:
docs.google.com/feeds/download/spreadsheets/Export?key<FILE_ID>&exportFormat=csv&gid=0
Existe un pequeño problema, aunque como no hay una forma confiable de obtener el gid para una hoja de trabajo determinada a través de la API y no son índices basados en cero. Si elimina una hoja de trabajo, ese gid no se reutiliza. Sin embargo, puede ver el gid en la URL en su navegador, por lo que si la información de su hoja de trabajo es constante, solo 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.