Ikut urutan sesi. Salin satu prompt sahaja dan klik ikon Hantar / Send. Baca jawapan, buat tindakan dan semak hasil sebelum meneruskan.
Jika prompt menyebut “tunggu saya tampal”, hantar prompt dahulu; selepas Gemini bersedia, tampal artikel, jadual atau kod yang dinyatakan sebagai mesej seterusnya. Jangan tampal label arahan sebagai data.
Gunakan satu chat Gemini untuk pemahaman dan pembinaan sistem; satu notebook untuk artikel dan snapshot yang disemak. Jika chat baharu diperlukan, tampal semula kontrak data P12.
Untuk laluan wajib beginner, pasang kod rujukan yang disediakan. Prompt membantu memahami dan menyesuaikan kod; jangan bergantung pada aplikasi yang dijana berbeza-beza tanpa ujian.
Setiap peserta mempunyai projek sendiri. Tiada Gemini API, API key, hosting berbayar atau library carta luar diperlukan.
Data dashboard ialah SIMULASI. Artikel ialah sumber kajian sebenar yang berasingan. Jangan menyatakan angka latihan sebagai pencapaian sebenar negeri atau KKM.
Setiap hari: minum pagi 10.15–10.30; makan tengah hari 12.30–2.00; minum petang 3.15–3.30. Sesi tamat 4.30 petang.
Checkpoint dan catatan disimpan dalam browser peranti ini sahaja. Tiada pendaftaran atau rekod kehadiran dikumpulkan oleh laman ini.
KONSEP & PEMBENTANGAN
Empat bab. Satu aliran kerja.
Fasilitator boleh gunakan Mod bentang untuk teks lebih besar. Peserta boleh ulang baca pada bila-bila masa.
01 · Research & evidence
Mulakan dengan soalan yang boleh dijawab.
Carian yang baik bermula sebelum kita membuka AI. Tentukan siapa, apa yang ingin diketahui dan bukti yang diperlukan.
01
Research, review dan pemantauan
Research mengumpul atau menganalisis data untuk menjawab soalan. Evidence review menyusun dapatan kajian sedia ada. Pemantauan menjejak indikator program dari semasa ke semasa.
Soalan bukti
Apakah faktor yang berkaitan dengan penyertaan saringan serviks?
Soalan dashboard
Bagaimanakah pencapaian sasaran latihan berbeza mengikut negeri dan bulan?
Artikel tidak menjadi sumber angka dashboard. Dashboard menggunakan DATA SIMULASI yang berasingan.
02
PICO: apabila menilai intervensi
P = Population · I = Intervention · C = Comparison · O = Outcome. Gunakan apabila soalan membandingkan kesan intervensi.
PWanita dewasa yang layak
IPeringatan saringan
CPenjagaan biasa
OPenyertaan saringan dalam tempoh ditetapkan
Contoh soalan: Dalam populasi ini, adakah peringatan berbanding penjagaan biasa meningkatkan penyertaan saringan? Ini contoh soalan; keberkesanannya belum diputuskan.
Asta mencari calon artikel; skor relevan membantu menyusun calon.
Manusia memutuskan inclusion dengan membaca abstrak / teks penuh.
NotebookLM membantu mengekstrak sumber yang dipilih; citation mesti dibuka dan disemak.
Hasil bengkel ialah latihan mini evidence review. Ia belum systematic review lengkap yang memerlukan protokol, strategi carian menyeluruh, appraisal dan pelaporan yang sesuai.
Landing page menjadi pintu masuk. Borang menerima input. Google Sheets menyimpan rekod. Dashboard membaca dan merumuskan data.
01
Bagaimana sistem ini bersambung?
Semua paparan peserta berada dalam satu Apps Script Web App.
Landing page→Borang→Google Sheets→Dashboard
Frontend: paparan yang pengguna lihat dalam Index.html. Backend: Code.gs membaca dan menyimpan data. Deployment: versi aplikasi pada URL /exec yang boleh dibuka.
Kod rujukan tidak memerlukan Gemini API, API key atau library carta luar.
02
Kontrak data: tetapkan sebelum membina
Satu baris = satu negeri + satu bulan. Gabungan ini mesti unik.
idmasanegeribulansasarandisaring
id dan masa dijana sistem. Bulan ialah YYYY-MM. Bilangan ialah untuk bulan berkenaan, bukan kumulatif tahunan. Sasaran mesti positif; disaring boleh sifar atau melebihi sasaran.
Bilangan saringan tidak semestinya bilangan individu unik. Takrif unit perlu jelas.
03
KPI: nisbah jumlah, bukan purata peratus
Pencapaian sasaran = jumlah disaring ÷ jumlah sasaran × 100.
660 ÷ 900 × 100 = 73.33%Baseline enam rekod · DATA SIMULASI
Selepas rekod Melaka latihan ditambah: 740 ÷ 1000 × 100 = 74.00%. Ini pencapaian sasaran latihan, bukan liputan populasi.
Tiada rekod → paparkan “—” untuk peratus. Tiada data berbeza daripada pencapaian sifar.
04
Dashboard yang membantu keputusan
KPI untuk ringkasan, carta untuk perbandingan, jadual untuk semakan.
Negeri
Carta bar untuk membandingkan kumpulan.
Bulan
Carta trend untuk melihat perubahan mengikut masa.
Penapis
KPI, carta dan jadual mesti berubah bersama.
Uji simpan → semak Sheets → muat semula → semak KPI → penapis → pendua → kemas kini deployment. Save sahaja tidak mengemas kini versi /exec.
Daripada angka kepada mesej yang boleh dipertahankan.
Bercerita dengan data bermaksud memilih dapatan yang penting, menunjukkan bukti dan menyatakan batasnya dengan jelas.
01
Snapshot bukan sambungan langsung
Pilih penapis dashboard → salin ringkasan → semak angka → masukkan sebagai sumber Copied text dalam NotebookLM.
Simpan nama sumber, tarikh snapshot dan penapis yang digunakan. Snapshot tidak berubah apabila Google Sheets dikemas kini. Jika data berubah, ambil dan semak snapshot baharu.
Label sumber “DATA SIMULASI”. Pilih sumber artikel atau snapshot mengikut tugasan supaya angka daripada dua sumber tidak bercampur.
02
Fakta → makna → tindakan
Nyatakan apa yang dilihat, terangkan maksud yang disokong, kemudian cadangkan langkah seterusnya.
Fakta
Pencapaian sasaran latihan ialah 74.00% bagi snapshot semua rekod.
Makna
Bilangan disaring belum menyamai jumlah sasaran latihan dalam snapshot ini.
Tindakan
Semak mutu data dan kumpul maklumat tambahan sebelum menjelaskan punca.
Contoh naratif latihan sahaja; bukan dapatan prestasi BPKK atau negeri sebenar.
03
Jangan lompat daripada jurang kepada punca
Empat medan agregat tidak memberitahu sebab seseorang tidak hadir saringan.
Daripada “pencapaian rendah kerana kurang kesedaran”, gunakan: “Punca belum dapat ditentukan daripada data ini. Semakan lanjut diperlukan.”
Bukti artikel boleh membantu merangka soalan susulan. Ia tidak membuktikan punca corak dalam dashboard simulasi.
04
Pembentangan yang ringkas dan jelas
Satu mesej utama, angka yang sudah disemak dan satu tindakan yang munasabah.
Nyatakan konteks dan DATA SIMULASI.
Pilih dapatan utama; tunjukkan angka dan skop snapshot.
Nyatakan limitasi dan maklumat yang masih diperlukan.
Akhiri dengan cadangan tindakan dan pihak yang perlu menyemak.
Slaid yang dijana AI tetap perlu disemak: angka, label, citation, perkataan dan naratif lisan.
Bina soalan, cari kajian dan semak satu artikel melalui sumber asal.
Konsep → demo fasilitator → buat bersama → cuba sendiri → semak0 sesi selesai
Rehat: 10.15–10.30 pagi · 12.30–2.00 petang · 3.15–3.30 petang.
018.30–9.00 pagiPengenalan dan semakan aksesTools: Gemini · P01+
Buka Gemini, Asta dan NotebookLM menggunakan akaun yang dibenarkan untuk latihan. Jangan gunakan data sebenar pesakit.
Buka satu chat Gemini baharu. Namakan sendiri nota kerja sebagai BPKK Latihan. Simpan hasil yang telah disemak dalam satu dokumen kerja.
Gunakan kes bersama: penyertaan saringan serviks untuk latihan carian bukti; Program Saringan Kesihatan X dengan data simulasi untuk latihan sistem. Data dashboard tidak datang daripada artikel.
P01 · Tetapkan cara Gemini membantu
Tampal dalam: Gemini
Saya peserta beginner bengkel BPKK. Bantu saya belajar menggunakan AI untuk carian bukti, data agregat simulasi dan pembinaan web app Google Apps Script.
Jawab dalam Bahasa Malaysia yang mudah. Berikan satu tugasan pada satu masa dan tunggu saya selesai. Bezakan langkah yang anda boleh cadangkan daripada perkara yang saya perlu klik sendiri. Jangan dakwa fail telah disimpan atau aplikasi telah diuji tanpa bukti.
Mulakan dengan menerangkan tiga kegunaan AI dalam kerja pemantauan program.
Checkpoint: Gemini memberikan penjelasan yang boleh difahami. Ketiga-tiga tools boleh dibuka; isu akses dimaklumkan sebelum sesi seterusnya.
029.00–10.15 pagiAsas Gemini dan teknik promptTools: Gemini · P02 / P03 / P04+
Fasilitator menerangkan konteks, tugasan dan format output. Peserta cuba P02, kemudian P03 dalam chat yang sama.
P02 sengaja umum untuk perbandingan sahaja. Jangan terima indikator atau formula tambahannya sebagai definisi yang disahkan. Gunakan konteks empat medan dalam P03, kemudian P04 untuk menyemak andaian.
P02 · Prompt umum untuk perbandingan
Tampal dalam: Gemini
Bantu saya menilai program saringan kesihatan.
P03 · Prompt dengan konteks
Tampal dalam: Gemini
Saya pegawai di HQ BPKK. Saya memantau Program Saringan Kesihatan X menggunakan data SIMULASI.
Data yang tersedia hanya negeri, bulan, sasaran latihan dan bilangan disaring bagi bulan tersebut.
Cadangkan 3 soalan pemantauan yang boleh dijawab dengan data ini.
Susun dalam jadual: soalan dan medan yang diperlukan. Jangan membuat analisis atau mengandaikan dapatan.
P04 · Semak andaian
Tampal dalam: Gemini
Semak jawapan anda tadi. Senaraikan andaian yang dibuat, perkara yang tidak boleh dijawab oleh data tersebut dan maklumat yang perlu saya sahkan. Jangan tambah fakta tentang prestasi sebenar BPKK.
Checkpoint: Peserta boleh menunjukkan bahagian konteks, tugasan dan format output. AI tidak boleh menentukan punca pencapaian berdasarkan empat medan sahaja.
Gunakan P05 untuk menetapkan soalan latihan, kemudian P06 untuk kata kunci.
Buka asta.allen.ai. Pilih Find papers. Tampal P07 dalam ruang pertanyaan dan hantar. Tunggu carian selesai; jumlah hasil setiap peserta mungkin berbeza.
Lihat View steps. Selepas carian pertama selesai, hantar P08 dalam thread Asta yang sama. Jangan gunakan Generate report untuk latihan pencarian ini.
Buka sekurang-kurangnya satu hasil melalui Show Evidence dan Abstract. Catat tajuk, tahun, pautan asal, reka bentuk dan status relevan/belum pasti.
P05 · Bina soalan PEO
Tampal dalam: Gemini
Untuk latihan mini evidence review, saya ingin mengkaji faktor yang berkaitan dengan penyertaan saringan serviks dalam kalangan wanita dewasa.
Bina satu soalan menggunakan kerangka PEO. Berikan satu objektif umum yang selaras.
Ini latihan metodologi, bukan systematic review lengkap atau nasihat klinikal.
Gunakan istilah “berkaitan” secara konsisten dalam soalan dan objektif. Jangan gunakan “mempengaruhi”, “menyebabkan” atau mendakwa keberkesanan intervensi.
P06 · Kata kunci carian
Tampal dalam: Gemini
Berdasarkan soalan PEO tadi, senaraikan kata kunci bahasa Inggeris dan sinonim untuk populasi, saringan serviks, penyertaan serta halangan atau faktor pemudah.
Susun mengikut konsep. Jangan cipta istilah MeSH atau rujukan artikel.
Carian seterusnya menggunakan Asta Find papers. Jangan cadangkan platform carian lain. Bezakan sinonim langsung daripada istilah yang lebih sempit atau lebih luas supaya skop wanita dewasa tidak berubah tanpa arahan.
P07 · Carian awal
Tampal dalam: Asta · Find papers
Find empirical studies on barriers and facilitators to cervical cancer screening participation among adult women in primary care or community settings. Required: studies about actual screening participation or uptake. Malaysia and Southeast Asia are preferred settings, but include relevant studies from other countries. Include qualitative and quantitative studies.
P08 · Perhalusi kepada kajian primer
Tampal dalam: Asta · thread carian yang sama
Refine this search to primary empirical studies only. Exclude systematic reviews, scoping reviews, meta-analyses, editorials and protocols. Include studies reporting actual cervical screening participation or screening history among adult women. Studies about intention or awareness only should be background, not included studies. Malaysia and Southeast Asia are preferred, not mandatory.
Apply the screening to the current result list, not just the top 10. State how many candidates you actually inspected and whether any remain unreviewed. If you can only inspect a subset, clearly label the output as a non-exhaustive shortlist; do not claim the entire result set was screened. Keep uncertain candidates for human abstract screening. Present a table with title, year, primary study type, actual screening uptake/history reported, and reason for inclusion or uncertainty.
Checkpoint: Pilih satu kajian primer untuk semakan. Skor relevan bukan keputusan inclusion; saringan manusia tetap diperlukan. Catat tarikh, prompt dan bilangan hasil yang benar-benar dipaparkan, bukan angka dalam naratif sahaja.
Gunakan P09 bersama abstrak yang benar-benar dibuka. Tandakan keputusan akhir sendiri dalam dokumen kerja.
Dalam NotebookLM, cipta notebook BPKK Latihan Bukti. Nama pada sesetengah akaun ialah Gemini Notebook.
Pilih Add sources → Upload files. Muat naik PDF artikel yang disediakan fasilitator. Tunggu pemprosesan selesai, buka sumber dan pastikan tajuk, kaedah serta teks artikel kelihatan.
Untuk laluan latihan yang sudah diuji, gunakan E02_Malaysia_2023.pdf di Bahan → Artikel latihan. Artikel kedua boleh ditambah selepas satu artikel berjaya disemak.
Jika mengimport URL, semak kandungan: halaman bertajuk Checking your browser atau reCAPTCHA bukan artikel. Jangan gunakan sumber tersebut; gunakan PDF yang sah atau salin abstrak dan labelkan sebagai abstrak sahaja.
Pilih checkbox sumber artikel yang hendak digunakan sahaja. Hantar P10 dalam ruangan chat notebook. Klik citation dan bandingkan dengan artikel. Tutup panel Citation Details dengan Esc atau butang tutup sebelum menghantar prompt seterusnya.
P09 · Saring satu abstrak
Tampal dalam: Gemini
Soalan latihan: faktor yang berkaitan dengan penyertaan saringan serviks dalam kalangan wanita dewasa.
Kriteria inclusion: kajian primer, wanita dewasa, melaporkan penyertaan sebenar atau sejarah saringan, konteks komuniti atau perkhidmatan kesihatan.
Exclusion: review, editorial, protokol, atau kajian yang mengukur niat/kesedaran sahaja.
Saring abstrak yang saya tampal selepas ini. Berikan keputusan masukkan, keluarkan atau belum pasti, serta sebab berdasarkan teks sahaja. Jangan teka maklumat yang tiada. Tunggu saya tampal abstrak.
P10 · Ekstrak jadual bukti
Tampal dalam: NotebookLM · pilih PDF artikel sahaja
Gunakan hanya PDF artikel yang dipilih. Bina satu baris jadual bukti: penulis dan tahun, negara dan populasi, reka bentuk kajian, saiz sampel, outcome saringan, satu dapatan utama dan limitasi.
Sertakan citation bagi fakta. Jika maklumat tidak dinyatakan, tulis “tidak dinyatakan”. Jangan gunakan data simulasi dashboard dan jangan membuat dakwaan sebab-akibat.
Checkpoint: Semak sekurang-kurangnya penulis/tahun, saiz sampel dan satu dapatan melalui citation. Kajian rentas lintang menunjukkan perkaitan; jangan menukarnya menjadi bukti keberkesanan intervensi.
Gunakan P11 selepas memilih artikel sahaja. Jika hanya satu artikel tersedia, hasilnya ialah ringkasan satu kajian.
Salin ringkasan yang telah disemak ke dokumen kerja. Gunakan P12 dalam Gemini.
Bekukan kontrak data bersama fasilitator. Semua peserta menggunakan nama medan yang sama supaya kod Hari 2 serasi.
P11 · Ringkasan bukti berasaskan sumber
Tampal dalam: NotebookLM
Berdasarkan artikel yang dipilih sahaja, ringkaskan apa yang diketahui tentang penyertaan saringan serviks, limitasi bukti dan satu soalan yang masih belum terjawab.
Jika hanya satu artikel dipilih, nyatakan bahawa ini ringkasan satu kajian. Jika beberapa artikel dipilih, bezakan dapatan yang konsisten dan berbeza. Sertakan citation. Jangan menyamakan populasi kajian dengan semua negeri Malaysia.
P12 · Tetapkan kontrak data projek
Tampal dalam: Gemini
Saya akan membina portal latihan Program Saringan Kesihatan X. Data SIMULASI, bukan data daripada artikel dan bukan data pesakit.
Satu rekod = satu negeri dan satu bulan. Header backend mesti tepat: id, masa, negeri, bulan, sasaran, disaring.
id dan masa dijana sistem. bulan ialah teks YYYY-MM, tahun 2000–2099. sasaran integer 1–1000000000; disaring integer 0–1000000000 dan boleh melebihi sasaran. Gabungan negeri+bulan mesti unik. Bilangan ialah untuk bulan itu, bukan kumulatif tahunan.
Sediakan kamus data dan formula pencapaian keseluruhan. Kekalkan nama medan. Jangan tulis kod lagi. Bezakan pencapaian sasaran daripada liputan populasi.
Takrif tetap: disaring ialah bilangan saringan, tidak semestinya individu unik; jangan menamakannya bilangan individu unik atau kes penyakit. masa ialah teks ISO 8601 ketika rekod dicipta, bukan masa kemas kini. Untuk liputan, nyatakan keperluan bilangan individu unik dan denominator populasi sasaran yang layak mengikut definisi program.
Checkpoint: Kontrak data disimpan. Formula bersama: jumlah disaring ÷ jumlah sasaran × 100. Bukti artikel membantu merancang soalan susulan, bukan menerangkan punca dalam data simulasi.
Pasang kod rujukan, deploy web app dan uji perjalanan data.
Konsep → demo fasilitator → buat bersama → cuba sendiri → semak0 sesi selesai
Rehat: 10.15–10.30 pagi · 12.30–2.00 petang · 3.15–3.30 petang.
068.30–9.00 pagiPengenalan aliran sistemTools: Gemini · P13+
Fasilitator tunjuk portal rujukan: Utama → Borang → Google Sheets → Dashboard. Setiap peserta akan mempunyai projek dan spreadsheet sendiri.
Gunakan kod rujukan dalam panduan ini untuk laluan wajib. Gemini digunakan untuk memahami, membimbing dan mengubah bahagian kecil. Ini mengurangkan risiko kod berlainan antara peserta.
P13 · Fahami seni bina
Tampal dalam: Gemini
Saya beginner. Terangkan aliran portal latihan dengan tiga paparan Utama, Borang dan Dashboard dalam satu Google Apps Script Web App.
Google Sheets ialah backend. Code.gs mengurus data; Index.html mengurus paparan. Borang berhubung dengan server melalui google.script.run.
Terangkan dalam 5 langkah mudah dan nyatakan langkah yang saya perlu buat sendiri. Jangan cadangkan Firebase, API key, Gemini API atau platform lain.
Laluan bengkel ini tetap: projek standalone dibuka di script.google.com. Selepas dua fail kod rujukan dipasang, setupLatihan mencipta Google Sheets secara automatik dan menyimpan SHEET_ID. Jangan suruh saya mencipta Sheet atau header secara manual, membuka Extensions dari Sheet, atau membina versi bound script. getData membaca rekod; Index.html menapis dan mengira KPI paparan. Terangkan aliran ini sahaja.
Checkpoint: Peserta faham bahawa preview Gemini atau fail HTML tempatan tidak membuktikan sambungan Google Sheets.
079.00–10.15 pagiMenyediakan backend Google SheetsTools: Google Apps Script + Google Sheets + Gemini · P14 / P15+
Buka script.google.com → New project. Namakan BPKK Latihan – Nama Anda. Gunakan akaun yang sama sepanjang latihan.
Dalam Code.gs, pilih semua kod default dan gantikan dengan keseluruhan Code.gs rujukan di bahagian Kod dalam panduan ini.
Klik + di sebelah Files → HTML. Namakan Index (bukan Index.html.html). Gantikan kandungannya dengan keseluruhan Index.html rujukan. Kedua-dua fail dipasang sekarang; paparan dipelajari satu demi satu dalam sesi berikut.
Untuk menyamai konfigurasi rujukan: Project Settings → tandakan Show appsscript.json manifest file in editor. Buka appsscript.json dan tampal manifest rujukan. Klik Save.
Pilih fungsi setupLatihan pada dropdown sebelah Run. Pastikan label benar-benar berubah daripada doGet kepada setupLatihan; kemudian klik Run.
Semak kebenaran Google untuk projek milik sendiri. Jika akaun organisasi menyekat Apps Script atau consent, minta bantuan fasilitator/admin; jangan memintas polisi organisasi.
Buka Execution log. Klik URL spreadsheet yang dipaparkan. Pilih tab Data. Semak header dan enam baris simulasi. Tab Sheet1 kosong boleh diabaikan.
Jangan tambah semula enam baris secara manual. Run setupLatihan sekali lagi hanya untuk mengesahkan ia tidak menggandakan data. Simpan URL Sheet dan projek dalam dokumen kerja.
P14 · Bimbing pemasangan backend
Tampal dalam: Gemini · tampal Code.gs selepas prompt
Ini Code.gs rujukan bengkel. Saya beginner. Terangkan fungsi setupLatihan, getData dan saveRecord dalam Bahasa Malaysia mudah.
Kemudian berikan langkah memasang kod dalam projek Apps Script baharu dan menjalankan setupLatihan. Jangan ubah kod, nama medan atau formula. Nyatakan bahawa saya sendiri perlu klik Run dan menyemak Google Sheets.
Tunggu saya tampal kod Code.gs sebelum menjawab.
P15 · Semak baseline data
Tampal dalam: Gemini · salin julat C1:F7 dalam tab Data sebelum rekod Melaka ditambah
Semak data SIMULASI yang saya tampal selepas ini. Periksa negeri+bulan yang berulang, bulan yang bukan YYYY-MM, medan kosong serta bilangan yang bukan integer.
Kemudian kira jumlah sasaran, jumlah disaring dan pencapaian keseluruhan menggunakan nisbah jumlah. Jangan puratakan peratus setiap baris.
Tunjukkan pengiraan ringkas. Jangan ubah data. Tunggu saya tampal jadual.
Checkpoint: Enam rekod; jumlah sasaran 900, jumlah disaring 660, pencapaian 73.33%. setupLatihan kedua tidak menambah rekod. Jangan teruskan jika angka berbeza.
0810.30 pagi–12.30 tengah hariBorang web app dan deployment pertamaTools: Apps Script + Gemini · P16 / P17+
Gambaran borang latihan · contoh sahaja
DATA SIMULASI · Tambah rekod
NegeriMelaka ▾
Bulan2026-03
Sasaran100
Disaring80
Simpan rekod
Buat dalam web app anda: isi 4 medan → Simpan sekali → tunggu ID → buka Sheets → pastikan hanya 1 rekod ditambah.
Buka Index.html dan cari entryForm. Gunakan P16 untuk memahami borang. Kod rujukan sudah mengandungi borang lengkap.
Klik Deploy → New deployment → ikon gear → Web app. Execute as: Me. Who has access: Only myself untuk latihan individu. Klik Deploy.
Buka URL Web app yang berakhir dengan /exec, menggunakan akaun pemilik yang sama. Jangan guna pautan editor atau /dev sebagai pautan akhir.
Klik Isi borang. Hantar: Negeri Melaka; Bulan 2026-03; Sasaran 100; Disaring 80. Tekan Simpan rekod sekali dan tunggu mesej yang mengandungi ID.
Buka tab Data dalam spreadsheet. Pastikan tepat satu rekod baharu Melaka muncul. Kemudian buka Dashboard dan pilih Semua negeri serta Semua bulan.
Jangan deploy kepada Anyone untuk latihan asas. Perkongsian kepada rakan hanya selepas fasilitator mengesahkan polisi akaun dan data simulasi yang akan didedahkan.
P16 · Fahami borang dan validasi
Tampal dalam: Gemini · tampal Index.html selepas prompt
Saya akan tampal Index.html rujukan. Terangkan medan borang dan perjalanan data apabila Simpan rekod ditekan.
Tunjukkan bagaimana UI menunggu jawapan server, memaparkan ralat dan mengelakkan klik berulang. Bezakan validasi browser dengan validasi server.
Jangan ubah kod. Tunggu saya tampal Index.html.
P17 · Bimbing deployment pertama
Tampal dalam: Gemini
Bimbing saya deploy projek Google Apps Script milik sendiri sebagai Web app. Kod Code.gs dan Index.html sudah disimpan dan setupLatihan sudah berjaya.
Untuk latihan individu, gunakan Execute as Me dan akses Only myself. Berikan satu langkah pada satu masa dan tunggu saya selesai.
Saya sendiri akan menyemak kebenaran Google. Jangan dakwa deployment berjaya sebelum saya membuka URL /exec dan menguji borang.
Untuk ujian borang, gunakan rekod tetap sahaja: negeri Melaka, bulan 2026-03, sasaran 100, disaring 80. Jangan tukar negeri, bulan atau angka contoh kerana checkpoint berikutnya bergantung pada rekod ini. Selepas simpan, saya perlu menyemak tepat satu rekod baharu dalam Sheets dan KPI keseluruhan 1000,740,74.00%.
Checkpoint: Tepat tujuh rekod selepas penghantaran. Google Sheets mesti mempunyai rekod Melaka, bukan sekadar mesej “berjaya” di browser. Simpan ID rekod dalam log latihan.
092.00–3.15 petangDashboard daripada Google SheetsTools: Apps Script + Google Sheets + Gemini · P18 / P19+
Gambaran dashboard · selepas rekod Melaka ditambah
DATA SIMULASI · Semua negeri · Semua bulan · 7 rekod
Sasaran1,000
Disaring740
Pencapaian74.00%
Bilangan disaring mengikut negeri
Johor170
Sabah220
Selangor270
Melaka80
Rajah penerangan, bukan dashboard live. Semak angka sebenar dalam web app sendiri dan bandingkan dengan Sheets.
Buka Dashboard → Muat semula. Pastikan penapis Semua negeri dan Semua bulan.
Bandingkan kad KPI dengan Sheets. Semak carta negeri, carta bulan dan jadual rekod.
Pilih Johor: pencapaian 85.00%. Tambah penapis 2026-02: 90.00%. Pilih Kedah dengan bulan yang sama: tiada rekod dan pencapaian —, bukan 0% atau Infinity.
Pulihkan kedua-dua penapis kepada Semua. Gunakan P18 untuk memahami pengiraan; kemudian P19 untuk menilai paparan.
P18 · Semak pengiraan dashboard
Tampal dalam: Gemini
Data simulasi baseline ialah:
Johor | 2026-01 | 100 | 80
Johor | 2026-02 | 100 | 90
Sabah | 2026-01 | 200 | 100
Sabah | 2026-02 | 200 | 120
Selangor | 2026-01 | 150 | 120
Selangor | 2026-02 | 150 | 150
Rekod baharu: Melaka | 2026-03 | 100 | 80.
Urutan angka ialah sasaran, disaring.
Kira KPI semua rekod, KPI Johor sahaja dan KPI Johor Februari. Jelaskan cara memaparkan keadaan tiada rekod. Jangan puratakan peratus baris.
Untuk tiada rekod, tetapkan paparan tepat: jumlah sasaran 0, jumlah disaring 0, pencapaian “—”. Jangan paparkan 0%, NaN atau Infinity kerana denominator tiada.
P19 · Nilai paparan sebelum mengubah kod
Tampal dalam: Gemini · lampirkan screenshot dashboard jika dibenarkan
Jika tiada screenshot dilampirkan pada mesej ini, jawab hanya “Sila lampirkan screenshot dashboard dahulu” dan tunggu. Jangan gunakan kod atau chat terdahulu untuk mengandaikan rupa paparan.
Selepas screenshot diberikan, nilai tajuk, label DATA SIMULASI, unit, penapis dan mesej tiada data berdasarkan bahagian yang benar-benar kelihatan sahaja. Jika sesuatu tidak kelihatan, nyatakan tidak dapat dinilai.
Cadangkan maksimum 3 penambahbaikan paparan untuk beginner. Jangan ubah formula, mencipta ambang warna prestasi atau menambah indikator klinikal.
Checkpoint: Semua rekod: 1000, 740, 74.00%. Johor: 200, 170, 85.00%. Johor Februari: 100, 90, 90.00%. Semua carta dan jadual berubah bersama penapis.
103.30–4.30 petangUjian aliran lengkap dan pembaikanTools: Web app + Google Sheets + Gemini · P20+
Hantar semula Melaka 2026-03 dengan angka yang sama. Sistem mesti menolak rekod pendua; Sheets kekal tujuh rekod.
Cuba hantar borang kosong, sasaran 0 dan angka perpuluhan. Browser mesti meminta pembetulan dan tiada rekod ditambah.
Muat semula browser. Data mesti kekal kerana sumbernya Google Sheets. Klik Utama, Borang dan Dashboard untuk semak navigasi.
Jika bermasalah, gunakan P20 dan tampal ralat sebenar serta kod yang berkaitan. Jangan menampal token, password atau data sebenar.
Jika kod diubah: Save → Deploy → Manage deployments → ikon pensel → Version: New version → Deploy. Buka semula URL /exec yang sama. Save sahaja tidak mengemas kini deployment versi.
Jika sesi hampir tamat dan kod hasil AI belum lulus, pulihkan fail kod rujukan, deploy versi baharu dan ulang ujian asas.
P20 · Baiki satu isu sahaja
Tampal dalam: Gemini
Saya akan berikan ralat sebenar dan kod berkaitan daripada web app latihan Apps Script. Bantu diagnosis satu isu pada satu masa.
Kekalkan kontrak id, masa, negeri, bulan, sasaran, disaring; tab Data; serta fungsi setupLatihan, getData dan saveRecord.
Jangan tulis semula seluruh aplikasi atau cadangkan memadam data. Selepas diagnosis, cadangkan perubahan paling kecil, nama fail dan ujian semula.
Tunggu saya tampal mesej ralat dan kod.
Untuk ujian semula, bezakan kod draf editor dengan deployment versi. Jika ralat daripada Run editor, uji semula fungsi yang sama melalui Run. Jika perubahan perlu muncul pada URL /exec, terangkan Save → Deploy → Manage deployments → Edit → New version → Deploy → buka semula URL yang sama. Jangan anggap Save dan reload /exec sahaja sudah menggunakan kod baharu.
Checkpoint: Log ujian mempunyai hasil untuk simpan, baca semula Sheets, KPI, penapis, tiada data, pendua dan reload. Status belum diuji mesti dikekalkan jika ujian tidak dibuat.
Kemaskan pintu masuk portal, tulis laporan dan bentangkan cerita data.
Konsep → demo fasilitator → buat bersama → cuba sendiri → semak0 sesi selesai
Rehat: 10.15–10.30 pagi · 12.30–2.00 petang · 3.15–3.30 petang.
118.30–9.00 pagiSemakan sistemTools: Web app + Gemini · P21+
Buka URL /exec dan klik Dashboard → Muat semula. Pastikan data serta penapis betul.
Gunakan P21 dan jalankan checklist. Jangan hantar semula rekod Melaka jika sudah wujud.
P21 · Checklist sebelum pembentangan
Tampal dalam: Gemini
Bina checklist 6 perkara untuk portal latihan yang mempunyai Utama, Borang, Google Sheets dan Dashboard.
Semakan mesti meliputi navigasi, rekod kekal, KPI berbanding Sheets, penapis, pendua dan label data simulasi.
Sediakan lajur belum diuji, lulus atau perlu baiki untuk saya isi sendiri. Jangan mengisi status lulus bagi pihak saya.
Checkpoint: Isu fungsi diselesaikan sebelum mengubah gaya. Simpan salinan Index.html yang berfungsi untuk pemulihan.
Gunakan P22 untuk menulis kandungan landing page sahaja. Semak ayat dan elakkan logo rasmi atau dakwaan portal rasmi.
Gunakan P23 bersama Index.html semasa. Gemini hanya mengubah kandungan dalam section utama; jangan gantikan fungsi JavaScript.
Gantikan blok section utama sahaja dengan hasil yang disemak. Simpan dan deploy New version pada deployment yang sama.
Buka URL /exec. Uji Isi borang, Lihat dashboard dan navigasi kembali ke Utama. Semak pada telefon sendiri atau tetingkap browser yang dikecilkan.
P22 · Tulis kandungan landing page
Tampal dalam: Gemini
Tulis kandungan landing page untuk Portal Latihan Program Saringan Kesihatan X, untuk peserta beginner BPKK.
Berikan satu tajuk maksimum 10 perkataan, penerangan maksimum 40 perkataan dan tiga langkah penggunaan.
Kekalkan label DATA SIMULASI serta butang “Isi borang” dan “Lihat dashboard”. Jangan menggambarkannya sebagai portal rasmi KKM atau menambah dakwaan klinikal.
Nama projek kekal “Portal Latihan Program Saringan Kesihatan X”, untuk HQ BPKK (Bahagian Pembangunan Kesihatan Keluarga). Jangan tambah nama organisasi lain. Teks dua butang mesti tepat “Isi borang” dan “Lihat dashboard”, bukan “Borang” atau variasi lain.
P23 · Ubah landing page tanpa merosakkan fungsi
Tampal dalam: Gemini · tampal Index.html dan kandungan P22
Saya akan tampal Index.html yang berfungsi dan kandungan landing page yang dipersetujui.
Ubah HANYA teks dan susunan kandungan dalam section id="utama". Kekalkan id="utama", tabindex="-1", serta butang data-view="borang" dan data-view="dashboard". Jangan ubah section lain, CSS, JavaScript, nama fungsi, ID medan atau kontrak data.
Pulangkan hanya blok section utama yang lengkap untuk saya gantikan, tanpa tanda tiga backtick. Jangan buat perubahan sebelum saya tampal kod dan kandungan.
Checkpoint: Ketiga-tiga paparan berfungsi melalui satu URL /exec. Borang masih menyimpan dan dashboard masih membaca data selepas kemas kini landing page.
1310.30 pagi–12.30 tengah hariDaripada dashboard kepada laporanTools: NotebookLM + Gemini · P24 / P25 / P26+
Dalam Dashboard, pilih penapis yang hendak dilaporkan dan klik Muat semula. Semak angka, kemudian klik Salin ringkasan. Jika clipboard disekat, pilih teks ringkasan dan tekan Ctrl+C / Cmd+C.
Dalam notebook Hari 1: Add sources → Copied text → tampal ringkasan. Tajuk sumber bermula RINGKASAN DATA SIMULASI BPKK. Sumber ini snapshot, bukan live sync.
Pastikan hanya SATU snapshot data terkini dipilih. Nyahpilih snapshot lama dan sumber yang gagal import. Untuk P24, pilih snapshot data sahaja.
Untuk menukar sumber selepas membuka citation, tutup Citation Details, kemudian klik ikon kembali di penjuru kanan atas panel Sources sehingga checkbox sumber muncul. Untuk P25, pilih snapshot terkini dan artikel yang telah disemak. Bezakan bukti kajian sebenar daripada data latihan.
Salin hasil yang telah disemak ke Gemini menggunakan P26. Semak setiap angka dan jejak citation sebelum menyimpan laporan dalam dokumen kerja.
P24 · Dapatan daripada data sahaja
Tampal dalam: NotebookLM · pilih snapshot data sahaja
Berdasarkan sumber RINGKASAN DATA SIMULASI BPKK sahaja, tulis 3 dapatan utama untuk pengurusan. Nyatakan angka dan citation.
Bezakan pencapaian sasaran daripada liputan populasi. Jangan andaikan punca perbezaan atau gambarkan data ini sebagai data sebenar KKM.
P25 · Hubungkan bukti dan soalan susulan
Tampal dalam: NotebookLM · pilih snapshot terkini dan artikel
Gunakan snapshot data SIMULASI terkini dan artikel kajian yang dipilih.
Bina jadual tiga lajur: pemerhatian daripada data simulasi, bukti artikel yang mungkin relevan, dan soalan susulan yang patut disiasat.
Sertakan citation untuk sumber masing-masing. Jangan mendakwa artikel menerangkan punca perbezaan negeri dalam data simulasi. Jika bukti tidak mencukupi, nyatakan dengan jelas.
Semua soalan susulan ialah latihan kaedah: gunakan frasa “Jika kelak menggunakan data sebenar yang diluluskan, apakah maklumat tambahan yang perlu dikumpul untuk menilai...”. Jangan meminta siasatan sebenar negeri berdasarkan simulasi, jangan andaikan aktiviti atau punca telah berlaku. Elakkan soalan berandaian “yang menyebabkan” atau “yang memacu”. Kekalkan unit negeri+bulan; jangan tambah unit fasiliti yang tiada dalam sumber. Hadkan jadual kepada 3 baris dan jangan tawarkan kertas cadangan siasatan lapangan.
P26 · Draf laporan ringkas
Tampal dalam: Gemini · tampal hasil P24 dan P25 yang telah disemak
Berdasarkan bahan yang saya tampal selepas ini, tulis draf laporan maksimum 600 patah perkataan untuk latihan pengurusan BPKK.
Struktur: tujuan, sumber dan kaedah, dapatan, limitasi, cadangan tindakan.
Nama penuh BPKK ialah Bahagian Pembangunan Kesihatan Keluarga; gunakan nama ini tepat atau singkatan BPKK sahaja. Kekalkan label DATA SIMULASI. Gunakan istilah bilangan saringan, bukan kes penyakit atau individu unik.
Pisahkan pemerhatian data, bukti literatur dan cadangan latihan. Data simulasi tidak mewajarkan siasatan operasi sebenar di mana-mana negeri; cadangkan cara mengesahkan dapatan jika kelak menggunakan data sebenar yang diluluskan. Kekalkan nama sumber atau penanda sumber yang dibekalkan; jangan mencipta citation baharu. Jangan tambah angka atau dakwaan sebab-akibat.
Tunggu saya tampal bahan yang telah disemak.
Dalam dapatan, masukkan tiga subbahagian berasingan: (A) pemerhatian DATA SIMULASI berserta nama sumber RINGKASAN DATA SIMULASI BPKK; (B) bukti satu artikel E02_Malaysia_2023.pdf dengan populasi wanita pendatang Yaman di Lembah Klang, reka bentuk keratan rentas, 355 responden dan 23.1% saringan dalam 3 tahun; (C) cadangan latihan bersyarat. Nama kedua-dua sumber mesti muncul dalam draf. Jangan abaikan bukti artikel. Kaedah pengesahan masa depan ialah pilihan untuk dipertimbangkan dan diluluskan manusia; jangan mewajibkan integrasi sistem berpusat, pengumpulan pengenal pasti atau seni bina yang tidak dibekalkan. Tunggu bahan dahulu.
Checkpoint: Laporan menggunakan snapshot yang dinyatakan; angka sama dengan dashboard bagi penapis tersebut. Citation NotebookLM disemak di notebook asal, bukan dipercayai berdasarkan nombor yang disalin ke Gemini sahaja. Kadar artikel 23.1% dan KPI simulasi 74% mengukur perkara berbeza; jangan bandingkan sebagai prestasi yang setara.
Gunakan P27 selepas memasukkan laporan yang telah disemak. Semak mesej sebelum meminta reka bentuk slaid.
Gunakan P28 bagi satu slaid pada satu masa dan simpan skrip dalam dokumen kerja.
Untuk fail slaid NotebookLM, pilih snapshot terkini dan PDF artikel sahaja → Studio → Slide Deck. Dalam Customize Slide Deck, pilih Presenter Slides, bahasa Melayu dan Length: Short. Tampal P29 dalam Describe the slide deck you want to create. Hidupkan Review slide outline jika tersedia, kemudian Generate now. Jika fungsi tiada pada akaun, gunakan rangka teks P27 sebagai hasil wajib.
Klik Review apabila outline siap. Semak enam slaid, sumber dan konteks latihan. Jika tersasar, tampal P29 yang diperketat dalam Add feedback to refine notes dan tekan Enter; semak outline semula. Selepas memberi feedback, sesetengah akaun terus menjana deck; jika butang Proceed masih muncul, klik selepas outline tepat. Selepas deck siap, buka setiap slaid dan muat turun PDF jika tersedia. Jika arahan reka bentuk tersalin sebagai nota pada slaid, pilih Revise this artifact → pilih slaid → tulis “Buang nota arahan reka bentuk di bawah. Kekalkan semua fakta, angka dan label simulasi. Jangan tambah kandungan.” → Enter → Generate revised deck. Periksa semula hasil revisi. Penjanaan deck ialah pilihan tambahan; tempoh, akses, had penggunaan dan hasil berbeza mengikut akaun.
P27 · Bina jalan cerita 6 slaid
Tampal dalam: Gemini · tampal laporan disemak
Tukar laporan yang saya tampal selepas ini kepada rangka 6 slaid untuk pembentangan 5 minit kepada pengurusan BPKK.
Susunan: isu dan tujuan; bukti kajian; dapatan data simulasi; demo portal; cadangan tindakan; keputusan yang diperlukan.
Bagi setiap slaid, berikan satu tajuk bermesej dan maksimum tiga poin; teks paparan maksimum 30 perkataan setiap slaid. Cadangkan visual secara berasingan. Bezakan fakta, andaian dan cadangan.
Untuk kajian rentas lintang, gunakan “berkaitan”, bukan “menyebabkan” atau “mempengaruhi”. Kekalkan maksud “tidak semestinya individu unik”; jangan menukarnya kepada “tiada individu unik”. Jangan tambah angka atau fakta baharu. Tunggu saya tampal laporan.
Had 30 perkataan termasuk tajuk dan semua poin, tidak termasuk cadangan visual yang berasingan. Label DATA SIMULASI mesti muncul pada slaid angka dashboard. Slaid kajian mesti mengekalkan populasi wanita pendatang Yaman di Lembah Klang. Jangan meringkaskan limitasi menjadi larangan umum “siasatan operasi sebenar tidak wajar”; tulis bahawa DATA SIMULASI ini tidak mewajarkan siasatan negeri sebenar. Jangan cipta tatacara rasmi BPKK yang tidak dibekalkan. Tajuk dan poin sahaja ialah teks paparan; letakkan label fakta/cadangan serta arahan visual di luar teks paparan.
Untuk mengelakkan label tersorok dalam nota, tajuk paparan slaid 3 mesti tepat “DATA SIMULASI: Pencapaian Sasaran 74%”. Jangan letakkan label DATA SIMULASI hanya dalam klasifikasi atau nota visual. Semak sendiri kiraan tajuk + poin bagi setiap slaid sebelum menjawab.
P28 · Nota pembentang satu slaid
Tampal dalam: Gemini · tampal satu slaid daripada P27
Tulis nota pembentang sekitar 40 saat untuk satu slaid yang saya tampal selepas ini. Gunakan Bahasa Malaysia natural dan profesional.
Terangkan maksud dapatan, bukan sekadar membaca poin. Kekalkan angka, label simulasi dan limitasi penting. Jangan tambah fakta baharu. Tunggu saya tampal slaid.
P29 · Arahan deck pilihan tambahan
Tampal dalam: NotebookLM · Studio Slide Deck, jika tersedia
Cipta deck ringkas dalam Bahasa Malaysia untuk pembentangan latihan 5 minit kepada pengurusan BPKK. Sasarkan 6 slaid: tujuan, bukti, dapatan simulasi, demo portal, cadangan, keputusan diperlukan.
Satu idea setiap slaid, teks minimum dan angka mudah dibaca. Gunakan sumber dipilih sahaja. Labelkan semua data dashboard sebagai DATA SIMULASI. Jangan mendakwa hubungan sebab-akibat atau mereka standard klinikal. Bezakan data latihan daripada bukti artikel.
Konteks wajib: ini pembentangan hasil bengkel, bukan cadangan operasi sebenar. Tepat 6 slaid. (1) Tujuan latihan beginner. (2) Satu kajian keratan rentas:355 wanita pendatang Yaman di Lembah Klang,23.1% sejarah Pap3tahun; bukan semua wanita Malaysia dan bukan bukti kausal. (3) DATA SIMULASI:740/1000=74%; bukan liputan populasi atau semestinya individu unik. (4) Demo langsung portal latihan Utama→Borang→Dashboard; gunakan teks arahan demo sahaja, jangan cipta screenshot seolah-olah UI sebenar. (5) Cadangan latihan:semak formula,sumber dan limitasi; data simulasi tidak mewajarkan tindakan operasi negeri. (6) Keputusan latihan:semak hasil peserta; semakan organisasi diperlukan sebelum mempertimbangkan data sebenar. Jangan reka tiga keputusan binari, kos, sasaran rasmi, integrasi sistem, intervensi negeri atau kelulusan operasi segera. Jangan bandingkan23.1%artikel dengan74%simulasi sebagai metrik setara. Letakkan label DATA SIMULASI pada semua angka dashboard dan ringkaskan teks.
Checkpoint: Hasil wajib ialah rangka 6 slaid dan nota pembentang yang telah disemak. Deck automatik tidak menjadi syarat untuk menamatkan latihan.
153.30–4.15 petangDemo projek dan pembentangan capstoneTools: Web app + Gemini · P30+
Gunakan P30 untuk latihan soal jawab secara berpasangan.
Semasa demo: buka Utama → tunjuk Borang → tunjuk rekod dalam Sheets → buka Dashboard dan gunakan penapis → bentangkan tiga dapatan serta satu limitasi.
Untuk demo tanpa menambah rekod, gunakan rekod ujian yang telah disimpan. Jika mahu tambah rekod baharu, pilih gabungan negeri+bulan yang belum digunakan dan kira semula baseline pembentangan.
P30 · Simulasi soal jawab
Tampal dalam: Gemini · tampal ringkasan projek
Saya akan tampal ringkasan projek dan dapatan latihan. Bertindak sebagai pengurusan BPKK.
Tanya satu soalan pada satu masa tentang ketepatan data, limitasi atau kebolehlaksanaan cadangan. Selepas saya menjawab, berikan maklum balas ringkas sebelum soalan seterusnya.
Jangan mereka maklumat yang tiada dalam ringkasan. Tunggu saya tampal ringkasan.
Checkpoint: Peserta boleh menunjukkan bukti fungsi serta menerangkan maksud KPI. “Belum diketahui” ialah jawapan yang betul apabila sumber tidak mencukupi.
164.15–4.30 petangPenilaian dan pelan aplikasi kerjaTools: Gemini · P31+
Semak hasil individu: soalan kajian, jadual bukti, URL portal, URL Sheet, log ujian, laporan dan rangka pembentangan.
Sebelum salin P31, gantikan [tulis satu tugasan kerja] dengan satu tugasan khusus, contohnya “memantau pencapaian program saringan bulanan menggunakan data simulasi”. Gunakan P31 untuk pelan selepas bengkel. Sistem latihan perlu semakan organisasi sebelum digunakan dengan data operasi sebenar.
P31 · Pelan aplikasi 2 minggu
Tampal dalam: Gemini
Saya mahu menggunakan kemahiran bengkel untuk satu tugasan ini: [tulis satu tugasan kerja].
Bina pelan tindakan 2 minggu yang ringkas: langkah, hasil dan semakan manusia yang diperlukan.
Mulakan dengan data simulasi atau data yang telah diluluskan. Nyatakan keputusan tentang akses, kerahsiaan data dan pemilikan sistem yang perlu dibuat sebelum penggunaan sebenar. Jangan anggap prototaip latihan sudah sedia untuk operasi.
Checkpoint: Peserta menyimpan pautan dan hasil dalam satu dokumen kerja. Fasilitator mengesahkan hasil sebenar, bukan jumlah prompt yang dihantar.
Muat turun fail rujukan di bawah atau buka panel untuk menyalin kandungannya. Salin keseluruhan kandungan setiap fail, tanpa tanda tiga backtick. Jangan ubah nama fail atau header semasa latihan asas.
Run setupLatihan hanya daripada editor sebagai pemilik. Ia mencipta spreadsheet baharu, menyimpan ID dalam Script Properties dan mengisi enam rekod simulasi hanya ketika tab Data baharu dicipta. Tiada fungsi reset atau padam disediakan.
Code.gs
/** BPKK beginner workshop. DATA SIMULASI sahaja. */
const NEGERI = ['Johor','Kedah','Kelantan','Melaka','Negeri Sembilan','Pahang','Perak','Perlis','Pulau Pinang','Sabah','Sarawak','Selangor','Terengganu','WP Kuala Lumpur','WP Labuan','WP Putrajaya'];
const HEADER = ['id','masa','negeri','bulan','sasaran','disaring'];
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index')
.setTitle('BPKK | Portal Latihan Saringan')
.addMetaTag('viewport', 'width=device-width, initial-scale=1');
}
// Run SEKALI dari editor. Tiada reset atau pemadaman data.
function setupLatihan() {
const active = Session.getActiveUser().getEmail();
if (!active || active !== Session.getEffectiveUser().getEmail()) {
throw new Error('Jalankan setupLatihan dari editor sebagai pemilik projek.');
}
const lock = LockService.getScriptLock();
lock.waitLock(20000);
try {
const props = PropertiesService.getScriptProperties();
let id = props.getProperty('SHEET_ID');
let ss;
if (id) ss = SpreadsheetApp.openById(id);
else {
ss = SpreadsheetApp.create('BPKK Latihan Saringan — DATA SIMULASI');
ss.setSpreadsheetTimeZone('Asia/Kuala_Lumpur');
props.setProperty('SHEET_ID', ss.getId());
}
let sheet = ss.getSheetByName('Data');
if (!sheet) sheet = ss.insertSheet('Data');
if (sheet.getLastRow() === 0) {
sheet.getRange(1,1,1,HEADER.length).setValues([HEADER]);
sheet.setFrozenRows(1);
sheet.getRange('D:D').setNumberFormat('@');
const seed = [
['Johor','2026-01',100,80], ['Johor','2026-02',100,90],
['Sabah','2026-01',200,100], ['Sabah','2026-02',200,120],
['Selangor','2026-01',150,120], ['Selangor','2026-02',150,150]
].map(r => [Utilities.getUuid(), new Date().toISOString()].concat(r));
sheet.getRange(2,1,seed.length,HEADER.length).setValues(seed);
sheet.autoResizeColumns(1,HEADER.length);
SpreadsheetApp.flush();
}
const result = {url:ss.getUrl(), mesej:'Backend sedia. Tiada data sedia ada dipadam.'};
console.log(JSON.stringify(result));
return result;
} finally { lock.releaseLock(); }
}
function sheet_() {
const id = PropertiesService.getScriptProperties().getProperty('SHEET_ID');
if (!id) throw new Error('Backend belum disediakan. Run setupLatihan dalam editor.');
const sheet = SpreadsheetApp.openById(id).getSheetByName('Data');
if (!sheet) throw new Error('Tab Data tidak ditemui.');
const actual = sheet.getRange(1,1,1,HEADER.length).getDisplayValues()[0];
if (actual.join('|') !== HEADER.join('|')) throw new Error('Header tab Data tidak sepadan dengan kontrak.');
return sheet;
}
function validate_(input) {
if (!input || typeof input !== 'object') throw new Error('Data tidak sah.');
const negeri = String(input.negeri || '').trim();
const bulan = String(input.bulan || '').trim();
if (!NEGERI.includes(negeri)) throw new Error('Pilih negeri yang sah.');
if (!/^20\d{2}-(0[1-9]|1[0-2])$/.test(bulan)) throw new Error('Bulan mesti YYYY-MM, tahun 2000–2099.');
function integer(value, name, min) {
if (typeof value !== 'number' && typeof value !== 'string') throw new Error(name + ' mesti nombor bulat.');
if (String(value).trim() === '' || !/^\d+$/.test(String(value).trim())) throw new Error(name + ' mesti nombor bulat.');
const n = Number(value);
if (!Number.isSafeInteger(n) || n < min || n > 1000000000) throw new Error(name + ' di luar julat latihan.');
return n;
}
return {negeri, bulan, sasaran:integer(input.sasaran,'Sasaran',1), disaring:integer(input.disaring,'Disaring',0)};
}
function rows_() {
const sheet = sheet_();
if (sheet.getLastRow() < 2) return [];
const seen = new Set();
return sheet.getRange(2,1,sheet.getLastRow()-1,HEADER.length).getDisplayValues()
.filter(row => row.some(cell => cell !== ''))
.map((r,i) => {
let d;
try { d = validate_({negeri:r[2],bulan:r[3],sasaran:r[4],disaring:r[5]}); }
catch(e) { throw new Error('Semak data sumber, baris ' + (i+2) + ': ' + e.message); }
const key = d.negeri + '|' + d.bulan;
if (seen.has(key)) throw new Error('Data sumber berulang bagi ' + key + '. Semak Sheets.');
seen.add(key);
return Object.assign({id:r[0],masa:r[1]},d);
});
}
function getData() {
return {negeri:NEGERI.slice(), rows:rows_(), dikemasKini:new Date().toISOString()};
}
function saveRecord(input) {
const d = validate_(input);
const lock = LockService.getScriptLock();
lock.waitLock(20000);
try {
const sheet = sheet_();
if (rows_().some(r => r.negeri === d.negeri && r.bulan === d.bulan)) {
throw new Error('Rekod negeri dan bulan ini sudah wujud. Tiada rekod ditambah.');
}
const id = Utilities.getUuid();
const row = sheet.getLastRow()+1;
sheet.getRange(row,4).setNumberFormat('@');
sheet.getRange(row,1,1,HEADER.length).setValues([[id,new Date().toISOString(),d.negeri,d.bulan,d.sasaran,d.disaring]]);
SpreadsheetApp.flush();
return {ok:true,id:id,mesej:'Rekod berjaya disimpan dalam Google Sheets.'};
} finally { lock.releaseLock(); }
}
Index.html
<!DOCTYPE html>
<html lang="ms">
<head>
<base target="_top">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
:root{--ink:#20231f;--gold:#d99a22;--bg:#f7f5ef;--line:#deddd4}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 Arial,sans-serif}
header,main,footer{max-width:1100px;margin:auto;padding:20px}header{display:flex;align-items:center;justify-content:space-between;gap:15px;flex-wrap:wrap;border-bottom:1px solid var(--line)}
h1,h2,h3{font-family:Georgia,'Times New Roman',serif;line-height:1.2}h1{font-size:clamp(32px,5vw,56px);max-width:850px}h2{font-size:30px}.tag{font-size:12px;font-weight:bold;letter-spacing:1px;color:#715006}
button{background:var(--ink);color:white;border:1px solid var(--ink);border-radius:8px;padding:10px 16px;cursor:pointer;font:inherit}button:hover{opacity:.85}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid var(--gold);outline-offset:3px}button:disabled{opacity:.5;cursor:wait}nav{display:flex;gap:8px;flex-wrap:wrap}nav button{background:transparent;color:var(--ink)}nav button[aria-current=page]{background:var(--ink);color:white}.gold{background:var(--gold);color:var(--ink);border-color:var(--gold)}
.card{background:white;border:1px solid var(--line);border-radius:12px;padding:22px;margin:18px 0}.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.grid .card{margin:0}.value{font-size:32px;font-weight:bold}.muted{color:#5d635a}.notice{border-left:4px solid var(--gold);padding:12px 16px;background:#fff8e7}.filters{display:flex;gap:16px;flex-wrap:wrap;align-items:end}label{display:block;font-weight:bold;margin-bottom:6px}input,select{width:100%;padding:10px;border:1px solid #858a80;border-radius:7px;background:white;color:var(--ink);font:inherit}.field{margin:16px 0;min-width:180px}.filters .field{flex:1;margin:0}.form{max-width:600px}.status{padding:12px 0;min-height:40px;white-space:pre-wrap}.error{color:#a12222}.ok{color:#24633c}.table-wrap{overflow:auto}table{border-collapse:collapse;width:100%;white-space:nowrap}th,td{text-align:left;padding:10px;border-bottom:1px solid var(--line)}th{background:#f3f3ec}.chart-row{display:grid;grid-template-columns:140px 1fr 115px;gap:12px;align-items:center;margin:14px 0}.track{height:20px;background:#eeeee6;border-radius:5px;overflow:hidden}.bar{height:100%;background:var(--gold)}textarea{width:100%;min-height:180px;font:13px/1.5 monospace}footer{font-size:13px;border-top:1px solid var(--line)}[hidden]{display:none!important}@media(max-width:650px){.grid{grid-template-columns:1fr}.chart-row{grid-template-columns:100px 1fr 85px;font-size:13px}main{padding:16px}.value{font-size:28px}}
</style>
</head>
<body>
<header><strong>BPKK · Portal Latihan</strong><nav aria-label="Navigasi utama"><button data-view="utama" aria-current="page">Utama</button><button data-view="borang">Borang</button><button data-view="dashboard">Dashboard</button></nav></header>
<main>
<p class="notice"><strong>DATA SIMULASI.</strong> Projek pembelajaran. Jangan masukkan nama, nombor pengenalan atau maklumat pesakit.</p>
<section id="utama" tabindex="-1">
<p class="tag">DATA SIMULASI</p>
<h1>Portal Latihan Program Saringan Kesihatan X HQ BPKK</h1>
<p>Platform latihan digital untuk peserta beginner menguasai pengurusan data saringan secara praktikal menggunakan maklumat simulasi bulanan yang selamat dan berstruktur.</p>
<p><button class="gold" data-view="borang">Isi borang</button> <button data-view="dashboard">Lihat dashboard</button></p>
<div class="grid"><article class="card"><h3>1. Isi borang</h3><p>Masukkan data simulasi bulanan mengikut negeri, sasaran, dan bilangan disaring dengan tepat.</p></article><article class="card"><h3>2. Semak dashboard</h3><p>Terokai rumusan pencapaian keseluruhan serta carta prestasi menggunakan pilihan penapis.</p></article><article class="card"><h3>3. Bentangkan dapatan</h3><p>Gunakan ringkasan data yang dijana untuk perbincangan latihan kesihatan awam.</p></article></div>
</section>
<section id="borang" hidden tabindex="-1">
<h2>Borang data bulanan</h2><p>Satu negeri + satu bulan hanya boleh dihantar sekali. Pembetulan dibuat oleh pemilik di Google Sheets.</p>
<form id="entryForm" class="card form">
<div class="field"><label for="negeri">Negeri</label><select id="negeri" required><option value="">Pilih negeri</option></select></div>
<div class="field"><label for="bulan">Bulan</label><input id="bulan" type="month" min="2000-01" max="2099-12" required></div>
<div class="field"><label for="sasaran">Sasaran latihan</label><input id="sasaran" type="number" min="1" max="1000000000" step="1" required></div>
<div class="field"><label for="disaring">Bilangan disaring</label><input id="disaring" type="number" min="0" max="1000000000" step="1" required><small>Nilai melebihi sasaran dibenarkan. Nilai ini ialah bilangan bagi bulan tersebut, bukan kumulatif tahunan.</small></div>
<button id="submitBtn" type="submit" disabled>Simpan rekod</button>
<p id="formStatus" class="status" role="status" aria-live="polite"></p>
</form>
</section>
<section id="dashboard" hidden tabindex="-1">
<h2>Dashboard pemantauan</h2><p>Pencapaian sasaran latihan; bukan ukuran liputan populasi atau standard klinikal.</p>
<div class="filters card"><div class="field"><label for="filterNegeri">Tapis negeri</label><select id="filterNegeri"><option value="">Semua negeri</option></select></div><div class="field"><label for="filterBulan">Tapis bulan</label><select id="filterBulan"><option value="">Semua bulan</option></select></div><button id="refreshBtn">Muat semula</button></div>
<p id="dashStatus" class="status" role="status" aria-live="polite"></p>
<div class="grid"><div class="card">Jumlah sasaran<div class="value" id="kpiSasaran">—</div></div><div class="card">Jumlah disaring<div class="value" id="kpiDisaring">—</div></div><div class="card">Pencapaian sasaran<div class="value" id="kpiPct">—</div></div></div>
<p class="muted">Formula: jumlah disaring ÷ jumlah sasaran × 100. Semua paparan mengikut penapis yang dipilih.</p>
<article class="card"><h3>Bilangan disaring mengikut negeri</h3><div id="chartNegeri" role="img" aria-label="Carta bar bilangan disaring mengikut negeri"></div></article>
<article class="card"><h3>Bilangan disaring mengikut bulan</h3><div id="chartBulan" role="img" aria-label="Carta bar trend bulanan bilangan disaring"></div></article>
<article class="card"><h3>Rekod sumber</h3><div class="table-wrap"><table><thead><tr><th>Negeri</th><th>Bulan</th><th>Sasaran</th><th>Disaring</th><th>Pencapaian</th></tr></thead><tbody id="records"></tbody></table></div></article>
<article class="card"><h3>Ringkasan untuk Gemini / NotebookLM</h3><p>Salin teks di bawah sebagai sumber baharu. Ini snapshot pada masa muat semula, bukan sambungan langsung kepada NotebookLM.</p><textarea id="summary" readonly aria-label="Ringkasan data simulasi"></textarea><p><button id="copyBtn">Salin ringkasan</button></p><p id="copyStatus" role="status"></p></article>
</section>
</main><footer>Latihan BPKK · Google Sheets + Google Apps Script · DATA SIMULASI sahaja.</footer>
<script>
'use strict';
let model = {rows:[],negeri:[]};
let loadVersion = 0;
let sending = false;
const $ = id => document.getElementById(id);
const fmt = n => n.toLocaleString('en-MY');
const pct = (a,b) => b > 0 ? (a/b*100).toFixed(2)+'%' : '—';
function message(id,text,error=false){$(id).textContent=text;$(id).className='status '+(error?'error':'ok');}
function showView(view){
['utama','borang','dashboard'].forEach(id => $(id).hidden = id !== view);
document.querySelectorAll('nav button').forEach(b => {if(b.dataset.view===view)b.setAttribute('aria-current','page');else b.removeAttribute('aria-current');});
$(view).focus();
if(view==='dashboard') loadData();
}
document.querySelectorAll('[data-view]').forEach(b => b.addEventListener('click',()=>showView(b.dataset.view)));
function options(id,values,label){const old=$(id).value;$(id).replaceChildren(new Option(label,''));values.forEach(v=>$(id).add(new Option(v,v)));if(values.includes(old))$(id).value=old;}
function loadData(){
const version=++loadVersion;
$('refreshBtn').disabled=true;
message('dashStatus','Sedang membaca Google Sheets...');
if(!(window.google && google.script && google.script.run)){
message('dashStatus','Buka URL web app /exec daripada Apps Script. Fail HTML tempatan tidak bersambung kepada Sheets.',true);
message('formStatus','Sambungan Apps Script tidak tersedia.',true);$('refreshBtn').disabled=false;return;
}
google.script.run.withSuccessHandler(data=>{
if(version!==loadVersion)return;
model=data;
options('negeri',data.negeri,'Pilih negeri');
options('filterNegeri',data.negeri,'Semua negeri');
options('filterBulan',[...new Set(data.rows.map(r=>r.bulan))].sort(),'Semua bulan');
$('submitBtn').disabled=sending;
$('refreshBtn').disabled=false;
render();
message('dashStatus','Data dibaca: '+data.rows.length+' rekod. Snapshot '+data.dikemasKini);
}).withFailureHandler(e=>{
if(version!==loadVersion)return;
$('refreshBtn').disabled=false;$('submitBtn').disabled=true;
message('dashStatus',e.message||String(e),true);
message('formStatus','Data belum dapat dibaca. Semak Dashboard dan muat semula.',true);
['kpiSasaran','kpiDisaring','kpiPct'].forEach(id=>$(id).textContent='—');
['chartNegeri','chartBulan','records'].forEach(id=>$(id).replaceChildren());$('summary').value='';
}).getData();
}
function filtered(){return model.rows.filter(r=>(!$('filterNegeri').value||r.negeri===$('filterNegeri').value)&&(!$('filterBulan').value||r.bulan===$('filterBulan').value));}
function chart(id,rows,key){
const groups=new Map();rows.forEach(r=>groups.set(r[key],(groups.get(r[key])||0)+r.disaring));
const target=$(id);target.replaceChildren();
if(!rows.length){target.textContent='Tiada data untuk penapis ini.';return;}
const max=Math.max(1,...groups.values());
[...groups].sort((a,b)=>a[0].localeCompare(b[0])).forEach(([label,n])=>{
const row=document.createElement('div');row.className='chart-row';
const name=document.createElement('span');name.textContent=label;
const track=document.createElement('div');track.className='track';
const bar=document.createElement('div');bar.className='bar';bar.style.width=(n/max*100)+'%';track.append(bar);
const value=document.createElement('span');value.textContent=fmt(n);
row.append(name,track,value);target.append(row);
});
}
function render(){
const rows=filtered();const s=rows.reduce((n,r)=>n+r.sasaran,0);const d=rows.reduce((n,r)=>n+r.disaring,0);
$('kpiSasaran').textContent=fmt(s);$('kpiDisaring').textContent=fmt(d);$('kpiPct').textContent=pct(d,s);
chart('chartNegeri',rows,'negeri');chart('chartBulan',rows,'bulan');$('records').replaceChildren();
rows.slice().sort((a,b)=>(a.bulan+a.negeri).localeCompare(b.bulan+b.negeri)).forEach(r=>{
const tr=document.createElement('tr');[r.negeri,r.bulan,fmt(r.sasaran),fmt(r.disaring),pct(r.disaring,r.sasaran)].forEach(value=>{const td=document.createElement('td');td.textContent=value;tr.append(td);});$('records').append(tr);
});
if(!rows.length){const tr=document.createElement('tr');const td=document.createElement('td');td.colSpan=5;td.textContent='Tiada rekod.';tr.append(td);$('records').append(tr);}
const byState=[...new Set(rows.map(r=>r.negeri))].sort().map(n=>{const rr=rows.filter(r=>r.negeri===n);const ss=rr.reduce((a,r)=>a+r.sasaran,0);const dd=rr.reduce((a,r)=>a+r.disaring,0);return n+': sasaran '+ss+', disaring '+dd+', pencapaian '+pct(dd,ss);});
$('summary').value=['RINGKASAN DATA SIMULASI BPKK','Snapshot: '+model.dikemasKini,'Penapis negeri: '+($('filterNegeri').value||'Semua'),'Penapis bulan: '+($('filterBulan').value||'Semua'),'Bilangan rekod: '+rows.length,'Jumlah sasaran: '+s,'Jumlah disaring: '+d,'Pencapaian sasaran: '+pct(d,s),'Formula: jumlah disaring / jumlah sasaran * 100.',...byState,'Rekod bulanan (negeri | bulan | sasaran | disaring):',...rows.map(r=>[r.negeri,r.bulan,r.sasaran,r.disaring].join(' | ')),'Limitasi: data simulasi agregat; bilangan saringan tidak semestinya individu unik merentas bulan. Pencapaian sasaran bukan liputan populasi. Data tidak menerangkan punca perbezaan dan bukan bukti hubungan sebab-akibat.'].join('\n');
}
$('filterNegeri').addEventListener('change',render);$('filterBulan').addEventListener('change',render);$('refreshBtn').addEventListener('click',loadData);
$('entryForm').addEventListener('submit',event=>{
event.preventDefault();if(sending||!$('entryForm').reportValidity())return;
sending=true;$('submitBtn').disabled=true;message('formStatus','Sedang menyimpan...');
const input={negeri:$('negeri').value,bulan:$('bulan').value,sasaran:$('sasaran').value,disaring:$('disaring').value};
google.script.run.withSuccessHandler(result=>{
sending=false;message('formStatus',result.mesej+' ID: '+result.id);$('entryForm').reset();loadData();
}).withFailureHandler(e=>{
sending=false;$('submitBtn').disabled=false;message('formStatus',(e.message||String(e))+' Jika sambungan terputus, semak Google Sheets sebelum cuba lagi.',true);
}).saveRecord(input);
});
$('copyBtn').addEventListener('click',async()=>{
try{await navigator.clipboard.writeText($('summary').value);$('copyStatus').textContent='Ringkasan disalin.';}
catch(e){$('summary').focus();$('summary').select();$('copyStatus').textContent='Tekan Ctrl+C atau Cmd+C untuk menyalin teks yang dipilih.';}
});
loadData();
</script>
</body>
</html>
Ini latihan tambahan selepas portal rujukan lulus. Kod baharu daripada Gemini mesti diuji semula; kejayaan kod rujukan tidak membuktikan semua variasi kod AI akan berfungsi.
P32 · Jana backend daripada spesifikasi
Tampal dalam: Gemini · latihan tambahan
Saya mahu membina semula backend latihan daripada kontrak data P12. Gunakan Code.gs rujukan yang saya tampal selepas ini sebagai spesifikasi tingkah laku.
Hasilkan Code.gs lengkap yang mengekalkan fungsi doGet, setupLatihan, getData dan saveRecord, tab Data dan header yang sama. Gunakan Script Properties untuk ID spreadsheet, validasi server, LockService dan semakan negeri+bulan unik. Return data JSON tanpa objek Date.
Jangan tambah API key, fungsi padam/reset atau sistem login sendiri. Jangan hasilkan frontend dahulu. Tunggu saya tampal kod rujukan.
Log ujian peserta
Gunakan pilihan status dan catatan pada setiap baris. Catatan tersimpan dalam browser ini sahaja.
Isi status sendiri: Belum diuji / Lulus / Perlu baiki. Jangan hantar rekod tambahan sebelum menyemak baseline.
Ujian
Hasil dijangka
Status dan bukti
Setup pertama
6 rekod; 900 sasaran, 660 disaring, 73.33%
Run setup kali kedua
Masih 6 rekod; tiada spreadsheet tambahan
Utama → Borang → Dashboard
Ketiga-tiga paparan melalui satu URL /exec
Hantar Melaka, 2026-03, 100, 80
Mesej dengan ID; tepat satu rekod baharu dalam Sheets
Semua penapis selepas simpan
7 rekod; 1000 sasaran, 740 disaring, 74.00%
Johor sahaja
200 sasaran, 170 disaring, 85.00%
Johor + 2026-02
100 sasaran, 90 disaring, 90.00%
Kedah + 2026-02
Tiada rekod; KPI 0, 0 dan —
Hantar Melaka Mac sekali lagi
Ditolak; jumlah rekod kekal 7
Borang kosong / sasaran 0 / perpuluhan
Ditolak; tiada rekod baharu
Reload browser
Rekod masih ada selepas dibaca semula dari Sheets
Ubah landing + deploy New version
Teks baharu muncul; borang dan dashboard masih berfungsi
Ringkasan → Copied text NotebookLM
Angka dan penapis sepadan; sumber snapshot dapat dibaca
Rehat dan demonstrasi fasilitator ialah sebahagian tentatif. Sasaran minimum: satu artikel disemak, satu portal berfungsi dan satu cerita data yang boleh dipertahankan.