https://chatgpt.com/c/6a8a50b5-3c0c-83ec-8153-b31b4807fee9
Double Track Database Master
Arsitektur
Google Sheets (Database Master)
→ Google Apps Script (REST API)
→ Dashboard/Monev
→ Looker Studio
Instalasi
Upload
Double_Track_Database_Master.xlsxke Google Drive.Buka dengan Google Sheets.
Salin Spreadsheet ID dari URL.
Buat Apps Script: Extensions → Apps Script.
Tempel isi
Code.gs.Isi
CONFIG.SPREADSHEET_ID.Deploy → New deployment → Web app.
Gunakan URL Web App sebagai API.
Endpoint
GET ?action=healthGET ?action=list&table=ms_sekolahGET ?action=list&table=ms_siswa&limit=100GET ?action=list&table=ms_kus&search=kulinerGET ?action=get&table=ms_siswa&id=SIS-000001
POST JSON:
{
"action": "create",
"table": "ms_sekolah",
"data": {
"id_sekolah": "SCH-0001",
"npsn": "20500001",
"nama_sekolah": "SMA Contoh",
"kabupaten_kota": "Surabaya",
"is_aktif": true
}
}Looker Studio
Gunakan VIEW_OUTPUT, VIEW_OUTCOME, dan VIEW_IMPACT sebagai sumber reporting.
Untuk produksi, disarankan membuat satu spreadsheet khusus REPORTING yang berisi tabel agregasi hasil query dari database master.
Endpoint tersebut bekerja setelah Google Apps Script dideploy sebagai Web App. Polanya:
Google Sheets ↓ Google Apps Script ↓ Web App URL ↓ GET Request ↓ JSON Response
1. Buka Google Sheets
Upload file:
Kemudian buka dengan Google Sheets.
Pastikan sheet seperti:
ms_sekolah ms_periode ms_rombel ms_siswa ms_kus ms_mentor ...
sudah tersedia.
2. Buat Google Apps Script
Di Google Sheets:
Extensions → Apps Script
Hapus kode bawaan, kemudian gunakan Code.gs yang sudah saya buat:
Pada bagian:
const CONFIG = { SPREADSHEET_ID: '',
isi dengan ID Google Spreadsheet.
Misalnya URL Google Sheets:
https://docs.google.com/spreadsheets/d/1ABCxyz123456789/edit
maka:
SPREADSHEET_ID: '1ABCxyz123456789'
3. Deploy sebagai Web App
Di Apps Script:
Deploy → New deployment
Pilih:
Select type ↓ Web app
Kemudian:
Execute as: Me Who has access: Anyone with the link
Lalu klik:
Deploy
Google akan memberikan URL seperti:
https://script.google.com/macros/s/AKfycbxxxxxxxxxxxxxxxx/exec
URL /exec inilah API Base URL Anda.
4. Test endpoint Health
Misalnya URL Anda:
https://script.google.com/macros/s/AKfycb123456/exec
tambahkan:
?action=health
Sehingga:
https://script.google.com/macros/s/AKfycb123456/exec?action=health
Buka URL tersebut di browser.
Response:
{ "ok": true, "service": "double-track-api", "time": "..." }
Kalau muncul seperti itu berarti API sudah hidup.
5. Endpoint list
Mengambil semua sekolah
Gunakan:
?action=list&table=ms_sekolah
Full URL:
https://script.google.com/macros/s/AKfycb123456/exec?action=list&table=ms_sekolah
Response kira-kira:
{ "ok": true, "table": "ms_sekolah", "total": 2, "data": [ { "id_sekolah": "SCH-0001", "npsn": "20500001", "nama_sekolah": "SMA Negeri 1 Surabaya", "alamat": "Surabaya", "kabupaten_kota": "Surabaya", "is_aktif": true }, { "id_sekolah": "SCH-0002", "npsn": "20500002", "nama_sekolah": "SMA Negeri 2 Surabaya", "alamat": "Surabaya", "kabupaten_kota": "Surabaya", "is_aktif": true } ] }
6. Mengambil siswa
Gunakan:
?action=list&table=ms_siswa&limit=100
Full:
https://script.google.com/macros/s/AKfycb123456/exec?action=list&table=ms_siswa&limit=100
Artinya:
action = list table = ms_siswa limit = 100
Response:
{ "ok": true, "table": "ms_siswa", "total": 25, "data": [ { "id_siswa": "SIS-000001", "id_sekolah": "SCH-0001", "nisn": "0012345678", "nama_lengkap": "Ahmad", "jenis_kelamin": "L", "tahun_masuk": 2025 } ] }
7. Search data
Contohnya mencari KUS yang berkaitan dengan kuliner:
?action=list&table=ms_kus&search=kuliner
Full:
https://script.google.com/macros/s/AKfycb123456/exec?action=list&table=ms_kus&search=kuliner
Apps Script akan mencari kata:
kuliner
di seluruh data KUS.
Misalnya:
{ "ok": true, "table": "ms_kus", "total": 3, "data": [ { "id_kus": "KUS-0001", "nama_kus": "KUS Boga Kreatif", "kategori_bisnis": "Kuliner" }, { "id_kus": "KUS-0007", "nama_kus": "Kuliner Siswa Mandiri", "kategori_bisnis": "Kuliner" } ] }
8. Mengambil satu siswa
Misalnya ingin mengambil:
SIS-000001
gunakan:
?action=get&table=ms_siswa&id=SIS-000001
Full:
https://script.google.com/macros/s/AKfycb123456/exec?action=get&table=ms_siswa&id=SIS-000001
Response:
{ "ok": true, "table": "ms_siswa", "data": { "id_siswa": "SIS-000001", "id_sekolah": "SCH-0001", "nisn": "0012345678", "nama_lengkap": "Ahmad", "jenis_kelamin": "L", "tahun_masuk": 2025 } }
9. Bisa dipanggil dari JavaScript
Ini yang membuat database Google Sheets bisa menjadi backend aplikasi.
Contoh:
const API_URL = "https://script.google.com/macros/s/AKfycb123456/exec"; async function getSekolah() { const url = `${API_URL}?action=list&table=ms_sekolah`; const response = await fetch(url); const result = await response.json(); console.log(result); return result.data; }
Kemudian:
const sekolah = await getSekolah(); sekolah.forEach(item => { console.log(item.nama_sekolah); });
10. Dipakai untuk Dashboard
Ini yang menjadi menarik untuk sistem Double Track Monev.
Dashboard tidak perlu membaca seluruh database secara manual.
Misalnya kartu:
TOTAL SEKOLAH
fetch(`${API_URL}?action=list&table=ms_sekolah`)
Kemudian:
document.getElementById("totalSekolah") .textContent = result.total;
TOTAL SISWA
fetch(`${API_URL}?action=list&table=ms_siswa`)
TOTAL KUS
fetch(`${API_URL}?action=list&table=ms_kus`)
TOTAL PRODUK
fetch(`${API_URL}?action=list&table=ms_produk`)
TOTAL TRANSAKSI
fetch(`${API_URL}?action=list&table=tr_penjualan`)
Sehingga dashboard bisa membentuk:
┌──────────────────────────────────────────────┐ │ DOUBLE TRACK ENTREPRENEURSHIP │ │ MONEV DASHBOARD │ ├──────────┬──────────┬──────────┬─────────────┤ │ SEKOLAH │ SISWA │ KUS │ PRODUK │ │ 100 │ 10.000 │ 100 │ 500 │ ├──────────┼──────────┼──────────┼─────────────┤ │ TRANSAKSI│ OMZET │ MENTOR │ BUSINESS │ │ 1.000 │ Rp ... │ 500 │ PLAN │ ├──────────┴──────────┴──────────┴─────────────┤ │ OUTCOME │ │ Entrepreneurial Mindset ↑ 87% │ │ Business Skills ↑ 86% │ │ Financial Literacy ↑ 83% │ │ Work Readiness ↑ 84% │ ├──────────────────────────────────────────────┤ │ IMPACT │ │ Young Entrepreneur • Job • Revenue │ └──────────────────────────────────────────────┘
11. Untuk Looker Studio
Untuk Looker Studio, saya justru menyarankan jangan langsung menggunakan endpoint mentah seperti:
?action=list&table=ms_siswa
Lebih baik arsitekturnya:
GOOGLE SHEETS │ DATABASE MASTER │ ┌───────────────┼────────────────┐ ↓ ↓ ↓ MASTER TRANSAKSI SURVEY │ │ │ └───────────────┼────────────────┘ ↓ GOOGLE APPS SCRIPT │ DATA AGGREGATION ↓ REPORTING SHEETS │ ┌────────────┼────────────┐ ↓ ↓ ↓ VIEW_OUTPUT VIEW_OUTCOME VIEW_IMPACT │ │ │ └────────────┼────────────┘ ↓ LOOKER STUDIO
Jadi:
Google Sheets = database
Apps Script = API + business logic
VIEW = reporting layer
Looker Studio = visualization
12. Endpoint yang nantinya ideal
Untuk sistem Monev yang lebih matang, saya sarankan endpoint dikembangkan menjadi:
GET /health GET /sekolah GET /siswa GET /kus GET /mentor GET /produk GET /transaksi GET /dashboard/output GET /dashboard/outcome GET /dashboard/impact GET /dashboard/kabupaten GET /dashboard/sekolah GET /dashboard/periode POST /sekolah POST /siswa POST /kus POST /produk POST /transaksi POST /mentoring POST /survey
Sehingga akhirnya sistem bukan hanya database Google Sheets, tetapi menjadi Monev Platform Double Track:
DOUBLE TRACK MONEV PLATFORM │ ┌────────────────┼────────────────┐ ↓ ↓ ↓ DATA INPUT API ENGINE DASHBOARD │ │ │ Sekolah CRUD Output Siswa Validasi Outcome KUS Reporting Impact Produk Security KPI Sales Survey │ │ │ └────────────────┼────────────────┘ ↓ LOOKER STUDIO ↓ PIMPINAN / DINAS / ITS
Catatan: endpoint pada Code.gs yang saya buat sebelumnya masih merupakan versi starter. Untuk implementasi produksi, sebaiknya ditambah validasi FK, pagination, filter periode/sekolah/kabupaten, autentikasi, audit log, agregasi KPI, dan endpoint khusus dashboard agar aman dan tidak membebani Google Sheets.
Bagaimana langkah-langkah membuatnya. Looker Studio
Gunakan VIEW_OUTPUT, VIEW_OUTCOME, dan VIEW_IMPACT sebagai sumber reporting.
Untuk produksi, disarankan membuat satu spreadsheet khusus REPORTING yang berisi tabel agregasi hasil query dari database master. url web API : https://script.google.com/macros/s/AKfycbww4Uuf5SgFFZJ0GdDXJCZTrsaIWe-x_NqdZ6vkhQvZ0b1HVBWGGMuEMFjjQW5QkkVt/exec
Bisa. Dengan Web API Anda yang sudah aktif, saya sarankan arsitektur produksinya dibuat seperti ini:
DATABASE MASTER Google Sheets │ │ data ▼ Google Apps Script REST API │ │ agregasi / sinkronisasi ▼ REPORTING SHEET │ ├── VIEW_OUTPUT ├── VIEW_OUTCOME └── VIEW_IMPACT │ ▼ LOOKER STUDIO │ ▼ DASHBOARD MONEV
Untuk Looker Studio, jalur yang paling sederhana dan stabil adalah Looker Studio membaca Google Sheets REPORTING, bukan membaca endpoint JSON secara langsung. Looker Studio memang menyediakan konektor Google Sheets untuk menambahkan spreadsheet sebagai sumber data.
Berikut langkah lengkapnya.
A. Pastikan API Anda aktif
API Anda:
Double Track Web API
Coba buka:
?action=health
Sehingga menjadi:
https://script.google.com/macros/s/AKfycbww4Uuf5SgFFZJ0GdDXJCZTrsaIWe-x_NqdZ6vkhQvZ0b1HVBWGGMuEMFjjQW5QkkVt/exec?action=health
Jika berhasil, seharusnya muncul:
{ "ok": true, "service": "double-track-api" }
Kemudian coba:
?action=list&table=ms_sekolah
dan:
?action=list&table=ms_kus
Pastikan ini berhasil terlebih dahulu sebelum membuat Looker Studio.
B. Buat Spreadsheet khusus REPORTING
Saya sangat menyarankan jangan menggunakan spreadsheet Database Master langsung sebagai sumber Looker Studio.
Buat Google Spreadsheet baru:
DOUBLE TRACK – REPORTING
Struktur sheet:
DOUBLE TRACK – REPORTING │ ├── CONFIG │ ├── VIEW_OUTPUT ├── VIEW_OUTCOME ├── VIEW_IMPACT │ ├── RPT_SEKOLAH ├── RPT_KABUPATEN ├── RPT_KUS ├── RPT_PRODUK ├── RPT_TRANSAKSI ├── RPT_MENTORING └── RPT_ALUMNI
Dengan demikian:
Database Master = operational database
sedangkan:
REPORTING = analytical database
Ini jauh lebih baik untuk Monev.
C. Struktur VIEW_OUTPUT
Buat sheet:
VIEW_OUTPUT
Header:
| indikator | nilai | target | persentase |
|---|---|---|---|
| Siswa Dilatih | 0 | 10000 | 0% |
| Sekolah | 0 | 100 | 0% |
| Student Company/KUS | 0 | 100 | 0% |
| Produk | 0 | 500 | 0% |
| Transaksi | 0 | 1000 | 0% |
| Mentoring Sessions | 0 | 500 | 0% |
| Business Plans | 0 | 100 | 0% |
| Pitch Presentations | 0 | 100 | 0% |
| Omzet | 0 | - | - |
Contoh:
Siswa Dilatih ↓ 7.532 ↓ Target 10.000 ↓ 75,32%
D. Struktur VIEW_OUTCOME
Buat:
VIEW_OUTCOME
| indikator | skor_pre | skor_post | perubahan | persentase_meningkat |
|---|---|---|---|---|
| Entrepreneurial Mindset | 3,1 | 4,2 | 1,1 | 87% |
| Kompetensi Bisnis | 3,0 | 4,1 | 1,1 | 86% |
| Financial Literacy | 3,2 | 4,3 | 1,1 | 83% |
| Work Readiness | 3,3 | 4,2 | 0,9 | 84% |
Ini yang nantinya digunakan untuk membuat grafik:
Pre vs Post
E. Struktur VIEW_IMPACT
Buat:
VIEW_IMPACT
| indikator | nilai | satuan |
|---|---|---|
| Wirausaha Baru | 650 | usaha |
| Lapangan Kerja Tercipta | 1.200 | orang |
| Omzet Alumni | 12.800.000.000 | IDR |
| Industri Terhubung | 150 | IDUKA/UMKM |
| Sekolah–Industri | 85 | kolaborasi |
Dengan demikian Looker Studio tidak perlu menghitung data mentah yang kompleks.
F. Cara mengisi REPORTING dari API
Di Google Apps Script, kita dapat membuat fungsi sinkronisasi.
Misalnya API Anda disimpan:
const API_URL = 'https://script.google.com/macros/s/AKfycbww4Uuf5SgFFZJ0GdDXJCZTrsaIWe-x_NqdZ6vkhQvZ0b1HVBWGGMuEMFjjQW5QkkVt/exec';
Kemudian:
function getAPI_(action, table) { const url = API_URL + '?action=' + encodeURIComponent(action) + '&table=' + encodeURIComponent(table); const response = UrlFetchApp.fetch(url); return JSON.parse(response.getContentText()); }
UrlFetchApp memang digunakan Apps Script untuk melakukan HTTP request ke URL eksternal.
G. Ambil data sekolah
function syncSekolah() { const result = getAPI_('list', 'ms_sekolah'); const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getSheetByName('RPT_SEKOLAH'); sh.clearContents(); const data = result.data; if (!data || data.length === 0) return; const headers = Object.keys(data[0]); sh.getRange(1, 1, 1, headers.length) .setValues([headers]); const rows = data.map(item => headers.map(h => item[h]) ); sh.getRange( 2, 1, rows.length, headers.length ).setValues(rows); }
Sekarang:
API ↓ ms_sekolah ↓ RPT_SEKOLAH
H. Ambil data KUS
function syncKUS() { const result = getAPI_('list', 'ms_kus'); const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getSheetByName('RPT_KUS'); sh.clearContents(); if (!result.data?.length) return; const headers = Object.keys(result.data[0]); sh.getRange(1,1,1,headers.length) .setValues([headers]); const rows = result.data.map(item => headers.map(h => item[h]) ); sh.getRange( 2,1,rows.length,headers.length ).setValues(rows); }
I. Lebih baik: buat satu fungsi sinkronisasi
Daripada menjalankan satu per satu:
function syncAllReporting() { syncSekolah(); syncKUS(); // berikutnya: // syncSiswa(); // syncProduk(); // syncTransaksi(); // syncMentoring(); // syncOutcome(); // syncImpact(); }
Kemudian bisa dibuat trigger otomatis.
Misalnya:
Setiap 1 jam ↓ syncAllReporting() ↓ REPORTING diperbarui ↓ Looker Studio membaca data terbaru
J. Buat dashboard di Looker Studio
Sekarang buka Looker Studio.
Pilih:
Create → Report
Google menjelaskan alur dasarnya: buat report, pilih Add data, pilih connector, lalu tambahkan data source.
Pilih:
Google Sheets
Kemudian pilih:
DOUBLE TRACK – REPORTING
K. Tambahkan VIEW_OUTPUT
Pilih sheet:
VIEW_OUTPUT
Klik:
Add
Sekarang Looker Studio mempunyai data source:
DS_OUTPUT
L. Tambahkan VIEW_OUTCOME
Klik:
Resource → Manage added data sources → Add a data source
Pilih:
Google Sheets
Kemudian:
DOUBLE TRACK – REPORTING ↓ VIEW_OUTCOME
Beri nama:
DS_OUTCOME
M. Tambahkan VIEW_IMPACT
Lakukan hal yang sama:
DOUBLE TRACK – REPORTING ↓ VIEW_IMPACT
Beri nama:
DS_IMPACT
Sekarang Looker Studio memiliki:
DS_OUTPUT DS_OUTCOME DS_IMPACT
N. Buat Dashboard Halaman 1 — EXECUTIVE SUMMARY
Saya menyarankan dashboard pertama seperti ini:
┌─────────────────────────────────────────────────────┐ │ DOUBLE TRACK ENTREPRENEURSHIP PROGRAM │ │ DASHBOARD MONITORING & EVALUATION │ ├──────────┬──────────┬──────────┬────────────────────┤ │ SEKOLAH │ SISWA │ KUS │ PRODUK │ │ 100 │ 10.000 │ 100 │ 500 │ ├──────────┼──────────┼──────────┼────────────────────┤ │ TRANSAKSI│ OMZET │ MENTOR │ BUSINESS PLAN │ │ 1.000 │ Rp ... │ 500 │ 100 │ ├─────────────────────────────────────────────────────┤ │ OUTPUT │ │ │ │ Target vs Realisasi │ │ ████████████████████ Siswa │ │ █████████████████ KUS │ │ ███████████████ Produk │ ├─────────────────────────────────────────────────────┤ │ OUTCOME │ │ │ │ Mindset █████████████████ 87% │ │ Business █████████████████ 86% │ │ Financial ███████████████ 83% │ │ Work Ready ████████████████ 84% │ ├─────────────────────────────────────────────────────┤ │ IMPACT │ │ │ │ Wirausaha Baru │ Job Created │ Omzet Alumni │ │ 650 │ 1.200 │ Rp12,8 M │ └─────────────────────────────────────────────────────┘
O. Buat Scorecard
Di Looker Studio:
Add a chart → Scorecard
Untuk:
Total Sekolah
Data:
DS_OUTPUT
Dimension:
indikator
Metric:
nilai
Filter:
indikator = Sekolah
Kemudian ulangi untuk:
- Siswa
- KUS
- Produk
- Transaksi
- Mentoring
- Business Plan
- Pitching
P. Buat grafik Output
Gunakan:
Bar Chart
Dimension:
indikator
Metric:
nilai
Tambahkan target sebagai metric kedua:
nilai target
Hasil:
Siswa Realisasi ███████████████ 7.532 Target ████████████████████ 10.000 KUS Realisasi █████████████████ 85 Target ████████████████████ 100
Q. Buat grafik Outcome
Untuk outcome saya menyarankan bar chart Pre vs Post.
Dimension:
indikator
Metric:
skor_pre skor_post
Hasil:
PRE POST Mindset ███ ████ Bisnis ███ ████ Financial ███ ████ Work Readiness ███ ████
Ini jauh lebih informatif daripada hanya menampilkan angka persentase.
R. Buat filter Kabupaten/Kota
Ini sangat penting untuk dashboard Dinas Pendidikan.
Tambahkan pada database reporting:
kabupaten_kota
Kemudian di Looker Studio:
Add a control → Drop-down list
Dimension:
kabupaten_kota
Sehingga pimpinan dapat memilih:
Semua Surabaya Sidoarjo Malang Ngawi Madiun ...
Dashboard kemudian berubah otomatis.
S. Buat filter Periode
Tambahkan:
nama_periode
Misalnya:
2025 2026 2027 2028
Kemudian:
Add a control → Drop-down list
Dimension:
nama_periode
Maka dashboard dapat digunakan lintas tahun.
T. Struktur dashboard yang saya sarankan
Untuk sistem Monev Double Track, saya justru akan membuat 5 halaman:
PAGE 01 — EXECUTIVE SUMMARY
KPI Output Outcome Impact
PAGE 02 — OUTPUT
Sekolah Siswa KUS Produk Mentor Business Plan Pitching Transaksi Omzet
PAGE 03 — OUTCOME
Entrepreneurial Mindset Business Skills Financial Literacy Work Readiness Leadership Problem Solving Business Confidence Career Readiness
PAGE 04 — BUSINESS PERFORMANCE
KUS Produk Customer Transaksi Revenue Omzet Kategori bisnis Marketplace
PAGE 05 — IMPACT
Wirausaha Baru Lapangan Kerja Omzet Alumni Economic Opportunity School–Industry Collaboration Ekosistem
U. Yang paling penting: jangan hanya dashboard angka
Saya menyarankan dashboard akhirnya mengikuti Theory of Change:
INPUT │ ▼ ACTIVITIES │ ▼ OUTPUT │ ▼ OUTCOME │ ▼ IMPACT
Dalam konteks Double Track:
SKILL ↓ PRODUCT ↓ KUS ↓ MARKETPLACE ↓ CUSTOMER ↓ REVENUE ↓ JOB / CAREER ↓ ECONOMIC IMPACT
Jadi pimpinan tidak hanya bisa melihat:
“Berapa siswa yang dilatih?”
tetapi dapat menjawab:
“Apa yang terjadi setelah siswa dilatih?”
dan akhirnya:
“Apakah program menghasilkan perubahan ekonomi dan peluang karier?”
Rekomendasi untuk sistem Anda
Dengan API yang sudah Anda berikan, tahap berikutnya sebaiknya bukan langsung mendesain Looker Studio. Kita sebaiknya membuat terlebih dahulu REPORTING Google Spreadsheet + Apps Script syncAllReporting() yang secara otomatis mengambil data dari API Anda dan menghasilkan:
REPORTING │ ├── RPT_SEKOLAH ├── RPT_SISWA ├── RPT_KUS ├── RPT_PRODUK ├── RPT_TRANSAKSI ├── RPT_MENTORING ├── VIEW_OUTPUT ├── VIEW_OUTCOME └── VIEW_IMPACT
Setelah itu baru Looker Studio tinggal membaca sheet tersebut. Ini lebih mudah dipelihara dan lebih cocok untuk skala Dinas Pendidikan Jawa Timur + ITS daripada menjadikan endpoint mentah sebagai sumber dashboard.
Google juga mendokumentasikan bahwa report Looker Studio dapat menggunakan beberapa data source, sehingga pemisahan OUTPUT, OUTCOME, dan IMPACT seperti ini cocok untuk arsitektur reporting.





Tidak ada komentar:
Posting Komentar