Search code examples
pythongoogle-sheetsgoogle-drive-apigdatagspread

Using OAuth and gdata to copy google spreadsheet


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?


Solution

  • 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