Skip to content

Commit eda8de4

Browse files
committed
create spreadsheet functionality from CLI added
1 parent b76b2c2 commit eda8de4

File tree

4 files changed

+51
-13
lines changed

4 files changed

+51
-13
lines changed

google_objects/auth.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ def service_account_creds(creds_path, delegated_user=None, scope=None):
2222
if not creds_path:
2323
creds_path = os.getenv('GOOGLE_SERVICE_ACCOUNT_CREDENTIALS')
2424
if not delegated_user:
25-
user = os.getenv('GOOGLE_DELEGATED_USER')
25+
delegated_user = os.getenv('GOOGLE_DELEGATED_USER')
2626

2727
creds_path = os.path.expanduser(creds_path)
2828
creds = ServiceAccountCredentials.from_json_keyfile_name(
2929
creds_path, _gen_scopes(scope)
3030
)
3131

3232
# create delegated if user exists
33-
if user:
34-
creds = creds.create_delegated(user)
33+
if delegated_user:
34+
creds = creds.create_delegated(delegated_user)
3535

3636
return creds.authorize(httplib2.Http())

google_objects/cli.py

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import os
44
import sys
5+
import json
56
import logging
67

78
import fire
9+
import pandas as pd
810

911
from google_objects.sheets import SheetsClient
1012

@@ -16,34 +18,64 @@ class SheetsCLI(object):
1618
"""Command line tool for fetching tabular data
1719
and redirecting it to STDOUT."""
1820

19-
def __init__(self, spreadsheet, key=None, service_account=False):
21+
def __init__(self, key=None, service_account=False, user=None):
2022
"""Authenticate the Google API Client and loads the Specified Spreadsheet"""
2123

2224
try:
2325
if service_account:
24-
self.client = SheetsClient.from_service_account()
26+
self.client = SheetsClient.from_service_account(user=user)
2527
else:
2628
self.client = SheetsClient.from_api_key(key)
2729

28-
self.spreadsheet = self.client.get_spreadsheet(spreadsheet)
29-
3030
except ValueError as exception:
3131
sys.stderr.write(str(exception))
3232
sys.exit(1)
3333

34-
def get(self, sheet='Sheet1'):
34+
def get_spreadsheet(self, spreadsheet_id):
3535
"""Return a Google Sheet as a list of dictionaries in the 'records' attribute
3636
of the outputted json"""
3737

3838
try:
39-
sheet = self.spreadsheet.get_sheet_by_name(sheet)
40-
dataframe = sheet.dataframe()
39+
spreadsheet = self.client.get_spreadsheet(spreadsheet_id)
40+
output = {
41+
'title': spreadsheet.title,
42+
'id': spreadsheet.id,
43+
'sheets': [{'title': sheet.title,
44+
'records': sheet.dataframe().to_dict(
45+
orient='records')}
46+
for sheet in spreadsheet.sheets()]
47+
}
4148

4249
except ValueError as exception:
4350
sys.stderr.write(str(exception))
4451
sys.exit(2)
4552

46-
sys.stdout.write(dataframe.to_json(orient='records'))
53+
# sys.stdout.write(dataframe.to_json(orient='records'))
54+
sys.stdout.write(json.dumps(output))
55+
56+
def create_spreadsheet(self, file_path=None):
57+
"""Create a new Google Spreadsheet.
58+
59+
:file_name: JSON File name
60+
:returns: URL of newly created Google Sheet.
61+
62+
"""
63+
if file_path:
64+
with open(file_path, 'r') as f:
65+
json_data = f.read()
66+
else:
67+
json_data = sys.stdin.read()
68+
69+
input_data = json.loads(json_data)
70+
if 'records' in input_data:
71+
input_data = input_data['records']
72+
73+
df = pd.DataFrame(input_data)
74+
try:
75+
spreadsheet = self.client.create_spreadsheet_from_dataframe(df)
76+
sys.stdout.write(spreadsheet.url)
77+
except Exception as e:
78+
sys.stdout.write(e)
4779

4880

4981
def main():

google_objects/core.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
ENV_API_KEY = 'GOOGLE_API_KEY'
1414
ENV_SERVICE_ACCOUNT = 'GOOGLE_SERVICE_ACCOUNT_PATH'
15+
ENV_DELEGATED_USER = 'GOOGLE_DELEGATED_USER'
1516

1617

1718
class GoogleClient(object):
@@ -46,6 +47,7 @@ def from_service_account(cls, creds_path=None, user=None):
4647
"""Authorizes a client from an Service Account Credential File."""
4748

4849
creds_path = creds_path or os.getenv(ENV_SERVICE_ACCOUNT)
50+
user = user or os.getenv(ENV_DELEGATED_USER)
4951

5052
if not creds_path:
5153
raise ValueError('Service Account path not provided.')

google_objects/sheets.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def create_spreadsheet_from_dataframes(self, *frames, **options):
100100
"""Creates a new Google Spreadsheet with a provided pandas.DataFrame
101101
objects and options.
102102
103-
:frame: pandas.DataFrame
103+
:frame: <pandas.DataFrame>
104104
:**options: Google Spreadsheet initialization options
105105
:returns: Spreadsheet
106106
@@ -201,6 +201,10 @@ def id(self):
201201
def title(self):
202202
return self.data['properties']['title']
203203

204+
@property
205+
def url(self):
206+
return 'https://docs.google.com/spreadsheets/d/{}'.format(self.id)
207+
204208
@title.setter
205209
def title(self, value):
206210
self.data['properties']['title'] = value
@@ -230,7 +234,7 @@ def yield_sheets(self):
230234
for sheet in self.data['sheets']:
231235
yield Sheet.from_existing(sheet, self)
232236

233-
def yield_values(self, arg1):
237+
def yield_values(self):
234238
for sheet in self.yield_sheets():
235239
yield sheet.values()
236240

0 commit comments

Comments
 (0)