8
8
"""
9
9
10
10
import logging
11
+ from datetime import datetime
11
12
12
13
from .. import GoogleClient , GoogleObject
13
14
14
15
log = logging .getLogger (__name__ )
15
16
16
17
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
-
23
18
def _value_to_cell (val ):
24
- if val .isdigit ():
19
+ if str ( val ) .isdigit ():
25
20
try :
26
21
return {'userEnteredValue' : {'numberValue' : float (val )}}
27
22
except :
28
23
return {'userEnteredValue' : {'numberValue' : int (val )}}
29
- return {'userEnteredValue' : {'stringValue' : val }}
24
+
25
+ return {'userEnteredValue' : {'stringValue' : str (val )}}
30
26
31
27
32
28
def _cells_to_row (cells ):
33
29
return [_value_to_cell (cell ) for cell in cells ]
34
30
35
31
36
32
def _format_sheet (sheet ):
37
- title = sheet .get ('title' , 'NEW SHEET' )
33
+ title = sheet .get ('title' )
38
34
values = sheet .get ('values' , [])
39
35
return {
40
36
'properties' : {
@@ -65,12 +61,13 @@ class SheetsClient(GoogleClient):
65
61
66
62
"""Creates a Google Sheets Resource"""
67
63
64
+ service = 'sheets'
65
+ version = 'v4'
66
+
68
67
@classmethod
69
68
def from_service_account (cls , ** kwargs ):
70
69
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 )
74
71
75
72
def get_spreadsheet (self , id ):
76
73
"""Returns a Spreadsheet Object
@@ -94,7 +91,7 @@ def create_spreadsheet_from_dataframe(self, frame, **options):
94
91
:returns: Spreadsheet
95
92
96
93
"""
97
- self .create_spreadsheet_from_dataframes ([ frame ] , ** options )
94
+ return self .create_spreadsheet_from_dataframes (frame , ** options )
98
95
99
96
def create_spreadsheet_from_dataframes (self , * frames , ** options ):
100
97
"""Creates a new Google Spreadsheet with a provided pandas.DataFrame
@@ -107,19 +104,31 @@ def create_spreadsheet_from_dataframes(self, *frames, **options):
107
104
"""
108
105
if not frames :
109
106
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 = []
110
111
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 )
113
122
114
123
def create_spreadsheet (self , sheets = [], ** kwargs ):
115
124
data = self .resource .spreadsheets ().create (
116
125
body = {
117
126
'properties' : kwargs ,
118
- 'sheets' : [ _format_sheet ( s ) for s in sheets ]
127
+ 'sheets' : sheets
119
128
}
120
129
).execute ()
121
130
122
- return Spreadsheet . from_existing ( data , self )
131
+ return Spreadsheet ( self , ** data )
123
132
124
133
def get_values (self , spreadsheet_id , range_name ):
125
134
"""Initialize a new block and return it"""
@@ -172,7 +181,7 @@ class Spreadsheet(GoogleObject):
172
181
173
182
"""Represents a Google API Spreadsheet object"""
174
183
175
- def __init__ (self , client = None , ** kwargs ):
184
+ def __init__ (self , client , ** kwargs ):
176
185
"""Creates a new Spreadsheet Object"""
177
186
178
187
self .client = client
0 commit comments