Sabtu, 22 Agustus 2026

Membuat Dashboard



 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

  1. Upload Double_Track_Database_Master.xlsx ke Google Drive.

  2. Buka dengan Google Sheets.

  3. Salin Spreadsheet ID dari URL.

  4. Buat Apps Script: Extensions → Apps Script.

  5. Tempel isi Code.gs.

  6. Isi CONFIG.SPREADSHEET_ID.

  7. Deploy → New deployment → Web app.

  8. Gunakan URL Web App sebagai API.

Endpoint

  • GET ?action=health

  • GET ?action=list&table=ms_sekolah

  • GET ?action=list&table=ms_siswa&limit=100

  • GET ?action=list&table=ms_kus&search=kuliner

  • GET ?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:

indikatornilaitargetpersentase
Siswa Dilatih0100000%
Sekolah01000%
Student Company/KUS01000%
Produk05000%
Transaksi010000%
Mentoring Sessions05000%
Business Plans01000%
Pitch Presentations01000%
Omzet0--

Contoh:

Siswa Dilatih
      ↓
  7.532
      ↓
Target 10.000
      ↓
75,32%

D. Struktur VIEW_OUTCOME

Buat:

VIEW_OUTCOME

indikatorskor_preskor_postperubahanpersentase_meningkat
Entrepreneurial Mindset3,14,21,187%
Kompetensi Bisnis3,04,11,186%
Financial Literacy3,24,31,183%
Work Readiness3,34,20,984%

Ini yang nantinya digunakan untuk membuat grafik:

Pre vs Post


E. Struktur VIEW_IMPACT

Buat:

VIEW_IMPACT

indikatornilaisatuan
Wirausaha Baru650usaha
Lapangan Kerja Tercipta1.200orang
Omzet Alumni12.800.000.000IDR
Industri Terhubung150IDUKA/UMKM
Sekolah–Industri85kolaborasi

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.

Membuat Dashboard

https://sites.google.com/d/1KWOvNMoV5gFcgtQKo5Vs8jVBDPwqVGu1/p/1XHmMKdBCx_qdFLULw7gecb-aseZ7eFyd/edit https://docs.google.com/spreadsheets/d...