Created
May 30, 2021 09:57
-
-
Save doylefermi/e0c6d2e82aae100e00869f685f44a66d to your computer and use it in GitHub Desktop.
My Personal Expense Tracker Bot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Format in Google Sheet | |
// Budget 10000 | |
// Total Expense 1100 | |
// Balance 8900 | |
// Date Item Price | |
// 30/05/2021 14:30:37 Test 100 | |
// 30/05/2021 14:30:43 New 1000 | |
var token = "<bot_token_from_botfather>"; | |
var telegramUrl = "https://api.telegram.org/bot" + token; | |
var webAppUrl = "<web_app_url_after_Google_app_script_deployment>"; | |
function setWebhook() { | |
var url = telegramUrl + "/setWebhook?url=" + webAppUrl; | |
var response = UrlFetchApp.fetch(url); | |
} | |
function sendText(chatId, text, keyBoard) { | |
var data = { | |
method: "post", | |
payload: { | |
method: "sendMessage", | |
chat_id: String(chatId), | |
text: text, | |
parse_mode: "HTML", | |
reply_markup: JSON.stringify(keyBoard) | |
} | |
}; | |
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data); | |
} | |
function isAuthorizedUser(contents) { | |
var validUsers = ["<username>"]; | |
var username = false; | |
if (contents.message) { | |
var user = contents.message.from.username; | |
if (!validUsers.includes(user)) { | |
console.log(contents); | |
sendText(contents.message.from.id, "Hi " + user + ", this is a personal bot. You are not authorized to use this. You will be reported."); | |
sendText("<admin_chat_id>", "Unauthorized: " + JSON.stringify(contents.message)); | |
} else { | |
username = user; | |
} | |
} else if (contents.callback_query) { | |
username = contents.callback_query.from.username; | |
} | |
console.log(username); | |
return username; | |
} | |
function doPost(e) { | |
var contents = JSON.parse(e.postData.contents); | |
var username = isAuthorizedUser(contents); | |
if (!username) { | |
return; | |
} | |
//set spreadsheet | |
var ssId = '<spreadsheet_id>'; | |
var currentDate = new Date(); | |
var currentMonthForSheetName = Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "MMMM"); | |
var expenseSheet = SpreadsheetApp.openById(ssId).getSheetByName("[" + username + "]" + currentMonthForSheetName); | |
var keyBoard = { | |
"inline_keyboard": [ | |
[{ | |
"text": "Budget", | |
'callback_data': 'budget' | |
}, | |
{ | |
"text": "Total", | |
'callback_data': 'total' | |
}], | |
[{ | |
"text": "Balance", | |
'callback_data': 'balance' | |
}, | |
{ | |
"text": "Expenses", | |
'callback_data': 'expenses' | |
}], | |
[ | |
{ | |
"text": "Delete last", | |
'callback_data': 'delete_last' | |
} | |
] | |
] | |
}; | |
if (contents.callback_query) { | |
var id_callback = contents.callback_query.from.id; | |
var data = contents.callback_query.data; | |
if (data == 'budget') { | |
var budget = expenseSheet.getRange(1, 2).getValue(); | |
sendText(id_callback, "Rs. " + budget + " is your allocated budget for the month."); | |
} else if (data == 'total') { | |
var total = expenseSheet.getRange(2, 2).getValue(); | |
sendText(id_callback, "Rs. " + total + " is your total spent so far."); | |
} else if (data == 'balance') { | |
var balance = expenseSheet.getRange(3, 2).getValue(); | |
sendText(id_callback, "Rs. " + balance + " is your money left."); | |
} else if (data == 'expenses') { | |
var expenses = []; | |
var lr = expenseSheet.getDataRange().getLastRow(); | |
var expenseList; | |
for (var i = 6; i <= lr; i++) { | |
var date = expenseSheet.getRange(i, 1).getValue(); | |
var newDate = date.getMonth() + 1 + '/' + date.getDate(); | |
var item = expenseSheet.getRange(i, 2).getValue(); | |
var price = expenseSheet.getRange(i, 3).getValue(); | |
expenses.push("\n" + newDate + " " + item + " " + price); | |
expenseList = expenses.join(); | |
} | |
sendText(id_callback, decodeURI("Here are your expenses: %0A " + expenseList)); | |
} | |
else if (data == 'delete_last') { | |
var lastRow = expenseSheet.getLastRow(); | |
if (lastRow > 5.0) { | |
var lastRowValues = expenseSheet.getRange(lastRow, 2, 1, 2); | |
sendText(id_callback, decodeURI("Deleted: " + lastRowValues.getValues())); | |
expenseSheet.deleteRow(lastRow); | |
} else { | |
sendText(id_callback, "No more items in the sheet."); | |
} | |
} | |
} | |
else if (contents.message) { | |
var id_message = contents.message.from.id; | |
var text = contents.message.text; | |
var item = text.split("="); | |
if (text.indexOf("=") !== -1) { | |
//get date | |
var nowDate = new Date(); | |
var date = nowDate; | |
expenseSheet.appendRow([date, item[0], item[1]]); | |
var balance = expenseSheet.getRange(3, 2).getValue(); | |
sendText(id_message, "Ok. Added to your expense sheet. Your balance is: Rs. " + balance); | |
} else { | |
sendText(id_message, "Hi " + username + ", you may send me your expenses with format: 'item = price'. You may also pull your expense reports:", keyBoard) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment