ในการสร้าง Workflow ที่ซับซ้อนและต้องการความยืดหยุ่นสูง การควบคุมทิศทางการทำงาน (Control Flow) เป็นหนึ่งในหัวใจสำคัญของระบบ Automation เพราะไม่ใช่ทุกงานที่จะดำเนินไปในเส้นทางเดียวกันเสมอ มีบางสถานการณ์ที่เราจำเป็นต้องแตกแขนง Workflow ออกเป็นหลายเส้นทาง เช่น แยกไปทางใดทางหนึ่งตามเงื่อนไข หรือนำกลับมารวมกันอีกครั้ง
ในตอนที่แล้ว เราเรียนรู้การจัดการข้อมูลใน Flow ไปแล้ว ในตอนนี้ เราจะมาเรียนรู้วิธีการใช้ Control Flow ใน n8n อย่างละเอียด ซึ่งประกอบไปด้วยการแตกเส้นทางการทำงาน (Splitting), การรวมข้อมูล (Merging), การวนลูป (Looping), การรอคอยเหตุการณ์ (Waiting) และการใช้งาน Sub-workflows ที่จะช่วยให้ระบบ Automation ของคุณทำงานได้อย่างคล่องตัวและมีความยืดหยุ่นมากขึ้น
พร้อมกันหรือยังครับ? ถ้าพร้อมแล้ว มาดูกันเลย!
สารบัญ
Control Flow คืออะไร?
Control Flow ใน n8n ช่วยให้คุณกำหนดทิศทางการทำงานของ Workflow ได้ตามเงื่อนไขหรือสถานการณ์ที่กำหนด เช่น การแยกเส้นทางตามเงื่อนไขต่าง ๆ การรวมข้อมูลจากหลายแหล่ง การจัดการกับการวนลูป และการเรียกใช้งาน Sub-workflow การใช้ Control Flow ที่ดีจะทำให้คุณสามารถสร้าง Automation ที่ซับซ้อนและยืดหยุ่นได้อย่างมีประสิทธิภาพ
เพื่อความสะดวกในการเรียนรู้ เราจะใช้ Mockup Data ที่มีมาให้สำเร็จรูปใน n8n เพื่อประกอบการสอนบทความนี้ ทุกคนจะได้ทำตามได้ง่าย ๆ โดยไม่ต้องเตรียม Data จากที่อื่นให้ยุ่งยาก เราสามารถดึง Mockup Data มาจากโหนด Customer Datastore (n8n training) ได้เลย
โดยเลือก option Get All People จะได้ลูกค้ามา 5 คนที่มีมาให้สำเร็จรูปใน n8nในการประกอบการสอนบทความนี้นะครับ ทุกคนจะได้ทำตามได้โดยไม่ต้องไปเอา Data มาจากที่อื่นให้ยุ่งยาก
n8n มี Node หลายประเภทที่ช่วยจัดการกับ Control Flow ทำให้ Workflow ของคุณตอบสนองต่อสถานการณ์ต่าง ๆ ได้อย่างราบรื่น เรามาดูกันทีละกลุ่มกันครับ
Splitting: การแยกเส้นทางด้วยเงื่อนไข
เราสามารถใช้ If หรือ Switch Node เพื่อแบ่ง Workflow ออกเป็นหลายเส้นทางตามเงื่อนไขที่กำหนด ซึ่งมีการทำงานแตกต่างกันดังนี้:
- If Node: แยกผลลัพธ์ออกเป็น 2 เส้นทาง (เช่น True/False)
- Switch Node: แยกผลลัพธ์ออกเป็นหลายเส้นทาง เหมาะกับการทำงานที่มีผลลัพธ์มากกว่า 2 เส้นทาง
If Node
ในตัวอย่างนี้ เราจะใช้ If Node เพื่อแยก Workflow ออกเป็น 2 เส้นทาง เช่น หากข้อมูลมีการระบุประเทศไว้ เราจะให้ Workflow ทำงานถัดไปในเส้นทาง A แต่หากไม่มีข้อมูลประเทศ ให้ไปที่เส้นทาง B
โดยใน Work Flow จะมีทางแยกออกมาเป็น “true” และ “false” ชัดเจน
เส้น True: กรณีค่าประเทศไม่ว่าง เราจะใช้ Sort Node จัดเรียงข้อมูลตามประเทศ
เส้น False: กรณีไม่มีค่าประเทศ เราจะใช้ Edit Fields Node แก้ไขข้อมูลให้ระบุว่า “ไม่รู้”
ตอนนี้จะได้แบบนี้ เห็นมะ แยกออกมาเป็น 2 เส้นทางชัดเจน
Switch Node
ใช้ในการแบ่งเส้นทางที่มีผลลัพธ์หลายเส้นทาง (เหมาะกับผลลัพธ์มีมากกว่า 2 เส้นทาง)
สมมติว่าผมเอากรณีจริง ที่ผ่านการเรียงข้อมูลแล้วมาเข้า Switch เล่นๆ ให้ดูว่า
- ถ้า country เป็น US ให้ผลลัพธ์ออกมาในเส้นทางที่ตั้งชื่อว่า us
- ถ้า country เป็น UK ให้ผลลัพธ์ออกมาในเส้นทางที่ตั้งชื่อว่า uk
- แล้วตั้งค่า Fall Back (กรณีที่ไม่ตรงตามเงื่อนไขใดๆ เลย) ให้ออกมาอีกส้นทางนึง
จากนั้นผลที่แยกจาก Switch เราก็สามารถแยก Workflow ออกมาอีกหลายเส้นเลย (อันนี้คือทำเล่นๆ ขำๆ) คราวนี้มีรวมๆ ก็ 4 เส้นทางแล้ว 55
Merging: การรวมข้อมูล
การรวมข้อมูลจากหลายแหล่งเป็นสิ่งสำคัญเมื่อต้องการจัดการข้อมูลที่มาจากหลาย Node หรือหลายแหล่งข้อมูล ใน n8n มีการใช้ Merge Node ที่ยืดหยุ่นและปรับใช้ได้หลายวิธี:
- Append: นำข้อมูลมาต่อกันในแนวตั้ง โดยอ้างอิงจากชื่อ Field ซึ่งเหมือนกับการใช้
UNION
ใน SQL รวมถึงเหมือนกับ Append Query ของ Power Query ด้วย - Choose Branch : รวมแล้วเลือกว่าจะเอาผลลัพธ์จากกิ่งไหนออกไปยังผลลัพธ์ ซึ่งดีตรงสามารถรอให้ทุกกิ่งมาพร้อมกันก่อน ค่อยส่งต่อไป Step ถัดไปได้ (ปกติ Node จะรันเส้นบนให้จบก่อนแล้วค่อยเริ่มวิ่งเส้นล่าง)
- Combine: การรวมข้อมูล 2 ตารางมีหลายวิธี แต่ที่จะเน้น คือ Matching Fields ซึ่งเหมือน SQL Join แบบต่างๆ รวมถึง Merge Query ของ Power Query เช่น:
- Keep Matches: รวมเฉพาะรายการที่ตรงกัน (เหมือน
INNER JOIN
) - Keep Non-Matches: รวมเฉพาะรายการที่ไม่ตรงกัน
- Keep Everything: รวมทั้งรายการที่ตรงกันและไม่ตรงกัน (เหมือน
OUTER JOIN
) - Enrich Input 1: เก็บข้อมูลทั้งหมดจาก Input 1 และเพิ่มข้อมูลที่ตรงกันจาก Input 2 (เหมือน
LEFT JOIN
) - Enrich Input 2: เก็บข้อมูลทั้งหมดจาก Input 2 และเพิ่มข้อมูลที่ตรงกันจาก Input 1 (เหมือน
RIGHT JOIN
)
- Keep Matches: รวมเฉพาะรายการที่ตรงกัน (เหมือน
- SQL Query : เขียนการรวมด้วยภาษา SQL ได้เลย วิธีนี้จะยืดหยุ่นสุดๆ
ในตัวอย่าง: ผมจะลองเอาผลลัพธ์จากทั้ง 4 เส้นกลับมารวมกันด้วยการ Append ก่อน
ซึ่งถ้าคอลัมน์ตรงกันก็จะกลับมารวมกันได้ง่ายๆ แบบนี้ (ถ้าไม่ตรงกันอาจต้องใช้โหนด Rename Keys มาช่วย)
จากนั้น ค่อยเอาผลที่ได้มา Combine กับตารางข้อมูลประเทศที่มีข้อมูลว่าแต่ละประเทศอยู่ทวีปไหนและมีพื้นที่เท่าไหร่ การรวมข้อมูลนี้จะคล้ายกับการใช้ VLOOKUP
ใน Excel หรือ LEFT JOIN
ใน SQL
โดยผมมีข้อมูลอีกตาราง ที่ระบุว่าแต่ละประเทศ ว่าชื่อเต็มคืออะไร อยู่ทวีปไหน และมีพื้นที่เท่าไหร่ ซึ่งในที่นี้มี 6 ประเทศ
Country Code | Country Name | Continent | Area (sq km) |
US | United States | North America | 9,833,520 |
UK | United Kingdom | Europe | 243,610 |
CO | Colombia | South America | 1,141,748 |
TH | Thailand | Asia | 513,120 |
JP | Japan | Asia | 377,975 |
CN | China | Asia | 9,596,961 |
โดยผมใช้โหนดที่ชื่อว่า Code ซึ่งมีความสามารถในการรัน Code ภาษา JavaScript หรือ Python แอบสร้างข้อมูล Mockup ขึ้นมา แบบนี้ (การทำงานของโหนดนี้โดยละเอียดผมจะสอนทีหลัง ตอนนี้ให้ copy code นี้ไปใส่ก่อน ซึ่งจริงๆ เราก็ให้ AI ช่วยเขียนไปก่อนได้)
// ข้อมูลประเทศ, ทวีป และพื้นที่
const data = [
{
"Country Code": "US",
"Country Name": "United States",
"Continent": "North America",
"Area (sq km)": 9833520
},
{
"Country Code": "UK",
"Country Name": "United Kingdom",
"Continent": "Europe",
"Area (sq km)": 243610
},
{
"Country Code": "CO",
"Country Name": "Colombia",
"Continent": "South America",
"Area (sq km)": 1141748
},
{
"Country Code": "TH",
"Country Name": "Thailand",
"Continent": "Asia",
"Area (sq km)": 513120
},
{
"Country Code": "JP",
"Country Name": "Japan",
"Continent": "Asia",
"Area (sq km)": 377975
},
{
"Country Code": "CN",
"Country Name": "China",
"Continent": "Asia",
"Area (sq km)": 9596961
}
];
// ส่งออกข้อมูลเป็น output ของ node
return data.map(item => {
return {
json: item
};
});
เราสามารถเอา Code Node นี้ไปเชื่อมกับ Trigger แรกสุด หรือจะเชื่อมกับ Node ล่าสุดที่เราทำเลยก็ได้ มันจะได้ถูกสั่งให้ทำงานต่อได้ทันทีเช่นกัน
ผลลัพธ์ของโหนดนี้จะได้ตารางอ้างอิงของประเทศแบบที่ผมแปะให้ดูเลย
คราวนี้เราจะทำคล้ายๆ ว่าจะ Lookup ข้อมูลจากประเทศเหล่านี้แปะกลับไปที่ตารางลูกค้าของเรา (คล้ายๆ VLOOKUP ใน Excel หรือ Left Join ใน SQL)
ดังนั้นเราจะใช้ Merge Node มาช่วย แต่จะใช้โหมด Combine แบบ Matching Fields Enrich Input 1 (ตารางลูกค้า)
ผลลัพธ์ที่ได้จะมี 5 items (ตาม Input1) หน้าตาสุดท้ายได้แบบนี้ ซึ่งคล้ายๆ ผลลัพธ์จากการใช้พวก VLOOKUP ใน Excel แหละ
อย่างไรก็ถาม ถ้าเราลองไปดูผลลัพธ์จริงๆ ในกรณีที่หาไม่เจอ เช่น ประเทศ “ไม่รู้” มันจะไม่มี Field จาก Input2 โผล่ออกมาที่ผลลัพธ์เลย (ไม่ได้ขึ้นเป็นค่าว่าง หรือ error ด้วย)
[
{
"id": "23423532",
"name": "Jay Gatsby",
"email": "gatsby@west-egg.com",
"notes": "Keeps asking about a green light??",
"country": "US",
"created": "1925-04-10",
"Country Code": "US",
"Country Name": "United States",
"Continent": "North America",
"Area (sq km)": 9833520
},
{
"id": "23423534",
"name": "Max Sendak",
"email": "info@in-and-out-of-weeks.org",
"notes": "Keeps rolling his terrible eyes",
"country": "US",
"created": "1963-04-09",
"Country Code": "US",
"Country Name": "United States",
"Continent": "North America",
"Area (sq km)": 9833520
},
{
"id": "23423536",
"name": "Edmund Pevensie",
"email": "edmund@narnia.gov",
"notes": "Passionate sailor",
"country": "UK",
"created": "1950-10-16",
"Country Code": "UK",
"Country Name": "United Kingdom",
"Continent": "Europe",
"Area (sq km)": 243610
},
{
"id": "23423533",
"name": "José Arcadio Buendía",
"email": "jab@macondo.co",
"notes": "Lots of people named after him. Very confusing",
"country": "CO",
"created": "1967-05-05",
"Country Code": "CO",
"Country Name": "Colombia",
"Continent": "South America",
"Area (sq km)": 1141748
},
{
"id": "23423535",
"name": "Zaphod Beeblebrox",
"email": "captain@heartofgold.com",
"notes": "Felt like I was talking to more than one person",
"country": "ไม่รู้",
"created": "1979-10-12"
}
]
Waiting: รอคอย
ใช้ Wait Node เพื่อหยุดการทำงานของ Workflow ชั่วคราว เมื่อ Workflow ถูกหยุดไว้ ข้อมูลจะถูกบันทึกลงในฐานข้อมูล และเมื่อเงื่อนไขที่กำหนดเป็นจริง Workflow จะโหลดข้อมูลกลับมาและดำเนินการต่อไป
การใช้งาน: มีหลาย Option
- After Time Interval: หยุดรอตามเวลาที่กำหนด เช่น หยุดรอ 10 นาที แล้วทำงานต่อ
- At Specified Time: รอจนถึงเวลาที่ระบุ เช่น 31 ธันวาคม เวลา 23:59 น.
- On Webhook Call: รอจนกว่าจะได้รับการเรียกผ่าน HTTP (Webhook)
- On Form Submitted: รอจนกว่าจะได้รับข้อมูลจากฟอร์ม
การใช้งานนี้สามารถใช้เพื่อการควบคุม API Rate Limit หรือรอการตอบกลับจากระบบภายนอกที่จำเป็นต้องรอข้อมูลก่อน ซึ่งจะแสดงให้เห็นในการใช้คู่กับโหนด Loop ในตัวถัดไป
Looping: การวนลูปการทำงาน
ปกติแล้ว “การวน Loop” คือการที่เราต้องการให้มีการทำงานซ้ำ ๆ กับข้อมูลทีละรายการไปเรื่อยๆ จนครบรายการที่มีทั้งหมด ซึ่งต้องบอกว่าใน n8n Node ปกติทั่วไปก็ทำแบบนั้นอยู่แล้ว อย่างในบทที่แล้วที่ผมส่ง Line Notify จากข้อมูลที่มีใน Google Sheets 6 รายการ มันก็ส่งทีละรายการ เป็นจำนวนทั้งหมด 6 รอบ เหมือนกับการวน Loop ทีละ item อยู่แล้วนะ
อ้าว! แล้วเราจะมี Node Loop ไปทำไมอีก? 🤔
คำตอบก็คือ มันอาจจะมี Node บางตัวที่ไม่ได้มีพฤติกรรมทำงานทีละรายการตามปกติ หรืออาจมีสถานการณ์บางอย่างที่อยากจะทำซ้ำๆ จนกว่าจะได้ตามเงื่อนไขที่ต้องการ
สถานการณ์ที่พบบ่อย เช่น ผู้ให้บริการบางเจ้าอาจมีการกำหนดว่า ใน 1 ชั่วโมง เรายิง API ไปดึงข้อมูลได้สูงสุดกี่ครั้ง อะไรแบบนี้ (เดี๋ยวเยอะเกิน Server จะรับไม่ไหว) เราก็ต้องมีการควบคุมความถี่ในการส่ง API Request เพื่อเลี่ยงการชนกับ Rate Limit ของ API ได้
ยกตัวอย่าง เช่น เราสามารถใช้ Loop Over Items เพื่อวนลูปทำงานทีละรายการ และตั้งค่า Wait Node เพื่อให้หยุดรอ 5 วินาที ก่อนจะส่งไปที่ API ในรอบถัดไป
- เราเอา Node Loop Over Items มาต่อจาก Output เดิม เพื่อวนทำซ้ำๆ ทีละรายการ (Batch =1)
- แล้วส่งเข้า Line Notify ส่ง Notify item นั้นๆ (record เดียว)
- จากนั้นรอ 5 วินาที
- จากนั้นมันจะวนกลับมา Loop ต่อเพื่อทำ item ถัดไป
ถ้า Loop ทำเสร็จหมดทุก items แล้ว Workflow ก็จะวิ่งออกไปทำงานต่อในกิ่งที่เขียนว่า Done ได้อีกนั่นเอง
หน้าตาทั้ง Flow เราเป็นแบบนี้
สรุป
การกำหนด Control Flow ใน n8n จะช่วยให้คุณสามารถสร้าง Workflow ที่ซับซ้อนและยืดหยุ่นได้ตามความต้องการ ไม่ว่าจะเป็นการแยกเส้นทาง (Splitting), รวมข้อมูล (Merging), การหยุดรอ (Waiting) หรือการวนลูป (Looping) ซึ่งการใช้ Node เหล่านี้จะทำให้ Workflow ของคุณทำงานได้อย่างมีประสิทธิภาพและตอบโจทย์ทุกสถานการณ์
ในตอนถัดไป เราจะมาเรียนรู้วิธีการนำ AI Model มาเชื่อมต่อใน Workflow ของคุณ เพื่อสร้าง AI Agent ที่ช่วยให้การทำงานของคุณฉลาดและอัตโนมัติมากขึ้น อย่าพลาดติดตามกันนะครับ!
Leave a Reply