23 ส.ค. 2023 เวลา 06:09 • ไอที & แก็ดเจ็ต

Apps Script ประทับเวลา ใน google sheet

บทความนี้เป็นบทความแรกของเราที่จะพูดถึงการใช้ apps script ใน google sheet สำหรับคนที่ยังไม่เคยใช้ apps script เลย ก็ค่อย ๆ เรียนรู้กันไปนะ ถ้าใครมีพื้นฐาน java script หรือ python อยู่แล้วก็จะสามารถเข้าใจได้ง่ายขึ้น
โจทย์ของเราในวันนี้คือ เราต้องการประทับเวลาในคอลัมน์ B เมื่อทำการเช็คที่คอลัมน์ A ตามภาพด้านล่าง
ภาพที่ 1
เริ่มจากชีตเปล่า เรากำหนดหัวตารางให้เรียบร้อย ที่คอลัมน์ A ให้ชื่อว่า 'check' และคอลัมน์ B ให้ชื่อว่า 'TimeStamp'
ภาพที่ 2
จากนั้นเลือกช่วง A2:A10 แล้วกดเมนู 'แทรก' ➜ 'ช่องทำเครื่องหมาย' ก็จะได้ check box ในช่วง A2:A10 มาดังภาพ
ภาพที่ 3 - 5
check box ที่เราสร้างขึ้นมาจะมีค่าที่ถูกเก็บไว้คือเป็น true เมื่อถูกเช็ค และเป็น false เมื่อไม่ถูกเช็ค ดังนั้นตอนนี้ ค่าทั้งหมดในเซลล์ A2:A10 จะเป็น false ทั้งหมด
ต่อมาให้เราเปิด apps script โดยไปที่เมนู 'ส่วนขยาย' ➜ 'Apps Scripts'
เราจะได้หน้าต่าง apps script มาตามภาพที่ 7
ภาพที่ 6 - 7
คลิกที่ชื่อโครงการ ซึ่งตอนนี้น่าจะเขียนว่า 'โครงการไม่มีชื่อ' แล้วเปลี่ยนใหม่ให้เป็น 'TimeStamp'
ภาพที่ 8
จากนั้นลบตัว script ที่มีฟังก์ชัน myFunction ออก คือส่วนที่เป็น
function myFunction() {
 
}
ให้ลบออก
แล้วใส่ script นี้ไปแทน
function onEdit(e) {
var range = e.range
var value = range.getValue()
var row = range.getRow()
var column = range.getColumn()
if (value == true && row >= 2 && column == 1) {
// กรณี offset ใช้ SpreadsheetApp.getActiveRange().offset(0,1)
// กรณี A1 ใช้ SpreadsheetApp.getActiveSheet().getRange('A1')
var outPutCell = SpreadsheetApp.getActiveSheet().getRange('B'+row)
if(outPutCell.getValue() == ''){
outPutCell.setValue (new Date()).setNumberFormat ('HH:mm:ss')
}
}
}
ถ้าทำถูกต้อง จะได้หน้าต่างมีหน้าตาตามภาพด้านล่าง
ภาพที่ 9
กดเซฟ แล้วลองไปทดสอบที่หน้าชีตโดยการเช็คไปที่ check box ที่เซลล์ A2
ภาพที่ 10
รอสักครู่ เวลาก็จะขึ้นมาที่เซลล์ B2 (การรัน script ครั้งแรกจะใช้เวลานานกว่าปกติ ถ้ารอนานแล้วยังไม่ขึ้นอีกให้ทำการรีเฟรชแล้วลองใหม่)
จากนั้นลองเช็คในช่องอื่น ๆ
ภาพที่ 11
ต่อไปนี้จะอธิบายตัว script ทีละบรรทัด
ภาพที่ 12
1| function onEdit(e) {
คือตั้งชื่อฟังก์ชันชื่อว่า onEdit หมายความว่าฟังก์ชันนี้จะถูกรันอัตโนมัติเมื่อมีการแก้ไข โดยไวยากรณ์ของฟังก์ชันนี้จะต้องใส่ e (ย่อมาจาก event) เข้าไปในวงเล็บด้านหลังด้วย โดยตัวฟังก์ชันจะอยู่ภายใน { }
2| var range = e.range
คือการกำหนดตัวแปรชื่อ range ให้มีค่าเป็น e ที่ตามด้วย .range ซึ่ง e.range ก็คือช่วงของ e นั่นเอง
3| var value = range.getValue()
คือการกำหนดตัวแปรชื่อ value ให้มีค่าเป็น 'ค่า' ของตัวแปร range
4| var row = range.getRow()
คือการกำหนดตัวแปรชื่อ row ให้มีค่าเป็น 'แถว' ของตัวแปร range
5| var column = range.getColumn()
คือการกำหนดตัวแปรชื่อ column ให้มีค่าเป็น 'คอลัมน์' ของตัวแปร range
ถ้าเราแก้ไขค่าในเซลล์ A1 ให้เป็น cat
สคริปต์จะถูกรันอัตโนมัติ และได้ค่าตัวแปร
value = "cat"
row = 1
column = 1
ถ้าเราแก้ไขค่าในเซลล์ C6 ให้เป็น 219
สคริปต์จะถูกรันอัตโนมัติ และได้ค่าตัวแปร
value = 219
row = 6
column = 3
แถวจะถูกคิดตามตัวเลขของแถว แต่คอลัมน์จะคิด A:1, B:2, C:3, ...
7| if ( value == true && row >= 2 && column == 1) {
if ( ) { } คือการตรวจตรรกะใน ( ) หากเป็น true ให้ดำเนินใน { }
&& หมายถึง 'และ'
|| หมายถึง 'หรือ'
ในที่นี้คือการตรวจว่า (value เป็น true) และ (row >= 2) และ (column เป็น 1)
หรือพูดง่าย ๆ ก็คือตรวจว่า เซลล์ในช่วง A2:A ถูกเปลี่ยนให้เป็น true หรือไม่
8| และ 9| ขึ้นต้นบรรทัดด้วย // หมายถึงด้านหลัง // จะเป็นข้อความที่ไม่ถูกนำไปดำเนินการใน script ใช้สำหรับเขียนบันทึกหรือความคิดเห็น
10| var outPutCell = SpreadsheetApp.getActiveSheet().getRange('B'+row)
'B'+row หมายถึง "B" ตามด้วยตัวแปร row เช่น "B3"
getRange(ช่วง) หมายถึง ช่วงเซลล์ที่กำหนด
getActiveSheet() หมายถึง ชีตที่กำลังใช้งานอยู่
SpreadsheetApp คือการเรียกใช้ฟังก์ชันของ SpreadsheetApp
outPutCell จึงกลายเป็นเซลล์ที่อยู่แถวเดียวกับ e แต่อยู่ที่คอลัมน์ B
11| if (outPutCell.getValue() == '' ) {
ตรวจเงื่อนไขว่า ค่าใน outPutCell เป็น ค่าว่าง หรือไม่? ถ้าเป็น ให้ดำเนินการใน { }
12| outPutCell.setValue(new Date()).setNumberFormat ('HH:mm:ss')
setNumberFormat ('HH:mm:ss') คือจัดรูปแบบตัวเลขให้เป็น HH:mm:ss
new Date() คือสร้างค่าวันที่ใหม่ที่เป็นปัจจุบัน
outPutCell.setValue([ค่า]) คือ ตั้งค่าใน outPutCell ให้เป็น [ค่า]
ลิงก์ไฟล์ตัวอย่างสำหรับทำสำเนา: https://docs.google.com/spreadsheets/d/1_sOJQAKk2g0Yp_OVmRRO1M8KX3UKrdC3yG5j27JxCLU/edit?usp=sharing
หากต้องการให้แสดงเวลาที่แก้ไขครั้งสุดท้ายก็ประยุกต์ได้จาก script ข้างต้นได้
หากเห็นว่าบทความนี้มีประโยชน์ กดไลค์กดแชร์เพื่อเป็นกำลังใจให้ผู้เขียนด้วยนะฮับ
โฆษณา