Inovasi
IKAN LELE
(Informasi Kesehatan Melalui Leaflet Elektronik)
Unit Promosi Kesehatan Rumah Sakit (PKRS)
UPT RSUD SINJAI
Akses materi edukasi kesehatan terpercaya, panduan pencegahan infeksi, etika batuk, hingga leaflet dan video informasi kesehatan digital berbasis scan QR Code yang mudah dipahami.
Katalog Leaflet & Video Edukasi
Pilih leaflet digital atau video edukasi resmi dari RSUD Sinjai di bawah ini.
Dashboard Statistik Real-time
Pantau pembacaan leaflet, jumlah pengunjung, dan sebaran wilayah pengunjung langsung dari Google Sheets.
Total Pengunjung
0
Pembacaan Leaflet
0
Tautan Leaflet Aktif
0
Rasio Baca (CTR)
0%
Frekuensi Pembacaan per Leaflet
Tren Aktivitas Real-time
Daftar Wilayah Pengunjung Web
Rincian lokasi pengunjung asli terdaftar di Google Sheets.
Rincian Performa Materi Leaflet
| Nama Leaflet | Kategori | Jumlah Dilihat | Persentase | Status |
|---|
Pengaturan & Manajemen Konten
Kelola daftar materi edukasi dan integrasi Google Apps Script (GAS).
Daftar Tautan Edukasi
Kelola tautan leaflet Google Drive dan Video YouTube.
Identitas & Logo Website
Integrasi Google Apps Script (GAS)
Tempelkan Web App URL Google Apps Script untuk sinkronisasi Google Sheets secara real-time.
Tempelkan Web App URL dari Google Apps Script lalu tekan tombol simpan di bawah.
// MASTER PLAN GOOGLE APPS SCRIPT - IKAN LELE V3 (SINKRONISASI TOTAL)
function doGet(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ensureSheetsExist(ss);
// 1. Data Tautan (Master_Tautan)
var sheetLinks = ss.getSheetByName("Master_Tautan");
var dataLinks = sheetLinks.getDataRange().getValues();
var links = [];
var globalLogo = "";
for (var i = 1; i < dataLinks.length; i++) {
if (dataLinks[i][0] !== "" && dataLinks[i][0] !== null) {
links.push({
id: dataLinks[i][0],
title: dataLinks[i][1],
url: dataLinks[i][2],
category: dataLinks[i][3],
type: dataLinks[i][4] || 'leaflet',
icon: dataLinks[i][5],
clicks: parseInt(dataLinks[i][6] || 0),
active: dataLinks[i][7] === true || dataLinks[i][7] === "TRUE" || dataLinks[i][7] === "true"
});
if (!globalLogo && dataLinks[i][8] && dataLinks[i][8].toString().trim() !== "") {
globalLogo = dataLinks[i][8].toString().trim();
}
}
}
// 2. Data Pengaturan (Pengaturan)
var sheetSettings = ss.getSheetByName("Pengaturan");
var settings = { logo: globalLogo };
if (sheetSettings) {
var sData = sheetSettings.getDataRange().getValues();
for (var j = 1; j < sData.length; j++) {
if (sData[j][0]) {
settings[sData[j][0]] = sData[j][1];
}
}
}
// 3. Log Pengunjung & Wilayah (Log_Pengunjung)
var sheetVisitors = ss.getSheetByName("Log_Pengunjung");
var dataVisitors = sheetVisitors.getDataRange().getValues();
var totalVisitors = Math.max(0, dataVisitors.length - 1);
var dailyLogs = {};
var regions = {};
for (var k = 1; k < dataVisitors.length; k++) {
var row = dataVisitors[k];
if (row[0]) {
var dateObj = new Date(row[0]);
if (!isNaN(dateObj.getTime())) {
var dateKey = Utilities.formatDate(dateObj, Session.getScriptTimeZone(), "yyyy-MM-dd");
if (!dailyLogs[dateKey]) dailyLogs[dateKey] = { visitors: 0, clicks: 0 };
dailyLogs[dateKey].visitors += 1;
}
}
var regName = row[2] ? row[2].toString().trim() : "Kab. Sinjai";
if (regName) {
regions[regName] = (regions[regName] || 0) + 1;
}
}
// 4. Log Klik (Log_Klik) untuk Tren Aktivitas
var sheetClicks = ss.getSheetByName("Log_Klik");
var dataClicks = sheetClicks.getDataRange().getValues();
for (var m = 1; m < dataClicks.length; m++) {
var cRow = dataClicks[m];
if (cRow[0]) {
var cDateObj = new Date(cRow[0]);
if (!isNaN(cDateObj.getTime())) {
var cDateKey = Utilities.formatDate(cDateObj, Session.getScriptTimeZone(), "yyyy-MM-dd");
if (!dailyLogs[cDateKey]) dailyLogs[cDateKey] = { visitors: 0, clicks: 0 };
dailyLogs[cDateKey].clicks += 1;
}
}
}
var result = {
status: "success",
links: links,
settings: settings,
totalVisitors: totalVisitors,
dailyLogs: dailyLogs,
regions: regions
};
return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() })).setMimeType(ContentService.MimeType.JSON);
}
}
function doPost(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ensureSheetsExist(ss);
var data = {};
if (e && e.postData && e.postData.contents) {
data = JSON.parse(e.postData.contents);
}
var action = data.action || data.event_type;
if (action === "log_visitor") {
ss.getSheetByName("Log_Pengunjung").appendRow([new Date(), data.ip || "127.0.0.1", data.location || "Sinjai", data.device || "Mobile"]);
}
else if (action === "log_click") {
ss.getSheetByName("Log_Klik").appendRow([new Date(), data.link_id, data.link_title, data.location || "Sinjai"]);
incrementClickCount(ss, data.link_id);
}
else if (action === "save_link") {
saveOrUpdateLink(ss, data.link);
}
else if (action === "delete_link") {
deleteLink(ss, data.link_id);
}
else if (action === "save_settings") {
saveSettings(ss, data.settings);
}
return ContentService.createTextOutput(JSON.stringify({ status: "success" })).setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() })).setMimeType(ContentService.MimeType.JSON);
}
}
function ensureSheetsExist(ss) {
if (!ss.getSheetByName("Master_Tautan")) {
var s1 = ss.insertSheet("Master_Tautan");
s1.appendRow(["ID", "Judul", "URL_Tautan", "Kategori", "Tipe_Materi", "Ikon", "Jumlah_Klik", "Status_Aktif", "Logo_URL"]);
}
if (!ss.getSheetByName("Log_Pengunjung")) {
ss.insertSheet("Log_Pengunjung").appendRow(["Waktu", "IP_Address", "Kota_Wilayah", "Perangkat"]);
}
if (!ss.getSheetByName("Log_Klik")) {
ss.insertSheet("Log_Klik").appendRow(["Waktu", "ID_Tautan", "Judul_Materi", "Lokasi_Pengunjung"]);
}
if (!ss.getSheetByName("Pengaturan")) {
ss.insertSheet("Pengaturan").appendRow(["Kunci", "Nilai"]);
}
}
function incrementClickCount(ss, linkId) {
var sheet = ss.getSheetByName("Master_Tautan");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] == linkId) {
var currentVal = parseInt(data[i][6] || 0);
sheet.getRange(i + 1, 7).setValue(currentVal + 1);
break;
}
}
}
function saveOrUpdateLink(ss, link) {
if (!link) return;
var sheet = ss.getSheetByName("Master_Tautan");
var data = sheet.getDataRange().getValues();
var found = false;
for (var i = 1; i < data.length; i++) {
if (data[i][0] == link.id) {
sheet.getRange(i + 1, 2).setValue(link.title);
sheet.getRange(i + 1, 3).setValue(link.url);
sheet.getRange(i + 1, 4).setValue(link.category);
sheet.getRange(i + 1, 5).setValue(link.type || 'leaflet');
sheet.getRange(i + 1, 6).setValue(link.icon);
sheet.getRange(i + 1, 8).setValue(link.active);
found = true;
break;
}
}
if (!found) {
sheet.appendRow([link.id, link.title, link.url, link.category, link.type || 'leaflet', link.icon, link.clicks || 0, link.active, ""]);
}
}
function deleteLink(ss, linkId) {
var sheet = ss.getSheetByName("Master_Tautan");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] == linkId) {
sheet.deleteRow(i + 1);
break;
}
}
}
function saveSettings(ss, settings) {
if (!settings) return;
var sheetP = ss.getSheetByName("Pengaturan");
var dataP = sheetP.getDataRange().getValues();
for (var key in settings) {
var val = settings[key];
if (key === "logo") {
var sheetM = ss.getSheetByName("Master_Tautan");
if (sheetM.getLastRow() >= 2) {
sheetM.getRange(2, 9).setValue(val);
} else {
sheetM.appendRow(["", "", "", "", "", "", "", "", val]);
}
}
var found = false;
for (var i = 1; i < dataP.length; i++) {
if (dataP[i][0] == key) {
sheetP.getRange(i + 1, 2).setValue(val);
found = true;
break;
}
}
if (!found) {
sheetP.appendRow([key, val]);
dataP = sheetP.getDataRange().getValues();
}
}
}