I am working with gspread to modify existing Google spreadsheets and would like to make a copy of an existing one. Unfortunately, gspread doesn't support this, but it can be done with gdata (as described in this thread):
import gdata.docs.client
docs_client = gdata.docs.client.DocsClient()
docs_client.ClientLogin('ashe@pokemon.com', 'Pikachu', 'Any non empty string')
base_resource = docs_client.GetResourceById(resource_id)
new_resource = docs_client.copy_resource(base_resource, 'pokedex')
I want to achieve this with OAuth rather than a separate e-mail/password combination for the ClientLogin (or any method that can get the desired results; documentation seems nightmarishly poor for the Google APIs). Is there a simple way to do this?
With the new Drive API, I have found a way and hope it can be helpful for others:
import httplib2
from apiclient import errors
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
to_copy = '<id/key_string_from_desired_file_url>'
# Service account e-mail from Google dev console
drive_id = '<my_long_service_account_string>@developer.gserviceaccount.com'
# Get the right permissions
drive_scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
# pem key converted from p12 key generated in dev console
with open(os.path.abspath('my_key.pem'), 'rb') as keyfile:
drive_key = keyfile.read()
credentials = SignedJwtAssertionCredentials(drive_id, drive_key, drive_scope)
http = httplib2.Http()
http = self.credentials.authorize(http)
drive_service = build('drive', 'v2', http=http)
file_copy = {'title': title}
try:
drive_service.files().copy(fileId=to_copy, body = file_copy).execute()
except errors.HttpError, error:
print error