Notion จากศูนย์ถึงโปร ตอนที่ 6 — Formulas ให้ property คำนวณเอง
ซีรีส์ "Notion จากศูนย์ถึงโปร" ลงวันละตอนรวม 8 ตอน — ตามอ่านทั้งชุดได้ที่หมวดคู่มือเครื่องมือ
ตอนที่แล้วดึงตัวเลขนับงานเสร็จผ่าน rollup ไปแล้ว คำถามต่อมาคือถ้าอยากได้อะไรที่ซับซ้อนกว่านับอย่างเดียว เช่นข้อความเตือนที่เปลี่ยนไปตามวันที่ หรือแถบความคืบหน้าเป็นภาพ ต้องใช้ Formula
Formula มีไว้ทำไม
Formula คือ property ที่ไม่ต้องกรอกเอง มันคำนวณจาก property อื่นในแถวเดียวกัน (รวมถึงค่าจาก rollup ด้วย) แล้วอัปเดตผลลัพธ์เองทุกครั้งที่ต้นทางเปลี่ยน พูดง่าย ๆ คือย้ายงานที่เคยทำในหัวหรือในเอ็กเซลมาไว้ในฐานข้อมูลโดยตรง
จุดที่ต่างจาก text ธรรมดาชัดเจน: text ต้องพิมพ์เอง ถ้าข้อมูลต้นทางเปลี่ยนแต่ลืมแก้ text นั้นก็เก่าค้างอยู่ ส่วน formula คำนวณใหม่ทุกครั้งอัตโนมัติ ไม่มีทางเก่าค้าง
โครง syntax แบบอ่านง่าย
สูตรของ Notion เขียนในช่องเดียว อ้างชื่อ property อื่นด้วยเครื่องหมาย prop("ชื่อ property") แล้วต่อด้วยฟังก์ชันที่ต้องการ ใส่ในกล่องแก้ไขสูตรที่เปิดขึ้นมาตอนสร้าง property ชนิด formula
ชื่อฟังก์ชันเปลี่ยนแปลงได้ตามเวอร์ชันของ Notion เอง ตัวอย่างด้านล่างเขียนแบบ pseudocode ให้เห็นตรรกะ ก่อนใช้จริงควรเปิดหน้าช่วยเหลือในตัวสูตร (มีปุ่มดูรายชื่อฟังก์ชันทั้งหมดอยู่ในกล่องแก้ไข) เพื่อเช็คชื่อกับพารามิเตอร์ให้ตรงกับเวอร์ชันปัจจุบัน
ตัวอย่างที่ 1: วันเหลือก่อน deadline พร้อมข้อความเตือน
ต้องการ property text ที่บอกว่าเหลือกี่วันก่อนครบกำหนด แล้วถ้าใกล้เกินไปให้ขึ้นคำเตือน แนวคิดของสูตร
if(
dateBetween(prop("กำหนดส่ง"), now(), "days") <= 1,
"ด่วนมาก",
format(dateBetween(prop("กำหนดส่ง"), now(), "days")) + " วัน"
)
dateBetween คำนวณระยะห่างระหว่างสองวันเป็นหน่วยที่กำหนด if เช็คเงื่อนไขแล้วเลือกผลลัพธ์สองทาง ถ้าเหลือน้อยกว่าหรือเท่ากับหนึ่งวันให้ขึ้น "ด่วนมาก" แทนตัวเลข ส่วน format แปลงตัวเลขให้กลายเป็นข้อความเพื่อต่อกับคำว่า "วัน" ได้
ตัวอย่างที่ 2: Progress bar จาก rollup งานเสร็จ/ทั้งหมด
ต่อยอดจาก rollup สองตัวในตอนที่แล้ว ("งานทั้งหมด" กับ "งานเสร็จแล้ว") อยากได้แถบตัวหนังสือแทนความคืบหน้าแบบภาพ แนวคิดของสูตร
slice("■■■■■■■■■■", 0, round(prop("งานเสร็จแล้ว") / prop("งานทั้งหมด") * 10))
+ slice("□□□□□□□□□□", 0, 10 - round(prop("งานเสร็จแล้ว") / prop("งานทั้งหมด") * 10))
หลักการคือหาสัดส่วนงานเสร็จก่อน คูณด้วยสิบแล้วปัดเศษเพื่อรู้ว่าควรมีสี่เหลี่ยมทึบกี่ช่องจากสิบช่อง แล้วตัดสตริงสี่เหลี่ยมทึบกับสี่เหลี่ยมโปร่งมาต่อกันให้ยาวรวมสิบช่องพอดี ผลลัพธ์คือแถบแบบ "■■■■■□□□□□" ที่เปลี่ยนความยาวเองตามงานที่เสร็จเพิ่มขึ้น
ตัวอย่างที่ 3: สถานะรวมอัตโนมัติจากเงื่อนไข
โปรเจกต์หนึ่งอยากมีสถานะรวมที่สรุปจากทั้งวันครบกำหนดและจำนวนงานเสร็จ ไม่ต้องไปนั่งเปลี่ยนสถานะเองทุกวัน แนวคิดของสูตร
if(
prop("งานเสร็จแล้ว") == prop("งานทั้งหมด"),
"เสร็จสมบูรณ์",
if(
dateBetween(prop("กำหนดส่ง"), now(), "days") < 0,
"เลยกำหนด",
"กำลังดำเนินการ"
)
)
ตรรกะคือเช็คก่อนว่างานเสร็จครบทุกชิ้นหรือยัง ถ้าครบให้ขึ้น "เสร็จสมบูรณ์" ทันที ถ้ายังไม่ครบให้เช็คต่อว่าวันนี้เลยกำหนดส่งไปแล้วหรือยัง ถ้าเลยแล้วขึ้น "เลยกำหนด" ถ้ายังไม่เลยให้ขึ้น "กำลังดำเนินการ" นี่คือการซ้อน if สองชั้น ซึ่งเป็นแพทเทิร์นที่ใช้บ่อยมากในสูตรของ Notion
Tips การ debug สูตรทีละท่อน
สูตรยาว ๆ ที่พังทีเดียวหาจุดผิดยากมาก วิธีที่ช่วยได้จริงคือสร้าง property formula เปล่าใหม่หนึ่งอันไว้ทดลอง แล้วเขียนสูตรทีละท่อนแยกกัน ทดสอบว่าท่อนแรกให้ผลลัพธ์ที่คาดไว้ก่อน ค่อยเอาไปประกอบกับท่อนถัดไป
จุดที่พังบ่อยที่สุดคือชนิดข้อมูลไม่ตรงกัน เช่นเอาตัวเลขไปต่อกับข้อความตรง ๆ โดยไม่ผ่าน format ก่อน หรือชื่อ property ในเครื่องหมาย prop() สะกดไม่ตรงกับชื่อจริงเป๊ะ ๆ ทีละตัวอักษร กล่องแก้ไขสูตรจะขึ้นเส้นสีแดงใต้จุดที่ผิดพร้อมคำอธิบายสั้น ๆ อ่านมันก่อนเดา นั่นเร็วกว่าลองผิดลองถูกเยอะ
พรุ่งนี้ ตอนที่ 7: เมื่อหน้างานต้องเกิดพร้อมโครงเดิมทุกครั้ง หรือมีปุ่มเดียวทำหลายอย่างพร้อมกัน — เข้าเรื่อง templates และ automations พื้นฐาน