đ§ Setup Instructions
- Open your Google Sheet â go to Extensions â Apps Script
- Paste the script below â Save â Deploy as Web App
- Set access to "Anyone" â Copy the Web App URL
- Paste the URL below and click Connect
function doPost(e){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = JSON.parse(e.postData.contents);
if(sheet.getLastRow()===0)
sheet.appendRow(['ID','Name','Name_EN','Father','Blood','Area','Village','Phone','Role','Status','Date']);
sheet.appendRow([data.id,data.name,data.name_en,data.father,data.blood,
data.area,data.village,data.phone,data.role,data.status,data.date]);
return ContentService.createTextOutput('OK');
}
var SHEET_NAME = 'Members';
var BLOOD_LOG_SHEET = 'BloodLog';
var DONATIONS_SHEET = 'Donations';
function doGet(e) {
var action = e.parameter.action || 'getMembers';
var callback = e.parameter.callback;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var result;
if (action === 'getMembers') {
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) sheet = ss.insertSheet(SHEET_NAME);
var data = sheet.getDataRange().getValues();
if (data.length <= 1) {
result = { members: [] };
} else {
var headers = data[0];
var members = [];
for (var i = 1; i < data.length; i++) {
var obj = {};
for (var j = 0; j < headers.length; j++) {
obj[headers[j]] = data[i][j];
}
members.push(obj);
}
result = { members: members };
}
} else if (action === 'getBloodLog') {
var sheet2 = ss.getSheetByName(BLOOD_LOG_SHEET);
if (!sheet2) {
result = { logs: [] };
} else {
var data2 = sheet2.getDataRange().getValues();
if (data2.length <= 1) {
result = { logs: [] };
} else {
var headers2 = data2[0];
var logs = [];
for (var i2 = 1; i2 < data2.length; i2++) {
var obj2 = {};
for (var j2 = 0; j2 < headers2.length; j2++) {
obj2[headers2[j2]] = data2[i2][j2];
}
logs.push(obj2);
}
result = { logs: logs };
}
}
} else if (action === 'getBloodRequests') {
var brGSheet = ss.getSheetByName('BloodRequests');
if (!brGSheet) {
result = { requests: [] };
} else {
var brGData = brGSheet.getDataRange().getValues();
if (brGData.length <= 1) {
result = { requests: [] };
} else {
var brGHeaders = brGData[0];
var requests = [];
for (var ri = 1; ri < brGData.length; ri++) {
var robj = {};
for (var rj = 0; rj < brGHeaders.length; rj++) {
robj[brGHeaders[rj]] = brGData[ri][rj];
}
requests.push(robj);
}
result = { requests: requests };
}
}
} else {
result = { ok: true };
}
if (callback) {
return ContentService.createTextOutput(callback + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var action = data.action || 'SAVE_MEMBER';
if (action === 'SAVE_ALL') {
var sheet = getOrCreateSheet(ss, SHEET_NAME);
sheet.clearContents();
if (data.members && data.members.length > 0) {
var keys = Object.keys(data.members[0]);
sheet.appendRow(keys);
for (var i = 0; i < data.members.length; i++) {
var row = [];
for (var j = 0; j < keys.length; j++) {
row.push(data.members[i][keys[j]] || '');
}
sheet.appendRow(row);
}
}
return makeResponse({ ok: true, saved: data.members ? data.members.length : 0 });
}
if (action === 'SAVE_MEMBER' || action === 'NEW_APPLICATION' || action === 'APPROVED' || action === 'UPDATE' || action === 'REJECTED') {
upsertMember(ss, data);
return makeResponse({ ok: true });
}
if (action === 'SAVE_BLOOD_LOG') {
var blSheet = getOrCreateSheet(ss, BLOOD_LOG_SHEET);
var blKeys = ['id','donor','recipient','blood','date','note'];
if (blSheet.getLastRow() === 0) blSheet.appendRow(blKeys);
var blRow = [];
for (var k = 0; k < blKeys.length; k++) {
blRow.push(data.entry[blKeys[k]] || '');
}
blSheet.appendRow(blRow);
return makeResponse({ ok: true });
}
if (action === 'SAVE_DONATION') {
var dnSheet = getOrCreateSheet(ss, DONATIONS_SHEET);
var dnKeys = ['id','name','amount','phone','date','msg'];
if (dnSheet.getLastRow() === 0) dnSheet.appendRow(dnKeys);
var dnRow = [];
for (var d = 0; d < dnKeys.length; d++) {
dnRow.push(data.entry[dnKeys[d]] || '');
}
dnSheet.appendRow(dnRow);
return makeResponse({ ok: true });
}
if (action === 'BLOOD_REQUEST') {
var brSheet = getOrCreateSheet(ss, 'BloodRequests');
var brKeys = ['id','patient','blood','hospital','contact','requesterName','relation','requesterAddr','requesterID','status','requestDate','fulfilledBy'];
if (brSheet.getLastRow() === 0) brSheet.appendRow(brKeys);
var brAllData = brSheet.getDataRange().getValues();
var foundBR = -1;
for (var bi = 1; bi < brAllData.length; bi++) {
if (String(brAllData[bi][0]) === String(data.id)) { foundBR = bi + 1; break; }
}
var brRow = brKeys.map(function(k){ return data[k] || ''; });
if (foundBR > 0) {
brSheet.getRange(foundBR, 1, 1, brKeys.length).setValues([brRow]);
} else {
brSheet.appendRow(brRow);
}
return makeResponse({ ok: true });
}
if (action === 'UPDATE_BLOOD_REQUEST_STATUS') {
var brSheet3 = getOrCreateSheet(ss, 'BloodRequests');
var allRows = brSheet3.getDataRange().getValues();
for (var si = 1; si < allRows.length; si++) {
if (String(allRows[si][0]) === String(data.id)) {
brSheet3.getRange(si + 1, 10).setValue(data.status || 'fulfilled');
break;
}
}
return makeResponse({ ok: true });
}
if (action === 'DELETE_BLOOD_REQUEST') {
var brSheet4 = getOrCreateSheet(ss, 'BloodRequests');
var delRows = brSheet4.getDataRange().getValues();
for (var di = 1; di < delRows.length; di++) {
if (String(delRows[di][0]) === String(data.id)) {
brSheet4.deleteRow(di + 1);
break;
}
}
return makeResponse({ ok: true });
}
return makeResponse({ ok: true });
}
function upsertMember(ss, m) {
var sheet = getOrCreateSheet(ss, SHEET_NAME);
var data = sheet.getDataRange().getValues();
var keys = ['id','name','name_en','father','blood','area','district','block','village','phone','wa','em','role','gender','prof','nid_no','post','pin','addr','status','date','approvedDate','donations','recommended','active','ref_name','ref_how','remarks','dob'];
if (data.length === 0) {
sheet.appendRow(keys);
data = sheet.getDataRange().getValues();
}
var found = -1;
for (var i = 1; i < data.length; i++) {
if (String(data[i][0]) === String(m.id)) {
found = i + 1;
break;
}
}
var row = [];
for (var j = 0; j < keys.length; j++) {
row.push(m[keys[j]] !== undefined ? m[keys[j]] : '');
}
if (found > 0) {
sheet.getRange(found, 1, 1, keys.length).setValues([row]);
} else {
sheet.appendRow(row);
}
}
function getOrCreateSheet(ss, name) {
var s = ss.getSheetByName(name);
if (!s) s = ss.insertSheet(name);
return s;
}
function makeResponse(data) {
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}