6

(Para mayor claridad, este post se refiere a la diferencia entre el Google Documents List API y Google Drive API en Google App Engine con Python)documentos Edición de Google con API unidad

Con la lista Documentos API [ahora obsoleta] yo era capaz de editar documentos de Google exportando como HTML, modificando el HTML y luego volviendo a cargarlo, ya sea como un nuevo documento o como una modificación del original. Esto fue útil para cosas como la generación de documentos PDF a partir de una plantilla. He intentado replicar esta funcionalidad con la nueva Drive API (V2), pero parece que no puedo.

han llegado con esto ...

http = # authenticated http client 
drive_service = build('drive', 'v2', http=http) 

# get the file ... 
file = drive_service.files().get(fileId=FILE_ID).execute() 

# download the html ... 
url = file['exportLinks']['text/html'] 
response, content = http.request(url) 

# edit html 
html = content.replace('foo', 'bar') 

# create new file with modified html ... 
body = {'title':'Modified Doc', 
     'description':'Some description', 
     'mimeType':'text/html'} 
media_body = MediaIoBaseUpload(StringIO.StringIO(html), 'text/html', resumable=False) 
drive_service.files().insert(body=body, media_body=media_body) 

El código anterior carga un archivo HTML como un archivo en Google Drive, en lugar de hacer que el HTML en un documento de Google. De acuerdo, esto tiene sentido. ¿Pero cómo obtenerlo renderizado como un documento de Google Docs, como pude hacer con la API de la lista de documentos?

Otra cosa, si configuro resumable = True, arroja el siguiente error en App Engine: '_StreamSlice' no tiene len(). ¿No pudiste averiguar cómo obtener resumable = Verdadero para trabajar?

Y una última cosa: el sample code in the docs utiliza un objeto MediaInMemoryUpload, sin embargo, if you look at the source ahora está en desuso, a favor de MediaIoBaseUpload. ¿Debería actualizarse el código de muestra?

Respuesta

7

sospecho que el problema es que el valor predeterminado para la conversión ha cambiado de verdadero a falso. Debe establecer explícitamente convert = true en la carga. Ver https://developers.google.com/drive/v2/reference/files/insert

+0

Totalmente a la derecha. No puedo creer que me haya perdido eso. ¡Gracias! –

+0

Pero, ¿dónde estableces convert = true? Ninguno de los ejemplos describe dónde se establecen los parámetros. El parcheo de service.files(). Insert(). Execute.uri arroja errores, y ni los archivos ni las inserciones parecen tener el argumento correcto. La versión ruby ​​del apiclient toma un argumento de parámetros para .execute(). – Sethish

+2

Pasar como un parámetro al método de inserción. Me gusta this drive_service.files(). Insert (body = body, media_body = media_body, convert = True) .execute(). Está documentado aquí https://developers.google.com/drive/v2/reference/files/insert –

Cuestiones relacionadas