-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathandromoney_script.js
211 lines (182 loc) · 6.08 KB
/
andromoney_script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
var HEADING_COLUMN = {
'6': '1', //Date
'15': '2', //Type (default to personal)
'4': '3', //Category
'5': '4', //Subcategory
'12': '5', //Vendor
'7': '6', //Payment (check if empty)
'2': '7', //Currency
'3': '8', //Amount
'9': '9' //Note
};
var MONTHS = [
'Test',
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
];
//2016_ID
//var TRACKER_ID = '1AweSw57sw-a33ijYq9n7aQOR3xuizXeJoYExPKfMTQE';
//2017_ID
//var TRACKER_ID = '1NZWrWFLTJYJmvA_T0gq4--7DJc1L_GaF5XcS0N3Pgps';
// Europe_2017
//var TRACKER_ID = '1FyMr67nUW6yFL8NJFpguUCft9Q6f5RbC4CcsTIXfuME';
//2018 ID
//var TRACKER_ID = '16ch-qMh1XGIVHZkRoAA4Rw4HUNqe70oigoGiVNyu8JQ';
//2019 ID
//var TRACKER_ID = '1HxKjp5JYU-GOtrnuJZk6OYJucPt_RkhytqUL9TZMazQ';
//2020 ID
var TRACKER_ID = '1DS3NPcwPnoEpMV_34rTAMQ6SXYMc4HpDvR1vdntSPAE';
var MAX_ROW_NUMBER = 200;
var ENDPOINT_RATES = 'http://apilayer.net/api/live?access_key=b9f923b9b69e956ea34daa10694fc9b1&source=USD¤cies={currency}&format=1';
function getLatestExchangeRate(currency) {
var url = ENDPOINT_RATES.replace('{currency}', currency);
var response = UrlFetchApp.fetch(url);
var data = JSON.parse(response.getContentText());
var rate = 0.0;
var key = 'USD' + currency;
if (data && data.quotes && data.quotes.hasOwnProperty(key)) {
rate = data.quotes[key];
}
return rate;
}
var exchangeRates = {};
var spreadsheet;
var formattedSheet;
var sheet;
var currentMonth;
// Application Triggers
function onOpen() {
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
formattedSheet = spreadsheet.getSheetByName('Formatted');
if (formattedSheet == null) {
spreadsheet.insertSheet('Formatted');
formattedSheet = spreadsheet.getSheetByName('Formatted');
}
sheet = spreadsheet.getSheetByName('AndroMoney');
spreadsheet.setActiveSheet(sheet);
var menuEntries = [
{name: "Format & Transfer Data", functionName: "formatAndTransferData"},
{name: "Format Data", functionName: "formatData"},
];
spreadsheet.addMenu("AndroidMoney", menuEntries);
}
// Application
function formatAndTransferData() {
transformAmount();
copyFormattedData();
copyDataToTracker();
}
function formatData() {
transformAmount();
copyFormattedData();
}
/*
* Assigns a positive or negative value to the amount according to
* type of transaction: income or expense
*/
function transformAmount() {
var columnExpenseType = 'G';
var columnProject = 'K';
var columnCurrency = 'B';
var columnAmount = 'C';
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
sheet = spreadsheet.getSheetByName('AndroMoney');
var id;
var cellValue;
var lastRow = sheet.getLastRow();
var cellCurrency;
var currency;
var project;
for (var i = 3, amount; (amount = sheet.getRange(columnAmount + i).getValue()); i++) {
project = sheet.getRange(columnProject + i).getValue();
while (project === 'Business') {
sheet.deleteRow(i);
project = sheet.getRange(columnProject + i).getValue();
amount = sheet.getRange(columnAmount + i).getValue();
}
// Column expense type check if its either a expense or income
cellValue = sheet.getRange(columnExpenseType + i).getValue();
cell = sheet.getRange(columnAmount + i);
if (cellValue != '') {
cell.setValue(Math.abs(amount) * -1);
} else {
//income always come as empty string
cell.setValue(0 + Math.abs(amount));
}
cellCurrency = sheet.getRange(columnCurrency + i);
currency = cellCurrency.getValue();
// Open prompt
if (currency !== 'USD') {
if (!exchangeRates.hasOwnProperty(currency)) {
var rate = getLatestExchangeRate(currency);
exchangeRates[currency] = rate;
SpreadsheetApp.getActiveSpreadsheet().toast(
'Exchange Rate', 'Exchange rate for USD - ' + currency + ': ' + rate, 5);
}
transformAmountToExchangeRate(cell, exchangeRates[currency]);
}
}
}
function transformAmountToExchangeRate(cell, rate) {
cell.setValue(cell.getValue() / rate);
}
/*
* Copy the raw data to formatted spreadsheet
*/
function copyFormattedData() {
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
formattedSheet = spreadsheet.getSheetByName('Formatted');
sheet = spreadsheet.getSheetByName('AndroMoney');
for (var columnSource in HEADING_COLUMN) {
var values = sheet.getRange(3, columnSource, MAX_ROW_NUMBER); //getRange(row, column, numRows)
var targetColumn = HEADING_COLUMN[columnSource];
values.copyValuesToRange(formattedSheet, targetColumn, targetColumn, 2, MAX_ROW_NUMBER);
}
var lastRow = formattedSheet.getLastRow();
for (var i = 2; i <= lastRow; i++) {
var cell = formattedSheet.getRange('A' + i);
var dateString = cell.getValue() + '';
var year = dateString.substring(0,4);
var month = dateString.substring(4,6);
var day = dateString.substring(6,8);
cell.setValue(month + "/" + day + "/" + year);
}
}
/*
* Copies all data to tracker spreadsheet
*/
function copyDataToTracker() {
// Get source data
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
formattedSheet = spreadsheet.getSheetByName('Formatted');
var sourceData = formattedSheet.getDataRange().getValues()
var targetSheetName = getCurrentMonth();
// Copy data to tracker
var trackerSpreadsheet = SpreadsheetApp.openById(TRACKER_ID).getSheetByName(targetSheetName);
trackerSpreadsheet.getRange(1,1, sourceData.length, sourceData[0].length).setValues(sourceData);
// TODO set canary text and trigger flow
}
/*
* Get the current month id for the expenses
* @returns {string}
*/
function getCurrentMonth() {
spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
let sheet = spreadsheet.getSheetByName('Formatted');
let dateString = sheet.getRange('A2').getValue();
let dateObject = new Date(dateString);
let date = Utilities.formatDate(dateObject, spreadsheet.getSpreadsheetTimeZone(), 'MM/dd/YY');
let monthStr = date.substring(0,2);
let month = parseInt(monthStr, 10);
return MONTHS[month];
}