6

(Pour plus de clarté, ce poste a trait à la différence entre Google Documents List API et Google Drive API sur Google App Engine avec Python)Edition Google docs avec l'API de lecteur

Avec l'API de liste de documents [maintenant dépréciée] J'ai pu éditer des documents Google en exportant en HTML, en modifiant le code HTML, puis en le réimprimant, soit en tant que nouveau document, soit en tant que modification de l'original. Cela était utile pour des choses comme la génération de documents PDF à partir d'un modèle. J'ai essayé de reproduire cette fonctionnalité avec la nouvelle API de lecteur (V2), mais semble incapable de le faire.

suis venu avec cette ...

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) 

Le code ci-dessus télécharge un fichier html sous forme de fichier dans Google Drive, plutôt que de rendre le code HTML dans un document Google. Assez juste, cela a du sens. Mais comment l'obtenir en tant que document Google, comme j'ai pu le faire avec l'API Documents List?

Une autre chose - si j'ai défini resumable = True, il génère l'erreur suivante sur App Engine - '_StreamSlice' n'a pas de len(). Impossible de trouver comment obtenir resumable = True pour fonctionner?

Et une dernière chose - le sample code in the docs utilise un objet MediaInMemoryUpload, mais if you look at the source il est maintenant obsolète, en faveur de MediaIoBaseUpload. L'exemple de code devrait-il être mis à jour ?!

Répondre

7

Je soupçonne que le problème est que la valeur par défaut pour la conversion a changé de vrai à faux. Vous devez définir explicitement convert = true sur le téléchargement. Voir https://developers.google.com/drive/v2/reference/files/insert

+0

Entièrement à droite. Je ne peux pas croire que j'ai raté ça. Merci! –

+0

Mais où placez-vous convert = true? Aucun des exemples ne décrit où les paramètres sont définis. Correctif de service.files(). Insert(). Execute.uri renvoie des erreurs, et ni les fichiers ni l'insert ne semblent prendre le bon argument. La version ruby ​​d'apiclient prend un argument paramètres pour .execute(). – Sethish

+2

Passer en paramètre à la méthode d'insertion. Comme ceci drive_service.files(). Insert (body = body, media_body = media_body, convert = Vrai) .execute(). Il est documenté ici https://developers.google.com/drive/v2/reference/files/insert –