๐ CODE.GS (Backend Google Apps Script)
/**
* Risk Monitoring Dashboard - Citilink Indonesia
* Backend Google Apps Script (Code.gs)
* Developed by @Bernand
*/
function doGet(e) {
return HtmlService.createTemplateFromFile('Index')
.evaluate()
.setTitle('Risk Monitoring Dashboard - Citilink Indonesia')
.addMetaTag('viewport', 'width=device-width, initial-scale=1.0')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
// Global Spreadsheet reference
function getSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('RiskRegister');
if (!sheet) {
sheet = ss.insertSheet('RiskRegister');
sheet.appendRow([
'Risk_ID', 'Peristiwa_Risiko', 'Kategori', 'Total_Mitigasi',
'Done_Mitigasi', 'Progress_Pct', 'RAG', 'Efektivitas', 'Notes'
]);
}
return sheet;
}
// Get all risks array from Google Sheet
function getRiskDataFromSheet() {
var sheet = getSheet();
var data = sheet.getDataRange().getValues();
if (data.length <= 1) return [];
var result = [];
for (var i = 1; i < data.length; i++) {
var row = data[i];
result.push({
id: row[0],
title: row[1],
category: row[2],
totalMitigation: Number(row[3]) || 1,
doneMitigation: Number(row[4]) || 0,
progressPct: Number(row[5]) || 0,
rag: row[6],
effectiveness: row[7],
notes: row[8]
});
}
return result;
}
// Save or Update Risk Item
function saveRiskToSheet(riskItem) {
var sheet = getSheet();
var data = sheet.getDataRange().getValues();
var rowIndex = -1;
for (var i = 1; i < data.length; i++) {
if (data[i][0] == riskItem.id) {
rowIndex = i + 1;
break;
}
}
var newRow = [
riskItem.id,
riskItem.title,
riskItem.category,
riskItem.totalMitigation,
riskItem.doneMitigation,
riskItem.progressPct,
riskItem.rag,
riskItem.effectiveness,
riskItem.notes
];
if (rowIndex > 0) {
sheet.getRange(rowIndex, 1, 1, newRow.length).setValues([newRow]);
} else {
sheet.appendRow(newRow);
}
return { status: 'success', message: 'Data berhasil disimpan!' };
}
// Delete Risk Item
function deleteRiskFromSheet(riskId) {
var sheet = getSheet();
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] == riskId) {
sheet.deleteRow(i + 1);
return { status: 'success', message: 'Risk ' + riskId + ' berhasil dihapus' };
}
}
return { status: 'error', message: 'ID tidak ditemukan' };
}