Cara Menghitung Indeks Kepuasan Masyarakat (IKM) Otomatis dengan Google Apps Script
Setiap unit pelayanan publik, mulai dari kantor desa sampai puskesmas, wajib melakukan Survei Kepuasan Masyarakat (SKM) secara berkala. Masalahnya, banyak yang masih memakai kuesioner kertas lalu menghitung Indeks Kepuasan Masyarakat (IKM) manual di Excel: rawan salah rumus, salah interval mutu, dan makan waktu setiap akhir semester.
Di tutorial ini kita membuat perhitungan IKM otomatis dengan Google Apps Script, sesuai pola 9 unsur dan skala 1-4 pada PermenPANRB No. 14 Tahun 2017. Contohnya diambil dari aplikasi Survei Kepuasan Masyarakat (IKM) yang bisa kamu download gratis di Papicode (link di akhir artikel).
1. Struktur data: satu baris per responden
Simpan jawaban di sheet Responden dengan satu kolom untuk tiap unsur:
| ID | Waktu | Layanan | Usia | JK | Pendidikan | Pekerjaan | U1 | U2 | ... | U9 | Saran |
|---|---|---|---|---|---|---|---|---|---|---|---|
| R0001 | 2026-10-20 09:12 | Legalisasi Dokumen | 34 | Perempuan | D4/S1 | Wiraswasta | 4 | 3 | ... | 3 |
Nilai U1 sampai U9 selalu angka 1 sampai 4. Profil responden (usia, jenis kelamin, pendidikan, pekerjaan) dibutuhkan untuk bagian profil di laporan resmi.
Definisikan unsur dan label jawabannya di kode, supaya halaman survei dan perhitungan memakai sumber yang sama:
var UNSUR = [
{ kode: 'U1', nama: 'Persyaratan', opsi: ['Tidak sesuai', 'Kurang sesuai', 'Sesuai', 'Sangat sesuai'] },
{ kode: 'U2', nama: 'Prosedur', opsi: ['Tidak mudah', 'Kurang mudah', 'Mudah', 'Sangat mudah'] },
{ kode: 'U3', nama: 'Waktu pelayanan', opsi: ['Tidak cepat', 'Kurang cepat', 'Cepat', 'Sangat cepat'] },
// ... sampai U9 Sarana prasarana
];
2. Rumus NRR dan IKM
Ada tiga langkah:
- NRR per unsur = total nilai unsur tersebut / jumlah responden.
- NRR tertimbang = NRR x bobot. Karena ada 9 unsur dengan bobot sama, bobotnya 1/9 (sering ditulis 0,111).
- IKM = jumlah NRR tertimbang x 25. Hasilnya berada di rentang 25 sampai 100.
function hitung_(rows) {
var n = rows.length;
var unsur = UNSUR.map(function (u, i) {
var total = rows.reduce(function (a, r) { return a + r.nilai[i]; }, 0);
var nrr = n ? total / n : 0;
return { nama: u.nama, nrr: nrr, konversi: nrr * 25 };
});
var ikm = unsur.reduce(function (a, u) { return a + u.nrr / UNSUR.length; }, 0) * 25;
return { n: n, ikm: ikm, unsur: unsur };
}
Contoh cepat: jika semua responden memberi nilai 3 dan 4 sama banyak, setiap NRR = 3,5 sehingga IKM = 3,5 x 25 = 87,5.
Memakai 1/9 alih-alih 0,111 membuat nilai maksimal tepat 100. Dengan 0,111, nilai tertinggi hanya 99,9.
3. Konversi ke mutu pelayanan
Nilai konversi dipetakan ke huruf mutu dengan interval berikut:
| Nilai konversi | Mutu | Kinerja |
|---|---|---|
| 88,31 - 100,00 | A | Sangat Baik |
| 76,61 - 88,30 | B | Baik |
| 65,00 - 76,60 | C | Kurang Baik |
| 25,00 - 64,99 | D | Tidak Baik |
function mutu_(k) {
if (k >= 88.31) return { huruf: 'A', label: 'Sangat Baik' };
if (k >= 76.61) return { huruf: 'B', label: 'Baik' };
if (k >= 65) return { huruf: 'C', label: 'Kurang Baik' };
return { huruf: 'D', label: 'Tidak Baik' };
}
Pakai fungsi yang sama untuk IKM total dan untuk tiap unsur (NRR x 25). Dengan begitu kamu bisa melihat unsur mana yang mutunya masih C, lalu menjadikannya prioritas perbaikan.
4. Filter periode laporan
Laporan IKM biasanya dibuat per triwulan, semester, atau tahun. Simpan waktu sebagai teks yyyy-MM-dd HH:mm, lalu filter cukup dengan perbandingan string:
var rows = bacaRespon_().filter(function (r) {
return r.tanggal >= dari && r.tanggal <= sampai; // '2026-07-01' <= '2026-09-30'
});
var hasil = hitung_(rows);
Format yyyy-MM-dd berurutan secara alfabet sama dengan urutan waktu, jadi tidak perlu mengubahnya menjadi objek Date.
5. Cegah survei asal klik
Survei kepuasan rawan diisi asal-asalan, misalnya petugas mengisi sendiri puluhan kali. Beri setiap sesi token bertanda tangan yang memuat waktu mulai, lalu tolak survei yang selesai terlalu cepat atau token yang sudah dipakai:
function mulai() {
var isi = Date.now() + '.' + Utilities.getUuid().slice(0, 8);
return isi + '.' + tanda_(isi); // HMAC dengan rahasia di PropertiesService
}
function kirim(token, data) {
var b = token.split('.');
if (tanda_(b[0] + '.' + b[1]) !== b[2]) throw new Error('Sesi tidak valid.');
if (Date.now() - Number(b[0]) < 20000) throw new Error('Mohon baca setiap pertanyaan dengan saksama.');
var cache = CacheService.getScriptCache();
if (cache.get('pakai_' + b[1])) throw new Error('Survei ini sudah terkirim.');
cache.( + b[], , );
}
Tidak bisa menghentikan orang yang sengaja, tetapi cukup untuk menyaring isian otomatis dan klik beruntun.
Ringkasan
- Simpan satu baris per responden dengan kolom U1 sampai U9 bernilai 1-4.
- NRR = total / responden, IKM = jumlah NRR x 1/9 x 25.
- Petakan nilai konversi ke mutu A/B/C/D, untuk total maupun per unsur.
- Filter periode dengan perbandingan teks
yyyy-MM-dd. - Pakai token bertanda tangan dengan waktu mulai agar survei tidak diisi asal klik.
Download source code lengkapnya
Semua teknik di atas dipakai di Survei Kepuasan Masyarakat / IKM (Google Apps Script): halaman survei yang nyaman diisi dari HP atau tablet kiosk, dashboard IKM dengan tren 12 bulan, nilai per unsur dan per layanan, profil responden, saran, serta laporan A4 siap cetak lengkap dengan kop dan tanda tangan. Gratis dan tanpa hosting.
Source code lengkapnya gratis
Lihat semua yang dibahas di artikel ini langsung berjalan.