6

(Dla jasności, ten post odnosi się do różnicy pomiędzy Google Documents List API i Google Drive API na Google App Engine z Pythona)Edycja Google Docs z napędem API

Z [obecnie przestarzałe] liście Dokumenty API mogłem edytować Google Dokumenty eksportując jako HTML, modyfikując HTML, a następnie przesyłając ponownie jako nowy dokument lub jako modyfikację oryginału. Przydaje się to na przykład do generowania dokumentów PDF z szablonu. Próbowałem zreplikować tę funkcjonalność nowym interfejsem Drive API (V2), jednak wydaje się, że nie można tego zrobić.

mają pochodzić z tego ...

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) 

Powyższy kod ładuje plik HTML w postaci pliku na Dysk Google, a następnie renderowania HTML do dokumentu Google. Wystarczająco uczciwe, to ma sens. Ale w jaki sposób mogę go renderować jako dokument Google, tak jak mogłem to zrobić za pomocą interfejsu API listy dokumentów?

Jeszcze jedno - jeśli ustawię resumable = True, generuje następujący błąd w App Engine - "_StreamSlice" nie ma len(). Nie można wymyślić, jak uzyskać wznowienie = Prawdziwe do pracy?

I ostatnia rzecz - sample code in the docs używa obiektu MediaInMemoryUpload, jednak jest on już nieaktualny, na rzecz MediaIoBaseUpload. Czy powinien zostać zaktualizowany przykładowy kod ?!

Odpowiedz

7

Podejrzewam, że problem polega na tym, że wartość domyślna konwersji została zmieniona z true na false. Musisz jawnie ustawić convert = true podczas przesyłania. Zobacz https://developers.google.com/drive/v2/reference/files/insert

+0

Całkowicie rację. Nie mogę uwierzyć, że to przegapiłem. Dzięki! –

+0

Ale gdzie ustawić convert = true? Żaden z przykładów nie opisuje miejsca ustawienia parametrów. Patching service.files(). Insert(). Execute.uri generuje błędy, a pliki i pliki nie wydają się przyjmować właściwego argumentu. Ruby wersja apiclient pobiera argument parametru do .execute(). – Sethish

+2

Przekaż jako parametr do metody wstawiania. Podobnie jak to drive_service.files(). Insert (body = body, media_body = media_body, convert = True) .execute(). Jest to udokumentowane tutaj https://developers.google.com/drive/v2/reference/files/insert –