I had the same issue from yesterday, I only solution that I found was creating a service account and share the provided email with the document and change the code to get data. In my case y need synchronize the sheet data with some folder in a webserver. I leave you the python code if you need it.
import argparse
import sys
import json
import os
from google.oauth2 import service_account
import googleapiclient.discovery
reload(sys)
sys.setdefaultencoding('UTF8')
SCOPES = [
'https://www.googleapis.com/auth/spreadsheets.readonly',
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive'
]
SERVICE_ACCOUNT_FILE = './service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = googleapiclient.discovery.build('sheets', 'v4', credentials=credentials)
def save_file(filename, path, data, header):
absolute_filename = (path + '/' + filename)
if not header:
absolute_filename = path + '/sheets/' + filename
print "Trying " + absolute_filename
directory = os.path.dirname(absolute_filename)
try:
os.stat(directory)
except:
os.makedirs(directory)
with open(absolute_filename, 'w+') as outfile:
json.dump(data, outfile)
def get_data(spreadsheet_id, row_range):
if row_range is None:
request = service.spreadsheets().get(spreadsheetId=spreadsheet_id)
else:
request = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=row_range)
return request.execute()
def download_spreadsheet(args):
spreadsheet_id = args.spreadsheetId
output_path = args.outputPath
head = get_data(spreadsheet_id, None)
save_file(spreadsheet_id, output_path, head, True)
detail = head['sheets']
for sheet in detail:
if 'GRID' == sheet['properties']['sheetType']:
sheet_name = sheet['properties']['title']
row_range = sheet_name + "!A1:AZ10000"
data = get_data(spreadsheet_id, row_range)
save_file(sheet_name, output_path, data, True)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Download google sheet from api as JSON')
parser.add_argument('--spreadsheet-id', metavar='Your SPREADSHEET ID', dest='spreadsheetId', required=True,
help='Your Google\'s SpreadSheet Id')
parser.add_argument('--output-path', metavar='Output directory', dest='outputPath', required=True,
help='Output path')
download_spreadsheet(parser.parse_args())