Med-Ready Assessment Test | OnDemand
body {
font-family: 'Kanit', sans-serif;
-webkit-tap-highlight-color: transparent;
}
.step-transition {
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Custom radio styling for light/red theme */
input[type="radio"]:checked + span {
background-color: #dc2626; /* bg-red-600 */
color: white;
border-color: #dc2626;
transform: scale(1.08);
box-shadow: 0 4px 6px -1px rgba(220, 38, 38, 0.2);
}
OnDemand Med-School
แบบทดสอบประเมินตนเองเพื่อวิเคราะห์ความพร้อมสู่คณะแพทยศาสตร์ กสพท
01
ข้อมูลทั่วไปของนักเรียน
มัธยมศึกษาปีที่ 4
มัธยมศึกษาปีที่ 5
มัธยมศึกษาปีที่ 6
เด็กซิ่ว
4.0) this.value = '4.00';" onblur="if(this.value) this.value = parseFloat(this.value).toFixed(2);" class="w-full bg-gray-50 border border-gray-300 rounded-xl px-4 py-3 text-base text-slate-900 placeholder-gray-400 focus:bg-white focus:border-red-500 focus:ring-2 focus:ring-red-500/20 transition-all outline-none" placeholder="เช่น 3.85">
อื่นๆ
อันดับ 1
อันดับ 2
อันดับ 3
02
ประเมินศักยภาพรอบด้าน (15 คำถามเจาะลึก)
* โปรดเลือกประเมินให้คะแนนตรงตามข้อเท็จจริงในปัจจุบันของน้องมากที่สุด
กำลังประมวลผลรอยรั่วทางวิชาการเชิงลึก...
OnDemand Med-Assessment Personal Report
ระดับความพร้อมสอบแพทย์
0/100
Med-Challenger
// ----------------------------------------------------
// 1. ตัวแปรสำหรับเชื่อม Google Apps Script Database
// ----------------------------------------------------
const GOOGLE_SCRIPT_URL = "https://script.google.com/macros/s/AKfycbw4iVaHM0UEpxwYyLnmcJty7nzBejwODULkvK6M8dXEKzu62xjbC_S5MjdlLGUbkzav/exec";
const sessionUid = Date.now().toString(36) + Math.random().toString(36).substring(2);
// ----------------------------------------------------
// 2. ข้อมูลชุดโจทย์แบบทดสอบ 15 ข้อหลัก
// ----------------------------------------------------
const quizData = [
// Part 1: เป้าหมาย (Goal Clarity)
{ id: 1, part: 1, name: "เป้าหมายชัดเจนว่าทำไมต้องเป็นหมอ ไม่ใช่แค่กระแสชั่ววูบหรือค่านิยม" },
{ id: 2, part: 1, name: "เข้าใจเกณฑ์คะแนนคำนวณขั้นต่ำ กสพท (TPAT1, A-Level) สถิติต่างๆ ในหัวข้อเป้าหมาย" },
{ id: 3, part: 1, name: "ศึกษาและเข้าใจในชีวิตวิถีการเรียนหมอ ตลอดจนความรับผิดชอบและการทำงานจริงหลังเรียนจบ" },
// Part 2: การวางแผน (Planning)
{ id: 4, part: 2, name: "มีแผนงานและ Timeline การเตรียมตัวเก็บเนื้อหา ม.ปลาย และฝึกโจทย์อย่างละเอียดแบบรายสัปดาห์/เดือน" },
{ id: 5, part: 2, name: "เริ่มเก็บเนื้อหา ม.ปลาย ล่วงหน้าไปบางส่วนแล้ว และมีระบบการทบทวนจัดสรรเวลาที่ดี" },
{ id: 6, part: 2, name: "มีแผนสำรอง (Plan B) หรือเป้าหมายคณะใกล้เคียงจัดเตรียมไว้ หากเกิดสถานการณ์คะแนนคลาดเคลื่อนจากคาดการณ์" },
// Part 3: ความพร้อมวิชาการ (Academic)
{ id: 7, part: 3, name: "เข้าใจเนื้อหาแก่นแท้ คอนเซ็ปต์ และที่มาของวิชาต่างๆ เป็นอย่างดี ไม่ใช่แค่จำสูตรลัดไปตอบ" },
{ id: 8, part: 3, name: "เมื่อเจอกลุ่มข้อสอบแนวใหม่ที่มีลักษณะโจทย์วิเคราะห์ประยุกต์ (แนว สสวท.) ยังสามารถคิดแยกประเด็นและแก้โจทย์ด้วยตนเองได้" },
{ id: 9, part: 3, name: "มั่นใจว่ามีระดับทักษะภาษาอังกฤษ (สำหรับ Textbook / สอบ A-Level) และตรรกะเชื่อมโยงอยู่ในเกณฑ์ที่ได้เปรียบคู่แข่ง" },
{ id: 10, part: 3, name: "มีแผนการฝึกทำแนวข้อสอบจำลองจับเวลาจริง (Mock Test / Super simulation) ล่วงหน้าก่อนสอบไม่ต่ำกว่า 3 เดือน" },
// Part 4: วินัยและการจัดการ (Discipline)
{ id: 11, part: 4, name: "มีวินัยจัดระเบียบเวลาทบทวนอ่านหนังสือด้วยตัวเอง สม่ำเสมอทุกๆ วัน โดยไม่มีคนคอยตักเตือนบังคับ" },
{ id: 12, part: 4, name: "สามารถควบคุมและหลีกเลี่ยงสิ่งเร้า เช่น สมาร์ทโฟน เกม นันทนาการ ในเวลาอ่านหนังสือได้ดี" },
{ id: 13, part: 4, name: "มีวิธีการรับมือและฟื้นฟูสภาพจิตใจจากความเหนื่อยล้า ความเครียดสะสม เพื่อป้องกันอาการหมดไฟ (Burnout)" },
// Part 5: การสนับสนุนจากครอบครัว (Family Support)
{ id: 14, part: 5, name: "ครอบครัวและผู้ปกครองเข้าใจ พร้อมสนับสนุนและเป็นเบาะรองรับกำลังใจที่ดีที่สุดในเส้นทางนี้" },
{ id: 15, part: 5, name: "ครอบครัวพร้อมอำนวยความสะดวกและสนับสนุนค่าใช้จ่ายในการเรียน (อุปกรณ์, ตราสารตำราเรียน, และหลักสูตรกวดวิชา) อย่างเต็มใจ" }
];
const partNames = {
1: "พาร์ท 1: เป้าหมายชัดเจน (Goal Clarity)",
2: "พาร์ท 2: แผนงานเป็นระบบ (Planning)",
3: "พาร์ท 3: ความพร้อมวิชาการ (Academic)",
4: "พาร์ท 4: วินัยอย่างต่อเนื่อง (Discipline)",
5: "พาร์ท 5: การสนับสนุนจากครอบครัว (Family Support)"
};
// เรนเดอร์คำถามแบบอัตโนมัติ (เปลี่ยนธีมสีในส่วน JS Render เป็นสีแดง)
const container = document.getElementById('questionsContainer');
quizData.forEach((q, idx) => {
let partHeaderHtml = "";
if (idx === 0 || quizData[idx-1].part !== q.part) {
partHeaderHtml = `
${partNames[q.part]}
`;
}
const qHtml = `
${partHeaderHtml}
${q.id}. ${q.name}
น้อยสุด
${[1, 2, 3, 4, 5].map(num => `
`).join('')}
มากสุด
`;
container.insertAdjacentHTML('beforeend', qHtml);
});
function hideFormError() {
const errBox = document.getElementById('formErrorBox');
errBox.classList.add('hidden');
}
function showFormError(message) {
const errBox = document.getElementById('formErrorBox');
const errMessage = document.getElementById('formErrorMessage');
errMessage.innerText = message;
errBox.classList.remove('hidden');
errBox.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
// ฟังก์ชันช่วยสุ่มกรอกข้อมูลอัตโนมัติ
function autoFillForTesting() {
hideFormError();
document.getElementById('firstname').value = "สมมติ";
document.getElementById('lastname').value = "สอบหมอ";
document.getElementById('phone').value = "0811111111";
document.getElementById('line_id').value = "testlineid";
document.getElementById('learn_id').value = "OD123456";
document.getElementById('grade').value = "ม.5";
document.getElementById('gpax').value = "3.89";
const cbFaculties = document.getElementsByName('faculty_opt');
cbFaculties.forEach(cb => cb.checked = false);
cbFaculties[0].checked = true;
if (Math.random() > 0.5) {
cbFaculties[1].checked = true;
}
document.getElementById('univ_1').value = "มหาวิทยาลัยมหิดล (คณะแพทยศาสตร์ศิริราชพยาบาล)";
document.getElementById('univ_2').value = "จุฬาลงกรณ์มหาวิทยาลัย";
document.getElementById('univ_3').value = "มหาวิทยาลัยธรรมศาสตร์";
quizData.forEach(q => {
const randomVal = Math.floor(Math.random() * 5) + 1;
const radioOption = document.querySelector(`input[name="q_${q.id}"][value="${randomVal}"]`);
if (radioOption) radioOption.checked = true;
});
}
// 🌟 ส่งข้อมูลเข้า Google Sheets
function sendDataToSheets(priorityLevel) {
const checkedFaculties = Array.from(document.querySelectorAll('input[name="faculty_opt"]:checked')).map(el => {
if (el.value === "อื่นๆ") {
const otherText = document.getElementById('faculty_other_text').value.trim();
return otherText ? `อื่นๆ (${otherText})` : "อื่นๆ";
}
return el.value;
});
const leadData = {
firstName: document.getElementById('firstname')?.value || "",
lastName: document.getElementById('lastname')?.value || "",
phone: "'" + (document.getElementById('phone')?.value || ""),
lineId: document.getElementById('line_id')?.value || "",
learnId: document.getElementById('learn_id')?.value || "",
grade: document.getElementById('grade')?.value || "",
gpax: document.getElementById('gpax')?.value || "",
faculties: checkedFaculties.join(', '),
dreamUniversities: [
document.getElementById('univ_1')?.value || "",
document.getElementById('univ_2')?.value || "",
document.getElementById('univ_3')?.value || ""
],
scoreInfo: {
totalScore: document.getElementById('resTotalScore')?.innerText || "0/100"
},
priority: priorityLevel,
uid: sessionUid
};
fetch(GOOGLE_SCRIPT_URL, {
method: "POST",
mode: "no-cors",
cache: "no-cache",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(leadData)
}).catch(err => console.warn("Network deferred:", err));
}
// ฟังก์ชันวาดแผนภูมิใยแมงมุม (Radar Chart) สีแดง CI
let radarChartInstance = null;
function drawRadarChart(scores) {
try {
const canvasEl = document.getElementById('scoreRadarChart');
if (!canvasEl) return;
const ctx = canvasEl.getContext('2d');
if (radarChartInstance) {
radarChartInstance.destroy();
}
if (typeof Chart === 'undefined') {
console.warn("ChartJS library not loaded properly.");
return;
}
radarChartInstance = new Chart(ctx, {
type: 'radar',
data: {
labels: ['เป้าหมาย', 'แผนงาน', 'วิชาการ', 'วินัย', 'ครอบครัว'],
datasets: [{
label: 'สัดส่วนความพร้อม (%)',
data: scores,
fill: true,
backgroundColor: 'rgba(220, 38, 38, 0.15)', // สีแดงจางๆ
borderColor: 'rgb(220, 38, 38)', // เส้นขอบสีแดง
pointBackgroundColor: 'rgb(220, 38, 38)',
pointBorderColor: '#fff',
pointHoverBackgroundColor: '#fff',
pointHoverBorderColor: 'rgb(220, 38, 38)'
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false }
},
scales: {
r: {
angleLines: { color: 'rgba(203, 213, 225, 0.6)' },
grid: { color: 'rgba(203, 213, 225, 0.6)' },
pointLabels: {
color: '#475569',
font: { family: 'Kanit', size: 10, weight: '500' }
},
ticks: { display: false },
min: 0,
max: 100
}
}
}
});
} catch (chartErr) {
console.error("Chart generation failed:", chartErr);
}
}
// จัดการเหตุการณ์เมื่อนักเรียนส่งแบบฟอร์ม
document.getElementById('quizForm').addEventListener('submit', function(e) {
e.preventDefault();
hideFormError();
const checkedFaculties = Array.from(document.querySelectorAll('input[name="faculty_opt"]:checked')).map(el => {
if (el.value === "อื่นๆ") {
const otherText = document.getElementById('faculty_other_text').value.trim();
return otherText ? `อื่นๆ (${otherText})` : "อื่นๆ";
}
return el.value;
});
if (checkedFaculties.length === 0) {
showFormError("กรุณาเลือกกลุ่มคณะ กสพท ที่สนใจอย่างน้อย 1 ตัวเลือก");
return;
}
let unanswered = [];
quizData.forEach(q => {
const checkedRadio = document.querySelector(`input[name="q_${q.id}"]:checked`);
if (!checkedRadio) {
unanswered.push(q.id);
}
});
if (unanswered.length > 0) {
showFormError(`กรุณาตอบคำถามให้ครบทุกข้อ (ข้อที่ข้ามไป: ข้อ ${unanswered.join(', ')})`);
return;
}
document.getElementById('quizForm').classList.add('hidden');
document.getElementById('loadingState').classList.remove('hidden');
setTimeout(() => {
try {
let p1 = 0, p2 = 0, p3 = 0, p4 = 0, p5 = 0;
quizData.forEach(q => {
const checkedRadio = document.querySelector(`input[name="q_${q.id}"]:checked`);
const val = checkedRadio ? parseInt(checkedRadio.value) : 0;
if (q.part === 1) p1 += val;
if (q.part === 2) p2 += val;
if (q.part === 3) p3 += val;
if (q.part === 4) p4 += val;
if (q.part === 5) p5 += val;
});
const rawTotal = p1 + p2 + p3 + p4 + p5;
const totalScoreScale100 = Math.round((rawTotal / 75) * 100);
const p1Pct = Math.round((p1 / 15) * 100) || 0;
const p2Pct = Math.round((p2 / 15) * 100) || 0;
const p3Pct = Math.round((p3 / 20) * 100) || 0;
const p4Pct = Math.round((p4 / 15) * 100) || 0;
const p5Pct = Math.round((p5 / 10) * 100) || 0;
let tierName = "";
let tierStyle = "";
let levelTagline = "";
let levelDesc = "";
let levelNextSteps = [];
let levelRecommendation = "";
// ปรับแต่งสี Tag สรุปคะแนนให้เข้ากับธีมใหม่
if (totalScoreScale100 >= 80) {
tierName = "ระดับ 1: พร้อมมาก";
tierStyle = "bg-red-100 text-red-800 border border-red-200";
levelTagline = "คุณมีพื้นฐานที่ดีแล้ว เหลืออีกนิดก็พร้อมเต็มที่";
levelDesc = `น้องมีความพร้อมในหลายด้านแล้ว!
ผลประเมินแสดงให้เห็นว่าน้องมีทั้งเป้าหมายที่ชัดเจน มีการวางแผน และเริ่มเตรียมตัวได้ดี ถือว่าเป็นจุดเริ่มต้นที่ดีมากสำหรับเส้นทางสู่คณะแพทย์
แต่การสอบหมอในปัจจุบันไม่ได้วัดแค่ "เรียนครบ" เพราะข้อสอบมีการวิเคราะห์และประยุกต์มากขึ้นทุกปี ความได้เปรียบจึงอยู่ที่คนที่มีเวลา ทบทวนหลายรอบ ฝึกโจทย์หลากหลายรูปแบบ และวิเคราะห์จุดอ่อนของตัวเองอย่างต่อเนื่อง
ตอนนี้น้องยังมีเวลาในการพัฒนาตัวเองอีกมาก ถ้ายังมีวิชาไหนที่รู้สึกไม่มั่นใจ หรือยังไม่ได้ฝึกข้อสอบจริงอย่างเต็มที่ นี่คือช่วงเวลาที่เหมาะที่สุดในการเติมเต็มให้พร้อมก่อนสนามสอบ`;
levelNextSteps = [
"ทบทวนวิชาที่ยังไม่แข็งแรง",
"ฝึกโจทย์แนวประยุกต์และ Mock Test อย่างสม่ำเสมอ",
"วิเคราะห์ข้อผิดพลาดทุกครั้งที่ทำข้อสอบ"
];
levelRecommendation = "ให้พี่ออนดี้ช่วยวิเคราะห์จุดที่ควรเสริม พร้อมแนะนำคอร์สที่เหมาะกับระดับของน้อง เพื่อใช้เวลา 20 เดือนให้คุ้มที่สุด";
} else if (totalScoreScale100 >= 60) {
tierName = "ระดับ 2: พร้อมปานกลาง";
tierStyle = "bg-rose-50 text-rose-700 border border-rose-200";
levelTagline = "คุณกำลังเดินมาถูกทาง แต่ยังมีบางเรื่องที่เติมได้";
levelDesc = `น้องเริ่มต้นได้ดีแล้ว และยังมีโอกาสพัฒนาได้อีกมาก
จากผลประเมิน น้องมีความพร้อมในหลายด้าน แต่ยังมีบางส่วนที่สามารถเสริมได้ เช่น การวางแผนการอ่านหนังสือ การจัดลำดับความสำคัญของแต่ละวิชา หรือการสร้างความแข็งแรงด้านวิชาการในบางหัวข้อ
ข่าวดีคือ...ตอนนี้น้องยังมีเวลา
การเตรียมสอบหมอไม่จำเป็นต้องเก่งทุกอย่างตั้งแต่วันนี้ แต่ควรมีแผนที่ชัดเจน และค่อยๆ พัฒนาทีละก้าว เพราะความสำเร็จเกิดจากการสะสมของการลงมือทำอย่างต่อเนื่อง`;
levelNextSteps = [
"วาง Timeline การเตรียมสอบ",
"ประเมินว่าวิชาไหนควรเริ่มก่อน",
"เริ่มฝึกโจทย์ควบคู่กับการเก็บเนื้อหา"
];
levelRecommendation = "ลองให้พี่ออนดี้ช่วยวางแผนการเรียนให้เหมาะกับเป้าหมายของน้อง หรือเลือกเสริมเฉพาะวิชาที่ยังไม่มั่นใจ เพื่อให้ทุกเดือนที่เหลือสร้างความพร้อมได้มากที่สุด";
} else {
tierName = "ระดับ 3: พร้อมน้อย";
tierStyle = "bg-gray-100 text-gray-700 border border-gray-200";
levelTagline = "วันนี้คือจุดเริ่มต้นที่ดีที่สุด";
levelDesc = `💙 ไม่เป็นไร ถ้ายังไม่ได้เริ่ม เพราะวันนี้ยังทันที่จะวางแผน
ผลประเมินสะท้อนว่าน้องยังมีอีกหลายด้านที่สามารถพัฒนาได้ ไม่ว่าจะเป็นการตั้งเป้าหมาย การวางแผน การเตรียมเนื้อหา หรือการฝึกทำข้อสอบ
แต่อยากให้น้องสบายใจว่า
การสอบติดหมอ ไม่ได้เกิดจากการเร่งอ่านในช่วงท้าย แต่เกิดจากการเริ่มวางแผนและค่อยๆ สะสมความพร้อมในทุกวัน
วันนี้จึงไม่ใช่วันที่ต้องกังวล แต่เป็นวันที่เหมาะที่สุดในการเริ่มต้น`;
levelNextSteps = [
"ตั้งเป้าหมายให้ชัด",
"วางแผนการเรียนระยะยาว",
"เริ่มเก็บพื้นฐานทีละวิชา",
"สร้างวินัยในการเรียนอย่างต่อเนื่อง"
];
levelRecommendation = "ให้พี่ออนดี้ช่วยวางแผนการเตรียมสอบแบบรายบุคคล ตั้งแต่การเลือกวิชาที่ควรเริ่ม การจัดตารางอ่านหนังสือ ไปจนถึงการเตรียมตัวสำหรับสนามสอบ เพื่อให้น้องเริ่มต้นได้อย่างมั่นใจ";
}
const nextStepsHtml = levelNextSteps.map(step => `
📌
${step}
`).join('');
const consultBtnHtml = `
`;
const courseBtnHtml = `
🎓 คลิกเพื่อดูคอร์สเรียนที่ออกแบบมาเพื่อน้อง ๆ สอบหมอโดยเฉพาะ
`;
let ctaButtonsHtml = "";
if (totalScoreScale100 >= 80) {
ctaButtonsHtml = courseBtnHtml + consultBtnHtml;
} else {
ctaButtonsHtml = consultBtnHtml + courseBtnHtml;
}
const levelCardHtml = `
บทวิเคราะห์เฉพาะบุคคล
${levelTagline}
${levelDesc}
OnD
❤️ พี่ออนดี้ขอแนะนำ:
${levelRecommendation}
${ctaButtonsHtml}
`;
document.getElementById('dynamicLevelCard').innerHTML = levelCardHtml;
let strengths = [];
let weaknesses = [];
if (p1Pct >= 80) strengths.push("มีเป้าหมายและเหตุผลในการเข้าสู่เส้นทางสายแพทย์ที่มั่นคงและเข้าใจระบบคะแนนกสพทชัดเจน");
else if (p1Pct = 80) strengths.push("มีกระบวนการวางแผนและกำหนดแผนการเรียนระยะยาวที่เป็นระบบเด่นชัด");
else if (p2Pct = 80) strengths.push("มีความพร้อมทางวิชาการและแนวคิดเชิงวิเคราะห์โจทย์ประยุกต์ที่ดีเป็นทุนเดิม");
else if (p3Pct = 80) strengths.push("มีวินัยการจัดแบ่งเวลาอ่านหนังสือและควบคุมสิ่งเร้าภายนอกรอบตัวได้อย่างสม่ำเสมอ");
else if (p4Pct = 80) strengths.push("มีสภาพแวดล้อมทางบ้านคอยให้คำแนะนำ กำลังใจ และการสนับสนุนทุนทรัพย์การเรียนอย่างเต็มกำลัง");
else if (p5Pct `
✔
${item}
`).join('');
document.getElementById('resWeaknesses').innerHTML = weaknesses.map(item => `
✖
${item}
`).join('');
document.getElementById('loadingState').classList.add('hidden');
document.getElementById('resultBox').classList.remove('hidden');
drawRadarChart([p1Pct, p2Pct, p3Pct, p4Pct, p5Pct]);
window.scrollTo({ top: 0, behavior: 'smooth' });
sendDataToSheets("ปกติ");
} catch (fatalErr) {
console.error("Fatal form processing error:", fatalErr);
document.getElementById('loadingState').classList.add('hidden');
document.getElementById('quizForm').classList.remove('hidden');
showFormError("เกิดข้อผิดพลาดในการคำนวณผลลัพธ์: " + fatalErr.message);
}
}, 1200);
});
// 🌟 เมื่อเด็กคลิกขอรับคำปรึกษา
function requestConsultation() {
const btn = document.getElementById('consultBtn');
if (!btn) return;
sendDataToSheets("🔥 ขอรับคำปรึกษา 🔥");
// เปลี่ยนหน้าตาปุ่มเป็นสไตล์กดแล้วของ Light Theme
btn.innerHTML = `✅ บันทึกข้อมูลเรียบร้อยแล้ว! เจ้าหน้าที่จะรีบติดต่อกลับ`;
btn.disabled = true;
btn.classList.remove('from-slate-800', 'to-slate-900', 'hover:from-slate-700', 'hover:to-slate-800', 'text-white');
btn.classList.add('bg-gray-100', 'text-red-600', 'border', 'border-gray-200', 'cursor-not-allowed', 'opacity-90', 'shadow-none');
}