Skip to content

Commit fbac93c

Browse files
committed
pandas to sheets functionality improved
1 parent b19d1b9 commit fbac93c

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

google_objects/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
import os
34
import logging
45

56
from apiclient import discovery
@@ -44,6 +45,7 @@ def from_service_account(cls, service, version,
4445
creds_path=None, user=None, scope=[]):
4546
"""Authorizes a client from an Service Account Credential File."""
4647

48+
creds_path = creds_path or os.getenv('GOOGLE_SERVICE_ACCOUNT')
4749
if not creds_path:
4850
err = 'Please provide an a path to your service credentals.'
4951
raise ValueError(err)

google_objects/sheets/core.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,29 @@
88
"""
99

1010
import logging
11+
from datetime import datetime
1112

1213
from .. import GoogleClient, GoogleObject
1314

1415
log = logging.getLogger(__name__)
1516

1617

17-
# TODO:
18-
# i/ ensure all cell data reflects table row insertion and deletion
19-
# ii/ page title and descriptor need to be found and initialized
20-
# iii/ change .from_existing to .from_raw
21-
22-
2318
def _value_to_cell(val):
24-
if val.isdigit():
19+
if str(val).isdigit():
2520
try:
2621
return {'userEnteredValue': {'numberValue': float(val)}}
2722
except:
2823
return {'userEnteredValue': {'numberValue': int(val)}}
29-
return {'userEnteredValue': {'stringValue': val}}
24+
25+
return {'userEnteredValue': {'stringValue': str(val)}}
3026

3127

3228
def _cells_to_row(cells):
3329
return [_value_to_cell(cell) for cell in cells]
3430

3531

3632
def _format_sheet(sheet):
37-
title = sheet.get('title', 'NEW SHEET')
33+
title = sheet.get('title')
3834
values = sheet.get('values', [])
3935
return {
4036
'properties': {
@@ -65,12 +61,13 @@ class SheetsClient(GoogleClient):
6561

6662
"""Creates a Google Sheets Resource"""
6763

64+
service = 'sheets'
65+
version = 'v4'
66+
6867
@classmethod
6968
def from_service_account(cls, **kwargs):
7069
kwargs['scope'] = ['spreadsheets']
71-
kwargs['service'] = 'sheets'
72-
kwargs['version'] = 'v4'
73-
return super().from_service_account(**kwargs)
70+
return super().from_service_account(cls.service, cls.version, **kwargs)
7471

7572
def get_spreadsheet(self, id):
7673
"""Returns a Spreadsheet Object
@@ -94,7 +91,7 @@ def create_spreadsheet_from_dataframe(self, frame, **options):
9491
:returns: Spreadsheet
9592
9693
"""
97-
self.create_spreadsheet_from_dataframes([frame], **options)
94+
return self.create_spreadsheet_from_dataframes(frame, **options)
9895

9996
def create_spreadsheet_from_dataframes(self, *frames, **options):
10097
"""Creates a new Google Spreadsheet with a provided pandas.DataFrame
@@ -107,19 +104,31 @@ def create_spreadsheet_from_dataframes(self, *frames, **options):
107104
"""
108105
if not frames:
109106
raise ValueError
107+
108+
time = datetime.now().strftime("%I:%M%p on %B %d, %Y")
109+
title = options.get('Title', 'Generated at {}'.format(time))
110+
sheets = []
110111

111-
formatted_frames = [frm.values.tolist() for frm in frames]
112-
return self.create_spreadsheet(self, formatted_frames, **options)
112+
for frame in frames:
113+
# insert header as first row
114+
head, data = frame.columns, frame.values.tolist()
115+
data.insert(0, head)
116+
117+
# format as google sheet dict
118+
sheet = _format_sheet({'title': title, 'values': data})
119+
sheets.append(sheet)
120+
121+
return self.create_spreadsheet(sheets, title=title, **options)
113122

114123
def create_spreadsheet(self, sheets=[], **kwargs):
115124
data = self.resource.spreadsheets().create(
116125
body={
117126
'properties': kwargs,
118-
'sheets': [_format_sheet(s) for s in sheets]
127+
'sheets': sheets
119128
}
120129
).execute()
121130

122-
return Spreadsheet.from_existing(data, self)
131+
return Spreadsheet(self, **data)
123132

124133
def get_values(self, spreadsheet_id, range_name):
125134
"""Initialize a new block and return it"""
@@ -172,7 +181,7 @@ class Spreadsheet(GoogleObject):
172181

173182
"""Represents a Google API Spreadsheet object"""
174183

175-
def __init__(self, client=None, **kwargs):
184+
def __init__(self, client, **kwargs):
176185
"""Creates a new Spreadsheet Object"""
177186

178187
self.client = client

0 commit comments

Comments
 (0)