1
+ from google .oauth2 import service_account
2
+ from googleapiclient .discovery import build
3
+ from common import EntryType
4
+ import datetime as dt
5
+
6
+ # Path to the downloaded JSON key file
7
+ SERVICE_ACCOUNT_FILE = 'accounts/service_account.json'
8
+ SCOPES = ['https://www.googleapis.com/auth/spreadsheets' ]
9
+ creds = service_account .Credentials .from_service_account_file (SERVICE_ACCOUNT_FILE , scopes = SCOPES )
10
+ sheets_api = build ('sheets' , 'v4' , credentials = creds )
11
+
12
+ # Dropdown range
13
+ transport_range = ["Dropdown!A3:A9" ]
14
+ others_sub_range = [f"Dropdown!{ chr (i )} 2:{ chr (i )} 9" for i in range (ord ('B' ), ord ('K' ))]
15
+ others_main_range = ["Dropdown!A2:J2" ]
16
+ payment_sub_range = [f"Dropdown!{ chr (i )} 12:{ chr (i )} 19" for i in range (ord ('A' ), ord ('K' ))]
17
+ payment_main_range = ["Dropdown!A12:J12" ]
18
+
19
+ # Get the main dropdown values
20
+ def get_main_dropdown_value (sheet_id , entry_type ):
21
+ range = []
22
+ if entry_type == EntryType .TRANSPORT :
23
+ range = transport_range
24
+ elif entry_type == EntryType .OTHERS :
25
+ range = others_main_range
26
+ else :
27
+ range = payment_main_range
28
+ # Make the request
29
+ results = sheets_api .spreadsheets ().values ().batchGet (
30
+ spreadsheetId = sheet_id ,
31
+ ranges = range ).execute ()
32
+
33
+ # Get the values from the result
34
+ value_ranges = results .get ('valueRanges' , [])
35
+
36
+ dropdown = []
37
+ for value in value_ranges :
38
+ dropdown .append (value .get ('values' , []))
39
+
40
+ if entry_type == EntryType .TRANSPORT :
41
+ new_list = list (dropdown [0 ])
42
+ flat_list = [item for sublist in new_list for item in sublist ]
43
+ return flat_list
44
+ return dropdown [0 ][0 ]
45
+
46
+ # Get the sub dropdown values
47
+ def get_sub_dropdown_value (sheet_id , main_value , entry_type ):
48
+ range = []
49
+ if entry_type == EntryType .OTHERS :
50
+ range = others_sub_range
51
+ else :
52
+ range = payment_sub_range
53
+ # Make the request
54
+ results = sheets_api .spreadsheets ().values ().batchGet (
55
+ spreadsheetId = sheet_id ,
56
+ ranges = range ).execute ()
57
+
58
+ # Get the values from the result
59
+ value_ranges = results .get ('valueRanges' , [])
60
+
61
+ dropdown = []
62
+ for value in value_ranges :
63
+ if value .get ('values' , []):
64
+ if main_value == value .get ('values' , [])[0 ][0 ]:
65
+ dropdown .append (value .get ('values' , []))
66
+ pass
67
+
68
+ flat_list = [item for sublist in dropdown [0 ] for item in sublist ]
69
+ return flat_list
70
+
71
+ # Sum up previous day
72
+ def update_prev_day (sheet_id , month , first_row ):
73
+ last_row = get_new_row (sheet_id , month )
74
+ # Write the message to the Google Sheet
75
+ body = {'values' : [[f'=SUM(C{ first_row } :H{ last_row } )' ]]}
76
+ range_name = f'{ month } !B{ first_row } '
77
+ sheets_api .spreadsheets ().values ().update (
78
+ spreadsheetId = sheet_id ,
79
+ range = range_name ,
80
+ valueInputOption = 'USER_ENTERED' ,
81
+ body = body ).execute ()
82
+
83
+ # Get new row no in sheets
84
+ def get_new_row (sheet_id , month ):
85
+ result = sheets_api .spreadsheets ().values ().get (
86
+ spreadsheetId = sheet_id ,
87
+ range = f'{ month } !A:K' ).execute ()
88
+ values = result .get ('values' , [])
89
+ return len (values )
90
+
91
+ # Enter new date into cell
92
+ def create_date (sheet_id , day , month , first_row ):
93
+ # Update date in column A
94
+ body = {'values' : [[day ]]}
95
+ range_name = f'{ month } !A{ first_row } '
96
+ sheets_api .spreadsheets ().values ().update (
97
+ spreadsheetId = sheet_id ,
98
+ range = range_name ,
99
+ valueInputOption = 'USER_ENTERED' ,
100
+ body = body ).execute ()
101
+
102
+ # create new entry into google sheet
103
+ def create_entry (sheet_id , month , row_tracker , row_data ):
104
+ entry_type = row_data [0 ]
105
+ price = row_data [1 ].strip ()
106
+ remarks = row_data [2 ].strip ()
107
+ category = row_data [3 ].strip ()
108
+ payment = row_data [4 ].strip ()
109
+
110
+ data = [price , remarks , category , payment ]
111
+ sheet_column_start = 'H'
112
+ sheet_column_end = 'K'
113
+ if entry_type == EntryType .TRANSPORT :
114
+ remarks_list = [remark .strip () for remark in remarks .split (',' )]
115
+ sheet_column_start = 'C'
116
+ sheet_column_end = 'G'
117
+ data = [price ] + remarks_list + [category , payment ]
118
+
119
+ # Write the message to the Google Sheet
120
+ body = {'values' : [data ]}
121
+ range_name = f'{ month } !{ sheet_column_start } { row_tracker } :{ sheet_column_end } { row_tracker } '
122
+ sheets_api .spreadsheets ().values ().update (
123
+ spreadsheetId = sheet_id ,
124
+ range = range_name ,
125
+ valueInputOption = 'USER_ENTERED' ,
126
+ body = body ).execute ()
127
+
128
+ def get_trackers (sheet_id ):
129
+ result = sheets_api .spreadsheets ().values ().get (
130
+ spreadsheetId = sheet_id ,
131
+ range = f'Tracker!B3:E3' ).execute ()
132
+ values = result .get ('values' , [])
133
+ return values [0 ]
134
+
135
+ def update_rows (sheet_id , day , new_row ):
136
+ values = [[day ] + [new_row ] * 3 ] # Create a row with the same value repeated 3 times
137
+ range_name = 'Tracker!B3:E3'
138
+ body = {'values' : values }
139
+ request = sheets_api .spreadsheets ().values ().update (
140
+ spreadsheetId = sheet_id ,
141
+ range = range_name ,
142
+ valueInputOption = 'USER_ENTERED' ,
143
+ body = body
144
+ )
145
+ request .execute ()
146
+
147
+
148
+ def row_incremental (sheet_id , entry_type ):
149
+ range_name = 'Tracker!B3:E3'
150
+ response = sheets_api .spreadsheets ().values ().get (
151
+ spreadsheetId = sheet_id ,
152
+ range = range_name ,
153
+ majorDimension = 'ROWS'
154
+ ).execute ()
155
+
156
+ values = response .get ('values' , [])
157
+ if values :
158
+ row_values = values [0 ]
159
+ if entry_type == EntryType .OTHERS :
160
+ row_values [1 ] = str (int (row_values [1 ]) + 1 ) # Increment others count
161
+ elif entry_type == EntryType .TRANSPORT :
162
+ row_values [2 ] = str (int (row_values [2 ]) + 1 ) # Increment transport count
163
+
164
+ body = {'values' : [row_values ]}
165
+ sheets_api .spreadsheets ().values ().update (
166
+ spreadsheetId = sheet_id ,
167
+ range = range_name ,
168
+ valueInputOption = 'USER_ENTERED' ,
169
+ body = body
170
+ ).execute ()
171
+
172
+ def get_quick_add_settings (sheet_id , entry_type ):
173
+ range_name = 'Tracker!G3:J3' # Replace with the desired range in your Google Sheet
174
+ response = sheets_api .spreadsheets ().values ().get (
175
+ spreadsheetId = sheet_id ,
176
+ range = range_name ,
177
+ majorDimension = 'ROWS'
178
+ ).execute ()
179
+
180
+ values = response .get ('values' , [])
181
+ if values :
182
+ if entry_type == EntryType .TRANSPORT :
183
+ transport_payment = values [0 ][0 ] if len (values [0 ]) > 0 else None
184
+ transport_type = values [0 ][1 ] if len (values [0 ]) > 1 else None
185
+ return transport_payment , transport_type
186
+ else :
187
+ others_payment = values [0 ][2 ] if len (values [0 ]) > 2 else None
188
+ others_type = values [0 ][3 ] if len (values [0 ]) > 3 else None
189
+ return others_payment , others_type
190
+
191
+ return None
192
+
193
+ def update_quick_add_settings (sheet_id , entry_type , payment , type ):
194
+ range_name = 'Tracker!G3:J3' # Replace with the desired range in your Google Sheet
195
+
196
+ # Get existing values from the range, or an empty list if the range is empty
197
+ response = sheets_api .spreadsheets ().values ().get (
198
+ spreadsheetId = sheet_id ,
199
+ range = range_name ,
200
+ majorDimension = 'ROWS'
201
+ ).execute ()
202
+
203
+ values = response .get ('values' , []) # Initialize with an empty list if no values are present
204
+
205
+ if not values :
206
+ values = [[]] # Create an empty row if the range is empty
207
+
208
+ if len (values ) == 0 :
209
+ values .append ([]) # Add a row if the values list is empty
210
+
211
+ # Determine the number of columns needed
212
+ num_columns = max (4 , len (values [0 ]))
213
+
214
+ if len (values [0 ]) < num_columns :
215
+ values [0 ].extend (['' ] * (num_columns - len (values [0 ]))) # Extend the existing row with empty strings
216
+
217
+ if entry_type == EntryType .TRANSPORT :
218
+ values [0 ][0 ] = payment if payment else ''
219
+ values [0 ][1 ] = type if type else ''
220
+ else :
221
+ values [0 ][2 ] = payment if payment else ''
222
+ values [0 ][3 ] = type if type else ''
223
+
224
+ body = {'values' : values }
225
+ sheets_api .spreadsheets ().values ().update (
226
+ spreadsheetId = sheet_id ,
227
+ range = range_name ,
228
+ valueInputOption = 'USER_ENTERED' ,
229
+ body = body
230
+ ).execute ()
231
+
232
+ return True
0 commit comments