Skip to content

Instantly share code, notes, and snippets.

@doylefermi
Created May 30, 2021 09:57
Show Gist options
  • Save doylefermi/e0c6d2e82aae100e00869f685f44a66d to your computer and use it in GitHub Desktop.
Save doylefermi/e0c6d2e82aae100e00869f685f44a66d to your computer and use it in GitHub Desktop.
My Personal Expense Tracker Bot
// 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