ฟังก์ชันหลัก:
populateDropdown: เติมข้อมูลใน dropdown.addForm: สร้างฟอร์มใหม่.initForm: เริ่มต้นฟอร์มแรกด้วยข้อมูลจาก Google Sheet.
การออกแบบนี้ยืดหยุ่นต่อการเพิ่มฟอร์มหรือปรับข้อมูลใหม่.
code.js
function doGet() {
return HtmlService.createHtmlOutputFromFile('index')
.setTitle("ระบบจัดทีม")
.addMetaTag('viewport','width=device-width , initial-scale=1.0')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
}
// ดึงข้อมูลจาก Google Sheet
function getSheetData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('list');
const data = sheet.getDataRange().getValues();
const obj = {};
data.slice(1).forEach(([area, subArea, mainWork, detailWork]) => {
if (!obj[area]) obj[area] = {};
if (!obj[area][subArea]) obj[area][subArea] = [];
obj[area][subArea].push([mainWork, detailWork]);
});
return obj;
}
index.html
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Dropdown</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-4">
<h3>Dynamic Dropdown Form</h3>
<div id="formContainer"></div>
<button class="btn btn-primary mt-3" onclick="addForm()">Add Form</button>
</div>
<template id="formTemplate">
<div class="formGroup">
<div class="card mb-3">
<div class="card-body">
<div class="row">
<div class="col mb-3">
<label for="colA">AREA</label>
<select class="form-select colA" required>
<option value="" disabled selected>Select AREA</option>
</select>
</div>
<div class="col mb-3">
<label for="colB">LOCATION</label>
<select class="form-select colB" disabled required>
<option value="" disabled selected>Select LOCATION</option>
</select>
</div>
</div>
<div class="row">
<div class="col mb-3">
<label for="colC">MAIN WORK</label>
<select class="form-select colC" disabled required>
<option value="" disabled selected>Select MAIN WORK</option>
</select>
</div>
<div class="col mb-3">
<label for="colD">WORK DETAIL</label>
<select class="form-select colD" disabled required>
<option value="" disabled selected>Select WORK DETAIL</option>
</select>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
let sheetData = {};
// โหลดข้อมูลจาก Google Sheet
google.script.run.withSuccessHandler(initForm).getSheetData();
function initForm(data) {
sheetData = data;
addForm(); // สร้างฟอร์มแรกเมื่อโหลดเสร็จ
}
function addForm() {
const template = document.getElementById('formTemplate').content.cloneNode(true);
const container = document.getElementById('formContainer');
const formGroup = template.querySelector('.formGroup');
const colA = formGroup.querySelector('.colA');
const colB = formGroup.querySelector('.colB');
const colC = formGroup.querySelector('.colC');
const colD = formGroup.querySelector('.colD');
// เติมข้อมูลใน Dropdown แรก (AREA)
populateDropdown(colA, Object.keys(sheetData));
colA.addEventListener('change', () => {
populateDropdown(colB, Object.keys(sheetData[colA.value] || {}));
colB.disabled = !colA.value;
colC.disabled = true;
colD.disabled = true;
colC.innerHTML = '<option value="" disabled selected>Select MAIN WORK</option>';
colD.innerHTML = '<option value="" disabled selected>Select WORK DETAIL</option>';
});
colB.addEventListener('change', () => {
populateDropdown(colC, (sheetData[colA.value]?.[colB.value] || []).map(item => item[0]));
colC.disabled = !colB.value;
colD.disabled = true;
colD.innerHTML = '<option value="" disabled selected>Select WORK DETAIL</option>';
});
colC.addEventListener('change', () => {
populateDropdown(colD, (sheetData[colA.value]?.[colB.value] || [])
.filter(item => item[0] === colC.value)
.map(item => item[1]));
colD.disabled = !colC.value;
});
container.appendChild(formGroup);
}
function populateDropdown(dropdown, options) {
dropdown.innerHTML = '<option value="" disabled selected>Select an Option</option>';
options.forEach(option => {
const opt = document.createElement('option');
opt.value = option;
opt.textContent = option;
dropdown.appendChild(opt);
});
}
</script>
</body>
</html>
1. โครงสร้าง HTML
formContainer: เป็นคอนเทนเนอร์ที่ใช้เก็บฟอร์มต่าง ๆ ที่ถูกสร้างขึ้น.- ปุ่ม
Add Form: ใช้เพื่อเพิ่มฟอร์มใหม่เมื่อกดปุ่ม โดยเรียกใช้ฟังก์ชันaddForm().
2. Template ฟอร์ม (ใช้ <template>)
<template>: ใช้เก็บโครงสร้าง HTML ของฟอร์มแต่ละชุด.formGroup: คลาสที่ครอบฟอร์มหนึ่งชุด.- มี 4 dropdown:
- AREA (เลือกโซน)
- LOCATION (เลือกตำแหน่งในโซน)
- MAIN WORK (เลือกประเภทงาน)
- WORK DETAIL (รายละเอียดงาน)
3. การโหลดข้อมูลจาก Google Apps Script
google.script.run: ใช้สำหรับเรียกฟังก์ชันจาก Google Apps Script.getSheetData(): ฟังก์ชันใน Google Apps Script ที่ส่งข้อมูลจาก Google Sheet กลับมา (ในรูปแบบ JSON).withSuccessHandler(initForm): กำหนดฟังก์ชันinitFormเพื่อรับข้อมูลที่ส่งกลับมา.
4. ฟังก์ชัน initForm
data: เป็นข้อมูลที่ดึงมาจาก Google Sheet ในรูปแบบ JSON ที่มีโครงสร้างดังนี้:
5. ฟังก์ชัน addForm
template: ดึง<template>จาก HTML และสร้างสำเนาของมัน.container: อ้างอิงถึงคอนเทนเนอร์ที่เก็บฟอร์ม.formGroup: กลุ่มฟอร์มที่สร้างจาก template.
Dropdown Binding
- อ้างอิงถึง dropdown 4 ตัว (AREA, LOCATION, MAIN WORK, WORK DETAIL) ในฟอร์มที่ถูกสร้างใหม่.
6. การเติมข้อมูลลงใน Dropdown
เติม AREA (Dropdown แรก)
populateDropdown(colA, Object.keys(sheetData)):- ดึงชื่อ AREA จาก
sheetData(คีย์หลักของ JSON). - เติมข้อมูลใน dropdown
colA.
- ดึงชื่อ AREA จาก
colA.addEventListener('change'):- เมื่อเลือก
AREA:- เติม dropdown
LOCATION(colB) ด้วยข้อมูลจาก JSON ที่เกี่ยวข้อง. - ปิดการใช้งาน dropdown ถัดไป (MAIN WORK, WORK DETAIL) จนกว่าจะเลือกค่า.
- เติม dropdown
- เมื่อเลือก
เติม LOCATION และรีเซ็ต Dropdown ถัดไป
- เมื่อเลือก
LOCATION:- เติม dropdown
MAIN WORK(colC) ด้วยงานหลักที่เกี่ยวข้อง (PIPING1,PIPING2, ...).
- เติม dropdown
เติม MAIN WORK และแสดง WORK DETAIL
- เมื่อเลือก
MAIN WORK:- เติม dropdown
WORK DETAIL(colD) ด้วยรายละเอียดงานที่ตรงกับงานหลัก.
- เติม dropdown
7. ฟังก์ชัน populateDropdown
- ใช้เติมข้อมูลใน dropdown:
- เคลียร์ตัวเลือกเก่าทั้งหมด.
- เพิ่ม
<option>สำหรับแต่ละค่าที่ได้รับมาในoptions.
ถ้าไม่ทำตามเองคงสิมีงง
ตอบลบ