This Python script downloads a Google Sheets document from Google Drive as an Excel file.

The code is mostly from the official Google API site; the changes I made are that Credential path is set to the directory where the script is excuted and that Scope is set from metadata.readonly to readonly for reading the content of files we want to download. (For more details on Scope, you can refer to the official document here)

Tested environment: Ubuntu 16.04, Python 3.5.2

Usage

To get a credential for this script, finish Step 1 following instructions here

Change the value of FILE_ID at line 27 to that of the actual file you want to download.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #! /usr/bin/env python3 from __future__ import print_function import httplib2 import os from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage import io from apiclient.http import MediaIoBaseDownload try : import argparse flags = argparse . ArgumentParser ( parents = [ tools . argparser ]) . parse_args () except ImportError : flags = None CREDENTIAL_DIR = './credentials' CREDENTIAL_FILENAME = 'drive-python-quickstart.json' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Google Drive File Export Example' SCOPES = 'https://www.googleapis.com/auth/drive.readonly' FILE_ID = 'your file id' EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' EXPORTED_FILE_NAME = 'exported_file.xlsx' def get_credentials (): credential_dir = CREDENTIAL_DIR if not os . path . exists ( credential_dir ): os . makedirs ( credential_dir ) credential_path = os . path . join ( credential_dir , CREDENTIAL_FILENAME ) store = Storage ( credential_path ) credentials = store . get () if not credentials or credentials . invalid : flow = client . flow_from_clientsecrets ( CLIENT_SECRET_FILE , SCOPES ) flow . user_agent = APPLICATION_NAME if flags : credentials = tools . run_flow ( flow , store , flags ) else : credentials = tools . run ( flow , store ) print ( 'Storing credentials to ' + credential_path ) return credentials def main (): credentials = get_credentials () http = credentials . authorize ( httplib2 . Http ()) service = discovery . build ( 'drive' , 'v3' , http = http ) request = service . files () . export_media ( fileId = FILE_ID , mimeType = EXCEL ) fh = io . FileIO ( EXPORTED_FILE_NAME , 'wb' ) downloader = MediaIoBaseDownload ( fh , request ) done = False while done is False : status , done = downloader . next_chunk () print ( 'Download % d %% .' % int ( status . progress () * 100 )) if __name__ == '__main__' : main ()

If you run this script on a remote server via terminal, you should add --noauth_local_webserver option.

$ ./export_example.py --noauth_local_webserver

The script attempts to open an authorization URL to access to your Google Drive if the script has failed to find a valid credential. If you are running the script on a remote server, Lynx, a text web browser is executed to open the URL but Google Drive doesn’t accept a request from text browsers. This option provides a URL to proceed an authorization for you instead opening a text browser on the server, so you can just open your web browser and enter the URL.

After granting the permission, an authorization code will appear. Copy the code and paste it to the terminal.

Finished authorization, it starts downloading.