Income & Expense Tracker
Loading... Please wait
๐ฐ Income & Expense Tracker
| Date | Type | Category | Amount | Description | Status | Actions |
code .gs
function doGet(e) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
if (e.parameter.action === "read") {
const data = sheet.getDataRange().getValues();
const headers = data.shift();
const result = data.map(row => {
let obj = {};
headers.forEach((h, i) => obj[h] = row[i]);
return obj;
});
return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
}
if (e.parameter.action === "export") {
const format = e.parameter.format;
const url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
const exportUrl = format === "excel"
? url.replace("/edit", "/export?format=xlsx")
: url.replace("/edit", "/export?format=pdf");
return HtmlService.createHtmlOutput(``);
}
return ContentService.createTextOutput("Invalid action.");
}
function doPost(e) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
const data = JSON.parse(e.postData.contents);
const entryId = data.entryId;
const rowData = [data.date, data.type, data.category, data.amount, data.description, "Editable"];
if (entryId) {
const values = sheet.getDataRange().getValues();
const rowIndex = values.findIndex(r => r[0] == entryId);
if (rowIndex > -1 && values[rowIndex][6] === "Editable") {
sheet.getRange(rowIndex + 1, 2, 1, 5).setValues([rowData.slice(1)]);
}
} else {
const lastId = sheet.getLastRow();
sheet.appendRow([lastId, ...rowData]);
}
return ContentService.createTextOutput("Success").setMimeType(ContentService.MimeType.TEXT);
}