Skip to content

Instantly share code, notes, and snippets.

@sagarOsammy
Forked from TheSidd/code.gs
Last active June 12, 2023 17:18
Show Gist options
  • Save sagarOsammy/a6ce9c4555e3b1edcd98e6b38a224861 to your computer and use it in GitHub Desktop.
Save sagarOsammy/a6ce9c4555e3b1edcd98e6b38a224861 to your computer and use it in GitHub Desktop.
function getRelevantMessages()
{
var threads = GmailApp.search("newer_than:1d AND in:inbox AND from:axisbank.com AND subject:Transaction alert AND -label:axis_processed",0,100);
var arrToConvert=[];
for(var i = threads.length - 1; i >=0; i--) {
arrToConvert.push(threads[i].getMessages());
}
var messages = [];
for(var i = 0; i < arrToConvert.length; i++) {
messages = messages.concat(arrToConvert[i]);
}
return messages;
}
function parseMessageData(messages) {
var records = [];
if (!messages) {
console.log("messages is undefined or null or just empty");
return records;
}
for (var m = 0; m < messages.length; m++) {
var text = messages[m].getPlainBody();
var matches = text.match(/Card no.\s(XX\d+)\sfor\sINR\s([0-9,]*\.*[0-9]*)\sat\s+(.+?)\son\s(\d+-\d+-\d+\s\d+:\d+:\d+)/);
console.log(matches);
console.log(matches.length);
if (!matches || matches.length < 4) {
console.log("No matches; couldn't parse continue with the next message");
continue;
}
var rec = {};
rec.card = matches[1];
rec.currency = 'INR';
rec.amount = matches[2];
rec.merchant = matches[3];
rec.date = matches[4];
records.push(rec);
}
return records;
}
function getMessagesDisplay()
{
var templ = HtmlService.createTemplateFromFile('messages');
templ.messages = getRelevantMessages();
return templ.evaluate();
}
function getParsedDataDisplay()
{
var templ = HtmlService.createTemplateFromFile('parsed');
templ.records = parseMessageData(getRelevantMessages());
return templ.evaluate();
}
function saveDataToSheet(records)
{
//REPLACE WITH YOUR GOOGLE SHEET URL
var spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/zTDJo5a6QK/edit#gid=1439879152 - REPLACE BETWEEN QUOTES");
var sheet = spreadsheet.getSheetByName("Axis");
for(var r=0;r<records.length;r++)
{
sheet.appendRow([records[r].date,records[r].card, records[r].merchant, records[r].amount, records[r].currency] );
}
}
function processTransactionEmails()
{
var messages = getRelevantMessages();
var records = parseMessageData(messages);
saveDataToSheet(records);
labelMessagesAsDone(messages);
return true;
}
function labelMessagesAsDone(messages)
{
var label = 'axis_processed';
var label_obj = GmailApp.getUserLabelByName(label);
if(!label_obj)
{
label_obj = GmailApp.createLabel(label);
}
for(var m =0; m < messages.length; m++ )
{
label_obj.addToThread(messages[m].getThread() );
}
}
function doGet()
{
return getParsedDataDisplay();
//return getMessagesDisplay();
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<title>Message Display Test</title>
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
</head>
<body style="padding:3em;">
<h1>Messages</h1>
<ul>
<? for(var m=0;m<messages.length;m++){ ?>
<li><?= messages[m].getSubject() ?></li>
<p><?= messages[m].getPlainBody() ?></p>
<? } ?>
</ul>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<title>Data parsed from emails</title>
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
</head>
<body style="padding:3em;">
<h2>Parsed data from Messages</h2>
<table style="width:420px">
<thead>
<tr>
<th>Date</th><th>Merchant</th><th>Card</th><th>Amount</th>
</tr>
</thead>
<tbody>
<? for(var m=0;m<records.length;m++){ ?>
<tr>
<td><?= records[m].date ?></td>
<td><?= records[m].merchant ?></td>
<td><?= records[m].card ?></td>
<td><?= records[m].currency ?></td>
<td><?= records[m].amount ?></td>
</tr>
<? }?>
</tbody>
</table>
<div class="block">
<button id="save_to_sheet" class="blue">Save Data to Sheet</button>
<span id="saving_label" style="visibility:hidden">Saving ...</span>
</div>
<script>
document.querySelector("#save_to_sheet").addEventListener("click",
function(e)
{
var self=this;
self.style.visibility = 'hidden';
var saving_label = document.querySelector("#saving_label");
saving_label.style.visibility = 'visible';
google.script.run.withSuccessHandler(function()
{
alert("Saved expense data");
self.style.visibility = 'visible';
saving_label.style.visibility = 'hidden';
}).withFailureHandler(function()
{
alert("an error occured while saving");
self.style.visibility = 'visible';
saving_label.style.visibility = 'hidden';
}).processTransactionEmails();
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment