5.3. พฒัพ นาการทที่ 1 : หา ID ของ Item
Items(คาส ถาม) ทลชั่อยูย่มใน Form มล ID ประจาส ตชว กย่อนอชัืร่นเราตข้องหา ID ของ Items มาก่ยอน เพัรืช่อจะได้ขจชบ
ไปทัชล่ Item ตวช นน้ชี ไดข้
เรชัิ่มม ตนข้ เราจะหา Item ทีช้งหมดกอ่ย น
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ; // ID ของไฟล์ล Google Sheet
var formID = "1CA7J-OU6wCD6RxdZYbomggclAeDiOtbMkboYFe7RALE" ; // ID ของไฟล์ล Google Form
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data"); // จรับไปททีช่ ้ัทททีทม่ ขท ้ขอมมลู
var form = FormApp.openById(formID); // จบัร ไป Form
function myFunction() {
var items = form.getItems();
Logger.log(items); // พมิพ พ์ล : [item] - มอท ยยู่ม 1 item // ดตมู ่อย ใน Logs – >
Logger.log(typeof items); // พมิพ พล์ : object // ดตมู ยอ่ ใน Logs – >
for(i=0 ; i < items.length ; i++) {
Logger.log(items[i].getId().toString()); // พมิพ พล์ : ตัวร เลข ID // ดตูม อ่ย ใน Logs – >
};
}
ผล
Logs
[ 01 ] [Item] - มอท ยยูม่ 1 ดตูม ามสมาชพกิ อาเรยล์
[ 02 ] object
[ 03 ] 1469553275
5.4. พฒพั นาการทที่ 2 : จบัพ คณป สมบพตั รติ าย่ งๆของ Item มา Log ดูม
จบช คุณท สมบชตมิตยา่ งๆของ Item มา Log ดูม
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var formID = "1CA7J-OU6wCD6RxdZYbomggclAeDiOtbMkboYFe7RALE" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
var form = FormApp.openById(formID);
function myFunction() {
// จบรั Item ตาม ID
var items = form.getItemById(1469553275) ;
Logger.log(items.getTitle()) ; // ดตมู อ่ย ใน Logs – >
Logger.log(items.getType()) ; // ดตมู ย่อใน Logs – >
}
เรยล บเรยล งโดย วสนัร ต์ล คณุค ดลิพ กเศวต ([email protected]) 51
ผล
Logs
[ 01 ] ผลไม้ขทคีท่ด ณุค ชอบ ?
[ 02 ] LIST
5.5. พัพฒนาการทท่ี 3 : ใสย่ช้อน ยส์ใล ห้นกบัพ คคาถาม
Item ทชลัเ่ ราจบช มาได้ข มล Type เปนป็ List ฉะนชี้นเราจะใชข้ Method asListItem() ตอ่ย ทาข้ ย เพืชอัร่ ดดึง Method
ทลชัเ่ กชยั่ล วกชบ List ออกมาใชข้ จากนน้ชี กจ็ใสต่ย วช เลอืร กตาย่ งๆ ลงไปดวข้ ย Method setChoiceValues([Values])
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var formID = "1CA7J-OU6wCD6RxdZYbomggclAeDiOtbMkboYFe7RALE" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
var form = FormApp.openById(formID);
function myFunction() {
// จบัร Item ตาม ID
var items = form.getItemById(1469553275) ;
var values = [ "แอปเป้ิลป " , "กลว้ข ย" , "สข้ม" ]
item.asListItem().setChoiceValues(values);
}
ผล – ใหขไ้ ปดูทม ชลั่ Form จะปรากฎช้อข ยสข์ล องคาส ถามตามคา่ย ตชวแปรในโคด้ข
5.6. พัฒพ นาการทท่ี 4 : แยกฟฟงั ก์ชล ทันี่พ
5.6.ก.) แยกฟัฟงกช์ล วัที่นครง้วัรี ที่ทด 1
ขนช้ี ตอนน้ีชลเราจะแยกฟังฟ กล์ชชน่ั ออกมา ฟังฟ กช์ล ัช่น updateDropdown ใชใข้ สช่ย ขอ้ ยสล์ให้กข บช คสาถาม ทมลชั่ ล Type เปน็ป
List ฟัฟงกช์ล น่ชั myFunction เป็นป ฟงัฟ กจ็ชนัช่ หลกช
52 เรทยนรกมูน้ ารสรนา้ งโปรเจจ็ค Google Apps Script เลว่ม 1
myFunction ตอ้ข งหา ID ของ Items(หรรือคาส ถาม) อกล ครชีง้ เพราะตอ้ข งใชเ้ข ปป็น Argrument สยง่ ให้ข ฟังฟ ก์ชล ่ชนั
updateDropdown แตย่ครชงี้ นจล้ีช ะใช้คข นละวธมิ ใล นการหา
ครช้ีงนลชี้ จะหา ID ของ Item จากชืช่อรั Title เชย่น ผลไมทข้ ทีดค่ ณุค ชอบ ? เปปน็ ต้นข
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var formID = "1CA7J-OU6wCD6RxdZYbomggclAeDiOtbMkboYFe7RALE" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
var form = FormApp.openById(formID);
function myFunction() {
var title = "ผลไม้ทข ดี่ทคุณค ชอบ ?" ;
var items = form.getItems() ;
var titles = items.map(function(item){
return item.getTitle();
});
// *****************************************************************
Logger.log(titles) ; // พพิมพล์ : [ผลไมทข้ ค่ีดท ุณค ชอบ ?, คกาถามใหมว่]
Logger.log(titles.indexOf(title)) ; // หาดรรชนลท าท ดบัร ตามชอ่ีพท Title ในอาเรย์ล
// พมิพ พ์ล : 0.0
var pos = titles.indexOf(title) ; // จบรั 0.0 ใสตย่ ัรวแปร
var item = items[pos] ; // จรับ Item คาย่ ในอาเรย์ล items ดรรชนลท ทาดบัร ทท่ี 0 ใส่ตย ัวร แปร
var itemID = item.getId() ; // จับร ID ของ Item ใส่ยตวัร แปร
var values = [ "A" , "B" , "C" ]
updateDropdown(itemID,values) ;
// *****************************************************************
}
// ใส่ชย อ้ข ยสล์ให้กข บัร คทาถาม ททีม่ ท Type เปนป็ List
function updateDropdown(id,values) {
var item = form.getItemById(id) ;
item.asListItem().setChoiceValues(values) ;
}
ผล
เรลยบเรลยงโดย วสัรนตล์ คณุค ดลิพ กเศวต ([email protected]) 53
5.6.ข.) แยกฟฟงั ก์ชล นท่ีัว ครรว้งีั ท่ีทด 2
เราจะปรชบโคดข้ อกล คร้งชี โดยแยกฟังฟ กช์ล ัน่ช อลก เพัืร่ชอให้ขโคดข้ อาย่ นงา่ย น
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var formID = "1CA7J-OU6wCD6RxdZYbomggclAeDiOtbMkboYFe7RALE" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
var form = FormApp.openById(formID);
function main(){
var title = "ผลไมขท้ ีคดท่ ุคณชอบ ?" ;
var values = [ "X" , "Y" , "Z" ] ;
updateDropDownUsingTitle(title,values) ;
}
function updateDropDownUsingTitle(title,values) {
var title = "ผลไมข้ทดคี่ท ุคณชอบ ?" ;
var items = form.getItems() ;
var titles = items.map(function(item){
return item.getTitle();
});
var pos = titles.indexOf(title) ; // จบัร 0.0 ใส่ยตวรั แปร
var item = items[pos] ; // จบัร Item คา่ย ในอาเรย์ล items ดรรชนลท าท ดรับทท่ี 0 ใส่ตย วรั แปร
var itemID = item.getId() ; // จบรั ID ของ Item (ใน From) ใสยต่ รวั แปร
var values = [ "A" , "B" , "C" ]
updateDropdown(itemID,values) ;
}
function updateDropdown(id,values) {
var item = form.getItemById(id) ;
item.asListItem().setChoiceValues(values) ;
}
ผล
54 เรยท นรกมูน้ ารสร้าน งโปรเจจ็ค Google Apps Script เลว่ม 1
5.7. แก้นไข Form และ Google Sheet
ก่ยอนจะไปตอ่ย ใหข้แก้ไข ข Form โดยเพมิม่ัช Item ใน Form และ เพ่ัชมิม ข้อข มลูม อลก 1 คอลมช นล์ใน Google Sheet
สชงเกตวุท ่าย คาส ถามทลัช่ Form กชบทชล่ั Google Sheet ข้อข ความเหมอรื นกชนทกทุ ประการ (Copy and Paste)
แกไข้ ข Form - ใหขเ้ ป็ปนดงช นชีล้
แกไข้ ขขอ้ข มูลม ใน Google Sheet – ใหเข้ ปป็นดชงนี้ชล มล 2 คสาถาม ใน 2 คอลชมนล์
5.8. พฒพั นาการที่ท 5 : จบพั ขน้อมมูลใน Google Sheet ไปสร้นาง Item ใน From
5.8.ก.) จัวบแถวคกาถามมา Log ดูม
ขช้นี ตอนนล้ีชเราจะจชบแถวคสาถามใน Google Sheet มา Log ดกมู อ่ย น เฉพาะทฟัช่ล ัฟงกช่ัชน Main เขลยนโค้ดข ดงช น้ชลี
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จบัร 1 มิตพ พิ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
Logger.log(labels);
}
เรลยบเรยล งโดย วสรันต์ล คณุค ดพิลกเศวต ([email protected]) 55
ผล
[ 01 ] [ผลไมทข้ ดีท่คคุณชอบ ?, คกาถามใหม่ว]
5.8.ข.) จวบั แถวคกาถามมา Log ดูม - ดูมขข้อมมูลเพมิทีด่
ใช้ข forEach วนเขข้าไปดมูค่ยาและดรรนลลสาดชบของ ขอข้ มมูลทั่จชล บช มาจาก Google Sheet
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จบัร 1 มติพ ิพ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
labels.forEach(function(label,i){ // Value
Logger.log(label); // Index
Logger.log(i);
});
}
ผล
[ 01 ] ผลไมทข้ ทีคด่ คณุ ชอบ ?
[ 02 ] 0.0
[ 03 ] คกาถามใหม่ว
[ 04 ] 1.0
5.8.ค.) จับว ช้อข ยสล์มา Log ดูม
เราจบช สวย่ นทั่เชล ป็ปนคาส ถามไดแข้ ลวข้ ถดช มาจะเปป็นการจชบไปทชั่ลชขอ้ ยสล์ของแตยล่ ะคาส ถาม
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จบัร 1 มติพ พิ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
labels.forEach(function(label,i){
Logger.log(label); // Value
// วนจับร ททละคอลัมร นล์
var options = wsData.getRange(2,i+1,wsData.getLastRow()-1,1).getValues();
Logger.log(options); // ชอ้ข ยส์ล
});
}
ผล
[ 01 ] ผลไมทข้ ทีด่คณุค ชอบ ?
[ 02 ] [[แอปเปิป้ล], [กลวข้ ย], [สม้ข ]]
[ 03 ] คกาถามใหม่ว
[ 04 ] [[ใชว่], [ไมใ่ว ช่ว], []]
56 เรยท นรกู้นม ารสร้นางโปรเจจ็ค Google Apps Script เลว่ม 1
5.8.ง.) จัวบช้ขอยสม์ล า Log ดูม
เนอ่ืรชั งจากชข้อยส์ลทจัช่ล บช มาเปนป็ อาเรย์ล 2 มตมิ มิ เราจะทาส ใหข้เหลือร แค่ย 1 มิตม มิ
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จรบั 1 มพติ พิ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
labels.forEach(function(label,i){
Logger.log(label); // Value
// วนจรบั ทลท ะคอลรมั นล์
var options = wsData
.getRange(2,i+1,wsData.getLastRow()-1,1)
.getValues()
.map(function(o){ return o[0]}); // เอาเฉพาะสมาชิพกตัวร แรก
Logger.log(options); // ชขอ้ ยสล์
});
}
ผล
[ 01 ] ผลไมทข้ คีด่ท ณุค ชอบ ?
[ 02 ] [แอปเปิป้ล, กล้ขวย, สขม้ ]
[ 03 ] คกาถามใหมว่
[ 04 ] [ใช่ว, ไม่ใว ช่ว, ] - มทค่ยาวย่างอย่ยมู เดดี๋ยท วไปว่าย กรนั ททหลงรั
5.8.จ.) จบวั ขอข้ มลูม ใน Google Sheet ไปสรา้ข ง Item ใน Form
ถดึงเวลาจชบข้ขอมมูลใน Google Sheet ไปสรข้าง Item ใน From ก็จเปลชั่ลยนจาก Log เปป็นเรลยกใชข้ฟัฟงก์ลช่ชัน
updateDropDownUsingTitle
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จัรบ 1 มพิตพิ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
labels.forEach(function(label,i){
Logger.log(label); // Value
// วนจัรบทลท ะคอลมรั นล์
var options = wsData
.getRange(2,i+1,wsData.getLastRow()-1,1)
.getValues()
.map(function(o){ return o[0]}); // เอาเฉพาะสมาชกิพ ตรัวแรก
updateDropDownUsingTitle(label,options); // ใส่ยชอข้ ยสใล์ น Form
});
}
เรลยบเรลยงโดย วสนัร ต์ล คณคุ ดลิพ กเศวต ([email protected]) 57
ผล – สชงเกตวทุ า่ย ทชคัล่ ย่าว่าย งในอาเรย์ล [ใช,่ว ไมใ่ว ช่ว, ] (ตวช ท่ชลั 3 วาย่ ง) กลายเปป็นช้ขอยส์ลท่ชไลั ม่มย ลขอ้ข ความ
5.8.ฉ.) กกาจดัว ควา่ วาว่ งในอาเรยลช์ อ้ข ยส์ล
ทอ่ัชล าเรยล์ของชอข้ ยสล์ ใช้ข Method filter เพัชือ่ร กรองคยา่ ว่าย งทง้ีชิม
var ssID = "1dqs-M-llGZXE8yYvtPCALu-dz2UV3FFWGNtwY0sGUU0" ;
var wsData = SpreadsheetApp.openById(ssID).getSheetByName("Data");
function main(){
// จบัร 1 มพิตพิ
var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
labels.forEach(function(label,i){
Logger.log(label); // Value
// วนจรบั ททละคอลมรั นล์
var options = wsData
.getRange(2,i+1,wsData.getLastRow()-1,1)
.getValues()
.map(function(o){ return o[0] }); // เอาเฉพาะสมาชิพกตรัวแรก
.filter(function(o){ return o !== "" }); // กรองคา่ย วา่ย งทพิ้ทัง
updateDropDownUsingTitle(label,options); // ใส่ชย อข้ ยสใ์ล น Form
});
}
5.9. พัพฒนาการทที่ 6 : ปปอ้ งกนัพ Error
สดทุ ทข้ายจะเปป็นการเขลยนโค้ขดป้ปองกชน Error กรณลคสาถามใน Google Sheet ไมต่ย รงกชบใน Form หรืรอ ใน
Form ไมม่ย คล สาถามทลชั่ตรงกชบ Google Sheet
58 เรทยนรก้นมู ารสร้าน งโปรเจ็จค Google Apps Script เล่วม 1
เชย่น เพริ่ีทมคาค ถามอทกคอลัพมน์ลใน Google Sheet ตามภาพ เมช่ัรือรชนฟัฟงกล์ชช่ัน Main จะเกมิด Error เพราะ
ไม่ยมล Item ใน Form
หากคา่ย ทลัส่ช ่งย ไปหาดรรนลลสาดชบ ไมมย่ ใล นอาเรยล์จะคนรื คา่ย -1 กลชบมา ตวช อยา่ย งเชน่ย
function test(){ // พมิพ พล์ : 0
var arr = [ "A" , "B" ]; // พมิพ พ์ล : 1
Logger.log(arr.indexOf("A")); // พมพิ พ์ล : -1
Logger.log(arr.indexOf("B"));
Logger.log(arr.indexOf("C"));
}
เราเอาตรงน้ลีชมาเขลยน if เพรั่ืชอตรวจสอบกย่อนทสาโค้ขด ฟัฟงก์ลชช่ัน updateDropDownUsingTitle ใหข้แกข้โค้ขด
เป็นป ดงช นล้ีช
function updateDropDownUsingTitle(title,values) {
var title = "ผลไมข้ท่ีคทด คุณชอบ ?" ;
var items = form.getItems() ;
var titles = items.map(function(item){
return item.getTitle();
});
var pos = titles.indexOf(title) ; // จบัร 0.0 ใสยต่ วัร แปร
if(pos !== -1){ // ถา้ข ดรรชทลทาดบัร ในอาเรย์ไล ม่เย ปป็น -1 กทก็ ทาโค้ดข ด้าข นใน
var item = items[pos] ; // จบรั Item คาย่ ในอาเรย์ล items ดรรชนลท าท ดบรั ทีท่ 0 ใสต่ย วรั แปร
var itemID = item.getId() ; // จรบั ID ของ Item (ใน From) ใส่ยตรวั แปร
updateDropdown(itemID,values) ;
} // End if
}
function updateDropdown(id,values) {
var item = form.getItemById(id) ;
item.asListItem().setChoiceValues(values) ;
}
เรยล บเรลยงโดย วสัรนต์ล คณคุ ดพิลกเศวต ([email protected]) 59
60 เรยท นรกน้มู ารสรน้างโปรเจ็จค Google Apps Script เล่วม 1
บทท่ีรท 6
โปรเจจค็ 06
สรร้าู ง Dropdown
แบบ 3 ระดบับ
6.1. ทที่มา
Google Sheets - Dependent Drop Down List for Entire Column, Multiple Levels
https://www.youtube.com/watch?v=s-I8Z4nTDak
โปรเจจ็คนีชล้ เราจะทาค Dropdown แบบ 3 ระดบพั เชย่น ระดัพบทที่ 1 เปน็ป จงพั หวดัพ เราเลรือกจชงหวดช เพชรบูมรณ์ล
ระดพับทท่ี 2 กจ็จะปรากฎอคาเภอเฉพาะในจัพงหวพัดเพชรบูมรณ์ลใหน้เลนอก พอระดชบท่ลัช 2 เลรือกอสาเภอ เช่ยน หนองไผ่ย
ระดับพ ท่ีท 3 ก็จจ ะปรากฎตคาบลในอาค เภอหนองไผย่ให้เน ลนอก
โปรเจคจ็ นล้ีช เราจะสรขา้ งไฟลล์ Google Apps Script แบบฝัฟงลงในไฟล์ล Google Sheet เพยล งอยา่ย งเดลยว ไมย่
ใชแข้ อพอรืชั่นๆ
โดย Google Sheet มล 2 ชชลีท้
ชทลชี้ master – เอาไวทข้ าส สอบทสา Validation
ชทช้ีล options – เกจ็บขขอ้ มมลู เอาไวเ้ข ป็นป List สสาหรบช ทสา Dropdown
6.2. พัพฒนาการทท่ี 1 : ทดสอบสรา้น ง Validation
6.2.ก.) ทดสอบสรข้าง Validation
ทดสอบสร้ขาง Validation ให้ขกบช เซลล์ล B2 โดยใชข้ Google Apps Script
62 เรทยนรกู้มน ารสรา้น งโปรเจจ็ค Google Apps Script เล่วม 1
โคด้ข ตอ่ย ไปน้ีชล สรา้ข ง Validation แบบ List ก็จครอื รายการใน Dropdown เกดิม จากการพมมิ พ์เล อง เป็ปนคยา่ คงทัชล่
function myFunction() {
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var list = [ "a" , "b" , "g" , "z" ] ;
var rule = SpreadsheetApp // สร้าข ง Validation ตรวั ใหมย่
.newDataValidation() // สรขา้ ง List จากอาเรยล์ list
.requireValueInList(list) // Reject input
.setAllowInvalid(false) // สรา้ข ง Rule
.build();
ws.getRange("B2").setDataValidation(rule);
}
หากอารเรยล์ list มลสมาชกมิ ซชาีส้ กชน เชย่นแกข้เป็ปน [ "a" , "b" , "g" , "z", "b" , "g" , "z" ] จะถมูกกรองตชวซส้ีชา
ใหข้เหลรือตชวเดยล ว
บรรทดช .setAllowInvalid(false) มลผลเท่ยากชบการเลรือก Reject input ในหชวขข้อ On invalid data กจ็ครือ
ใหข้เลืรอกจากรายการเทย่านชีน้ หากคลย์คล ่ยาลงไปไมตย่ รงกชบทัล่ชมลในรายการ จะไมรย่ บช ขขอ้ มมูล
เรลยบเรลยงโดย วสนัร ตล์ คณคุ ดพิลกเศวต ([email protected]) 63
6.2.ข.) สราข้ งเปปน็ ฟงัฟ กล์ชันท่วี สกาหรวับสร้ขาง Validation ใหขก้ ัวบเซลลล์
ขชี้นตอนนชล้ี จะแยกโคข้ดกย่อนหนข้าออกเปป็นฟัฟงก์ลชช่ัน เพัืร่ชอจะสรข้าง Validation ใหข้กชบเซลล์ลต่ยางๆตามทล่ัชเรา
ตข้องการได้ขงย่ายๆ
แก้โข คดข้ เปป็นดงช นชีล้
function myFunction() {
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var list = [ "a" , "b" , "g" , "z" ] ;
var cell = ws.getRange("C2");
applyValidationToCell(list,cell) // เรยท กใชข้ฟฟังกล์ชนร่ัที applyValidationToCell
}
function applyValidationToCell(list,cell)() {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
6.3. พฒัพ นาการทีท่ 2 : สราน้ งฟงฟั กชล์ ทัีพ่น onEdit
https://developers.google.com/apps-script/guides/triggers/events
ในขีนช้ ตอนน้ีลช เราจะสรขา้ งอลก 1 ฟังฟ กช์ล ัช่น ชชั่ืรอ onEdit ซชัึด่งเปปน็ ฟงัฟ ก์ลชชั่นทัลช่จะรนช อชตโนมชตมิเมัรืช่อมล Event แกน้ไขคย่า
ในเซลลล์ (ดูมเพิชมม่ั เติมมเรรชื่ัอง Triggers)
6.3.ก.) แก้ขไขทดเีท่ ซลล์ลไหนกล็ไดข้ มผดี ลต่วอเซลลล์ B2
เมชื่รัอมลการเแกข้ไขคย่าในเซลลล์จะเกิมด Event onEdit ซด่ัชึงจะส่ยงผย่าน วพัตถป Event (Event Object) ไปเป็ปน
Argrument ใหข้กบช ฟัฟงกล์ชช่ัน onEdit
เราสามารถดูมไดข้ว่ยา ภายในวชตถทุ Event มล Keys(หรืรอ Properties) อะไรบ้ขางไดข้ตามลมิงด์ล ยกตชวอยย่างเชย่น
Key range เกบ็จ เรข้นจทล์ ่ัลมช กล ารเปลลชั่ยนแปลง Key value เกบ็จ คา่ย ในเซลลล์ท่ัชลเปลลั่ยช นแปลง เป็นป ตขน้
64 เรยท นรกู้มน ารสราน้ งโปรเจจ็ค Google Apps Script เลว่ม 1
// ย้าข ยชท้ัท ททจี่ บรั ออกมาไวข้ข า้ข งนอก เพ่พีอท ใหท้ข คุกฟฟังกชล์ นัท่รี เรทยกใชไ้ข ดข้
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
// ยา้ข ย var ws ออกไปขขา้ งนอก
function myFunction() {
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var list = [ "a" , "b" , "g" , "z" ] ;
var cell = ws.getRange("C2");
applyValidationToCell(list,cell) // เรยท กใชฟข้ ังฟ ก์ลชนร่ัที applyValidationToCell
}
// ตข้องใชช้ข พีทอ่ ฟัฟงกลช์ ีันท่ร onEdit ชอ่พีท นทเั้ ทยา่ นทั้รน – ลองเปลี่ทยนช่ีทอพ แลว้ข ไมท่ย ทางาน
// ชทีพ่อ Agrument เปล่ีทยนจาก e เปน็ป อะไรก็กได้ข เปนป็ x,y หรพอ z กไก็ ดข้
function onEdit(e){
Logger.log(typeof e); // ดมู Log บรรทดัร - [01]
Logger.log(e); // ดมู Log บรรทดัร – [02]
var activeCell = e.range ; // ดมู Log บรรทรดั - [03]
Logger.log(activeCell);
var val = activeCell.getValue();
Logger.log(val); // ดูม Log บรรทดัร - [04]
ws.getRange(2,2).setValue(val); // จรับไปททเ่ี ซลล์ล B2 แลวข้ ใสเ่ย ปน็ป คา่ย ททจี่ รับมาจาก e
}
// เหมพอนเดิมพ
function applyValidationToCell(list,cell)() {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
เม่ัชอรื แก้ไข ขเซลลใ์ล ดๆ จะเกิมดคาย่ ใน Log เปลยลชั่ นไปเรัอ่ชืร ยๆ
ผลทลช่ั Logs มดล งช ต่อย ไปนีชล้
Logs
[01] object
[02] { authMode=LIMITED, // วตัร ถุค Event
range=Range , // คลาส Range ใช้ข range.getValue() เขข้าไปจบัร คย่าตอ่ย
source=Spreadsheet,
oldValue=g ,
[email protected] ,
value=z } // กรอกคา่ย z ลงในเซลลล์
[03] Range
[03] z
เรยล บเรลยงโดย วสรันตล์ คณุค ดิลพ กเศวต ([email protected]) 65
เมรือช่ั เขลยนฟฟังกลข์ ่ชัน onEdit แลขว้ ใหข้บนช ทกึด โปรเจจค็ โดยไมต่ย ้ของรนช
จากน้ีชน เม่ืรัชอแก้ขไขค่ยาในเซลล์ลใดๆใน Sheet เซลลล์ B2 จะจพับค่ยามาใสย่ดน้วย เช่ยน เมรชั่ือเลืรอก Dropdown
ในเซลลล์ A2 เปปน็ aaa เซลล์ล B2 จะจบช คา่ย ในเซลลล์ A2 มาใสต่ย าม
6.3.ข.) แกขไ้ ขทีด่ทเซลลไล์ หนก็ลไดข้ มีดผลตอ่ว เซลล์ลทีทอด่ ยตูมว่ ิดดกนัว
แกฟ้ข งฟั ก์ชล ่ัชน onEdit บรรทดช
ws.getRange(2,2).setValue(val);
เปลลชยั่ นเป็ปน
ws.getRange(activeCell.getRow(),2).setValue(val);
เพัชืรอ่ ทาส ให้ข แก้ขไขทชล่ัเซลลล์ไหนกจไ็ ด้ข มผล ลต่อย เซลลล์ทลชั่อยยต่มู ดิม กนช
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
// แถวของเร้นข จทล์ ีจ่ท บรั มา,2
ws.getRange(activeCell.getRow(),2).setValue(val);
}
ผล – บชนทกึด โปรเจค็จ แล้ขวทดสอบแก้ขไขคา่ย ในเซลลล์ตาย่ งๆ (ไมตย่ อข้ งรชนฟฟังกช์ล ชนั่ )
66 เรยท นรกนมู้ ารสร้นางโปรเจ็จค Google Apps Script เล่วม 1
6.3.ค.) แก้ขไขทีเ่ดท ซลลใล์ นคอลมวั น์ล A เทาว่ นนัีวร้ จงึท จวับคาว่ ไปใชข้
ข้ีชนตอนนีล้ช จะแกข้ไขโคข้ดตย่อ โดยจุทดประสงคล์เพชั่ืรอจชบคย่าท่ัลชเปล่ัชลยนแปลงในคอลชมนล์ A เทย่านช้ีน ถ้ขาเปป็นคอลชมน์ล
อ่ัรืนช ๆเปลยั่ลช นแปลง ค่าย ทจั่ลช ชบไดขจ้ ะไมย่มกล ารนสาไปใชข้
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
// จรับค่าย ไปใช้ข เมอีท่พ เกพิดการเปลทย่ี นแปลงท่ทคี อลรมั นล์ A ตงั้ทร แตยแ่ ถวทที่ 2 ขน้ขทั ไป เทา่ย นนร้ัท
// แถวทที่ 1 เป็นป ป้าป ยชทอพ่ี
if( c === 1 && r > 1) {
ws.getRange(r,c).setValue(val);
}
}
6.3.ง.) มผดี ลเฉพาะชี้รดทททีดร่ ะบคุเทา่ว นวีรน้ั
ข้ีชนตอนนลชี้ จะทาส ใหมข้ ลผลในชทีล้ช ท่ัชกล สาหนดเทา่ย นีช้น กคจ็ ืรอ ชทลี้ช ชืร่ชัอ master
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
function onEdit(e){ // จบรั ชพอ่ที ชท้ัท ของเรน้ข ที่สท ง่ย มา
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
// จบัร คา่ย ไปใชข้ เมอพี่ท เกดพิ การเปลท่ยี นแปลงท่ีท
// คอลมัร น์ล A + ตรัทง้ แต่ยแถวท่ที 2 ขัท้นข ไป + ททีช่ ท้ัท master เทา่ย นนัท้ร
if( wsName == "master" && c === 1 && r > 1) {
ws.getRange(r,c).setValue(val);
}
}
6.4. พฒพั นาการท่ที 3 : จบพั ข้นอมลูม ในอกท ชท้ทนื มาทาค เปป็น List ให้นกบัพ Dropdown
6.4.ก.) จัวบขอข้ มูลม ในอดีกชรทด้ี มาทกาเปปน็ List ให้ขกับว Dropdown
ขน้ชี ตอนนล้จีช ะเปป็นการจบช คาย่ ในช้ลทีช options มาทสาเปนป็ List ให้ขกบช Dropdown
เรยล บเรยล งโดย วสันร ตล์ คณุค ดิพลกเศวต ([email protected]) 67
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
// จบัร ชทท้ั options
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("options");
// จบัร Data ในชทัท้ options ไม่รย วมหรวั ตาราง
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,3).getValues();
// ไมไย่ ดข้ใช้ข - เพราเราเล่ยนทท่ี Event ไมยไ่ ด้รข รันฟฟงั กลช์ น่ีทัร
function myFunction() {
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var list = [ "a" , "b" , "g" , "z" ] ;
var cell = ws.getRange("C2");
applyValidationToCell(list,cell)
}
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if( wsName == "master" && c === 1 && r > 1){
if(val === "") { // เชคก็ วย่าคาย่ ในคอลรัมน์ล A วาย่ ง – ใหขล้ า้ข งคอลรัมนล์ B ดว้ข ย
ws.getRange(r,2).clearContent() ;
ws.getRange(r,2).clearDataValidations() ;
} else { // คอลมรั น์ล A ไมย่วา่ย ง – กรองคอลรัมน์ลทคท่ี ย่าเปป็น Val + เอาคลมัร น์ลถดรั ไปมาทาท List
ws.getRange(r,2).clearContent() ;
var filterOptions = options.filter(function(o){ return o[0] === val }) ;
var listToApply = filterOptions.map(function(o){ return o[1] }) ;
var cell = ws.getRange(r,2) ;
applyValidationToCell(listToApply,cell) ;
} End – if else
} End – if
} End – function
// เหมพอนเดิมพ
function applyValidationToCell(list,cell)() {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
68 เรทยนรกมนู้ ารสรนา้ งโปรเจจ็ค Google Apps Script เล่วม 1
ผล – บนช ทดึกโปรเจคจ็ แล้ขวทดสอบแก้ไข ขคา่ย ในเซลลตล์ ยา่ งๆ (ไมตย่ ข้องรชนฟัฟงก์ลชั่ชน)
6.4.ข.) เพมิด่ีท คว่าคงท่ีทด firstLevelColumn และ secondLevelColumn
เพมิ่ัชม ตวช แปรคา่ย คงทชล่ั firstLevelColumn และ secondLevelColumn จากนีชน้ จชบไปแทนทัลช่ในฟฟังกช์ล น่ัช
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("options");
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,3).getValues();
// เพิทม่พี คย่าคงท่ที
var firstLevelColumn = 1;
var secondLevelColumn = 2;
// ไม่ยไดใข้ ช้ข - เพราเราเล่นย ท่ที Event
function myFunction() {
// เหมอพ นเดพิม
}
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if( wsName == "master" && c === firstLevelColumn && r > 1){
if(val === "") { // เช็คก วย่าคา่ย ในคอลรมั น์ล A วย่าง – ใหล้ข ้ขางคอลมัร น์ล B ดวข้ ย
ws.getRange(r,secondLevelColumn).clearContent() ;
ws.getRange(r,secondLevelColumn).clearDataValidations() ;
} else { // คอลรัมนล์ A ไมย่วย่าง – กรองคอลัมร นท์ล ค่ที ย่าเปป็น Val + เอาคลรัมน์ถล ดัร ไปมาทาท List
ws.getRange(r,secondLevelColumn).clearContent() ;
var filterOptions = options.filter(function(o){ return o[0] === val }) ;
var listToApply = filterOptions.map(function(o){ return o[1] }) ;
var cell = ws.getRange(r,secondLevelColumn) ;
applyValidationToCell(listToApply,cell) ;
} // End – if else
} // End – if
} // End – function
function applyValidationToCell(list,cell)() {
// เหมอพ นเดิมพ
}
เรยล บเรลยงโดย วสรันตล์ คณุค ดพลิ กเศวต ([email protected]) 69
6.4.ค.) แยกฟฟงั ก์ลชีัน่ทว
ขี้นช ตอนนช้ีล เราจะแยกฟัฟงกช์ล ่นชั ทลช่ใั ชข้ทสา Validation ออกมา ซงัึดช่ ทาส ไดไ้ข ม่ยย าก แค่ยโยกยา้ข ยโคด้ข นิดม หนอย่ ยๆ
เทา่ย นี้ชนเอง สดุท ทข้ายแลว้ข จะได้ขผลลพช ธล์เหมือร นกชบข้อข ก่อย นหน้าข
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("master");
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("options");
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,3).getValues();
var firstLevelColumn = 1;
var secondLevelColumn = 2;
// ไม่ยไดขใ้ ช้ข - เพราเราเลน่ย ทที่ Event
function myFunction() {
// เหมอพ นเดิมพ
}
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if( wsName == "master" && c === firstLevelColumn && r > 1){
applyFirstLevelValidation(val,r);
} // End – if
} // End – function
function applyFirstLevelValidation(val,r){
if(val === "") {
ws.getRange(r,secondLevelColumn).clearContent() ;
ws.getRange(r,secondLevelColumn).clearDataValidations() ;
} else {
ws.getRange(r,secondLevelColumn).clearContent() ;
var filterOptions = options.filter(function(o){ return o[0] === val }) ;
var listToApply = filterOptions.map(function(o){ return o[1] }) ;
var cell = ws.getRange(r,secondLevelColumn) ;
applyValidationToCell(listToApply,cell) ;
} // End – if else
} // End – function
function applyValidationToCell(list,cell)() {
// เหมอพ นเดพิม
}
70 เรยท นรกู้นม ารสรนา้ งโปรเจจ็ค Google Apps Script เล่วม 1
6.5. พฒัพ นาการท่ีท 4 : สร้นาง Validation ให้กน บัพ ระดบัพ ทที่ 2
สรา้ข งฟฟงั กชล์ ่นชั applySecondLevelValidation ทาส งานคลา้ข ยกบช applyFirstLevelValidation
var mainWsName = "master" ;
var optsionsWsName = "options" ;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName) ;
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optsionsWsName) ;
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,3).getValues() ;
var firstLevelColumn = 1 ;
var secondLevelColumn = 2 ;
var thirdLevelColumn = 3 ;
function myFunction() {
// เหมพอนเดมิพ - ไมย่ได้ใข ชข้
}
function onEdit(e){
var activeCell = e.range ;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if( wsName == "master" && c === firstLevelColumn && r > 1){
applyFirstLevelValidation(val,r);
} else if ( wsName === mainWsName && c === secondLevelColumn && r > 1) {
applySecondLevelValidation(val,r);
} // End – if
} // End – function
function applyFirstLevelValidation(val,r){
if(val === "") {
ws.getRange(r,secondLevelColumn).clearContent() ;
ws.getRange(r,secondLevelColumn).clearDataValidations() ;
ws.getRange(r,thirdLevelColumn).clearContent() ;
ws.getRange(r,thirdLevelColumn).clearDataValidations() ;
} else {
ws.getRange(r,secondLevelColumn).clearContent() ;
ws.getRange(r,secondLevelColumn).clearDataValidations() ;
ws.getRange(r,thirdLevelColumn).clearContent() ;
ws.getRange(r,thirdLevelColumn).clearDataValidations() ;
var filterOptions = options.filter(function(o){ return o[0] === val }) ;
var listToApply = filterOptions.map(function(o){ return o[1] }) ;
var cell = ws.getRange(r,secondLevelColumn) ;
applyValidationToCell(listToApply,cell) ;
} // End – if else
} // End – function
เรลยบเรยล งโดย วสนัร ต์ล คณคุ ดลิพ กเศวต ([email protected]) 71
function applySecondLevelValidation(val,r){
if(val === ""){
ws.getRange(r,thirdLevelColumn).clearContent();
ws.getRange(r,thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r,thirdLevelColumn).clearContent();
var firstLevelColValue = ws.getRange(r,firstLevelColumn).getValue();
var filterOptions = options.filter(function(o){
return o[0] === firstLevelColValue && o[1] === val
});
var listToApply = filterOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r,thirdLevelColumn);
applyValidationToCell(listToApply,cell);
} // End – if else
}
// เหมพอนเดพิม
function applyValidationToCell(list,cell)() {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
ผล
72 เรทยนรกนู้ม ารสร้นางโปรเจ็จค Google Apps Script เลว่ม 1