ในบทความที่ผ่านๆ มา เราได้เรียนรู้การสร้างเวิร์กโฟลว์สำหรับประมวลผลรายการข้อมูลเดี่ยวๆ กันไปแล้ว ไม่ว่าจะเป็นการบันทึกข้อมูลจากแบบฟอร์ม หรือการส่งคำขออนุมัติ แต่ในโลกการทำงานจริงขององค์กร โจทย์ที่คุณต้องเจอเป็นประจำคือการจัดการกับ “ชุดข้อมูลขนาดใหญ่ (Array or Collection)” เช่น การดึงรายชื่อพนักงาน 50 คนจากตาราง Excel เพื่อส่งอีเมลแจ้งเตือน หรือการตรวจสอบเอกสาร 100 ไฟล์ในคลัง SharePoint
ใน EP.6 ที่ผ่านมา เราได้เรียนรู้ระบบอนุมัติงานการแจ้งซ่อมแบบต่างๆ กันไปแล้ว แต่ในบทความนี้หากเราต้องมาเขียนคำสั่งประมวลผลทีละแถว ย่อมทำให้เสียเวลาและยุ่งเหยิงอย่างมาก แพลตฟอร์ม Power Automate จึงได้ออกแบบกลไกควบคุมการวนลูปซ้ำที่เรียกว่า Power Automate Loops ขึ้นมา เพื่อช่วยให้เราเขียนชุดคำสั่งไว้เพียงครั้งเดียว แต่มอบหมายให้หุ่นยนต์ทำงานแทนกี่ร้อยกี่พันรอบก็ได้จนกว่าชุดข้อมูลจะถูกจัดการจนครบถ้วนค่ะ
Apply to each (ทำซ้ำกับทุกรายการในชุดข้อมูล)
เป็น Action วนลูปที่ถูกใช้งานบ่อยที่สุด โดยมันจะรับค่าชุดข้อมูล (Array) เข้ามา แล้วนำคำสั่งที่อยู่ภายในกล่องไปรันซ้ำกับข้อมูล “ทุกๆ รายการ” ทีละแถวตั้งแต่รายการแรกจนถึงรายการสุดท้าย
Do Until (ทำซ้ำไปเรื่อยๆ จนกว่าจะเข้าเงื่อนไข)
เป็น Action วนลูปที่จะสั่งให้ระบบรันชุดคำสั่งภายในซ้ำไปเรื่อยๆ “จนกว่าเงื่อนไขที่กำหนดไว้จะเป็นจริง” เหมาะมากสำหรับงานติดตามผล ติดตามสถานะ หรือการรอคอยผลลัพธ์บางอย่างอย่างต่อเนื่อง
ขั้นตอนการใช้งาน Power Automate ดึงข้อมูลหลายรายการเพื่อเตรียมใช้ ลูป (Loops)
Step 1: เข้าสู่ระบบ Power Automate
- เข้าสู่ระบบ Microsoft 365
- เลือกเปิดแอปพลิเคชัน Power Automate

Step 2: สร้าง Instant Cloud Flow
- คลิกที่เมนู + Create หรือ + New flow
- เลือก Instant cloud flow
- Flow name: ตั้งชื่อ Flow ว่า Apply_to_each

- Choose how to trigger this flow: เลือก Manually trigger a flow แล้วคลิกปุ่ม Create

Step 3: เตรียมฐานข้อมูล SharePoint List
- ตรวจสอบตารางข้อมูลใน SharePoint List (เช่น List ชื่อ M_Employees) ที่มีข้อมูลพนักงานหลายรายการ เพื่อนำมาทดสอบการดึงข้อมูล

Step 4: เพิ่ม Action ดึงข้อมูลหลายรายการ (Get items)
- ในหน้า Flow Designer ให้คลิกปุ่ม + New step ใต้กล่อง Trigger
- ค้นหาคีย์เวิร์ด Get items แล้วเลือก Action Get items (SharePoint)
- กำหนดค่าการเชื่อมต่อ:
- Site Address: เลือก SharePoint Site ที่เก็บข้อมูล (เช่น learningPowerApps)
- List Name: เลือกชื่อ List ปลายทาง (M_Employees)
- (Optional) สามารถตั้งค่า Filter Query หรือ Top Count หากต้องการกรองข้อมูลเฉพาะรายการที่ต้องการ
- คลิกปุ่ม Save บริเวณมุมบนขวามือเพื่อบันทึก Flow

Step 5: ทดสอบการรัน Flow และตรวจสอบโครงสร้างข้อมูล
- กดปุ่ม Test บริเวณมุมบนขวา เลือก Manually แล้วกด Run flow
- เมื่อ Flow รันสำเร็จ ให้เข้าไปตรวจสอบในหน้า Run history
- คลิกเปิดดูผลลัพธ์ใน Action Get items จะพบว่าข้อมูลถูกดึงออกมาในรูปแบบชุดข้อมูล JSON Array ที่ประกอบด้วยข้อมูลหลายรายการ (Array of Objects) ซึ่งพร้อมสำหรับนำไปวนลูปประมวลผลด้วย Apply to each ในขั้นตอนถัดไป

การประมวลผลชุดข้อมูลหลายรายการด้วย Apply to each
Step 1: เพิ่ม Action อัปเดตข้อมูลภายในลูป Apply to each
- ภายในบล็อก Apply to each (ที่ได้จากการดึงข้อมูล Get items ในบทความก่อนหน้า) ให้คลิก Add an action
- ค้นหาและเลือก Action ของ SharePoint คือ Update item

- กำหนดค่า Site Address และ List Name เป็น M_Employees
- ในช่อง id: ให้เลือก Dynamic content ชื่อ ID จากผลลัพธ์ของ Get items เพื่อระบุแถวที่ต้องการอัปเดต


Step 2: เขียน Expression คำนวณข้อมูลและบันทึก
- ในช่องฟิลด์ข้อมูลที่ต้องการอัปเดต (เช่น คำนวณอายุอัตโนมัติในฟิลด์ Age) ให้คลิกเลือกแท็บ Expression
- ใส่สูตรคำนวณ เช่น div(sub(ticks(utcNow()), ticks(items(‘Apply_to_each’)?[‘Date_of_birth’])), 315360000000000) แล้วกด Add
- คลิกปุ่ม Save เพื่อบันทึก Flow

Step 3: ทดสอบการรัน Flow แบบปกติ (Sequential)
- คลิก Test เลือก Manually เลือก Run flow
- ตรวจสอบระยะเวลาการทำงานใน Run history จะพบว่าลูป Apply to each จะทำงานแบบทีละรายการต่อคิวกันไปเรื่อยๆ (Sequential)

Step 4: เร่งความเร็วด้วย Concurrency Control (ประมวลผลพร้อมกัน)
เนื่องจากการรันแบบปกติจะใช้เวลานานหากมีข้อมูลจำนวนมาก เราสามารถเร่งความเร็วได้ดังนี้:
- ที่มุมขวาบนของบล็อก Apply to each ให้คลิกไอคอนจุดสามจุด … แล้วเลือก Settings

- ในหน้าต่างการตั้งค่า ให้มองหาหัวข้อ Concurrency Control
- เปลี่ยนสถานะจาก Off เป็น On
- ในช่อง Degree of Parallelism: เลื่อนปรับสเกลหรือกำหนดจำนวนงานที่ต้องการให้ประมวลผลพร้อมกันในเวลาเดียว (เช่น ตั้งค่าเป็น 50 เพื่อดึงประสิทธิภาพสูงสุด)
- คลิกปุ่ม Done แล้วกด Save บันทึก Flow

Step 5: บันทึกและทดสอบรัน Flow (Save & Test)
- หลังจากตั้งค่า Pagination เรียบร้อยแล้ว ให้คลิกที่ปุ่ม Save บริเวณมุมบนขวาเพื่อบันทึกการเปลี่ยนแปลงทั้งหมดของ Flow
- ทดสอบกดปุ่ม Test เพื่อรัน Flow อีกครั้ง แล้วรอจนกว่าระบบจะประมวลผลเสร็จสิ้น

Step 6: ตั้งค่า Pagination รองรับข้อมูลขนาดใหญ่ (Threshold 5000)
- คลิกที่ไอคอนจุดสามจุด … บน Action Get items แล้วเลือก Settings

- เลื่อนลงมาเปิดใช้งาน Pagination (ตั้งค่าเป็น On)
- กำหนดค่า Threshold เป็น 5000 (เพื่อให้ระบบดึงข้อมูลเกินลิมิต 100 รายการแรกได้อย่างราบรื่นไม่มีสะดุด)

- คลิก Done และ Save เป็นอันเสร็จสิ้นกระบวนการเพิ่มความเร็วและจัดการลูปข้อมูลจำนวนมาก

Step 7: ตรวจสอบประวัติการรัน (Run History)
- เข้าไปที่หน้า Run history เพื่อตรวจสอบภาพรวมการทำงาน
- จะสังเกตเห็นว่าระยะเวลาในการประมวลผลชุดข้อมูลจำนวนหลายรายการ (เช่น ข้อมูลหลักร้อยรายการ) สามารถทำได้อย่างรวดเร็วและสมบูรณ์แบบด้วยการเปิดใช้งาน Concurrency Control

Step 8: ตรวจสอบข้อมูลปลายทางบน SharePoint List
- เปิดเข้าไปยังหน้า SharePoint List (M_Employees)
- ตรวจสอบข้อมูลพนักงาน จะพบว่าฟิลด์ที่ถูกตั้งค่าไว้ภายในลูป (เช่น การคำนวณอายุอัตโนมัติ) ได้รับการอัปเดตข้อมูลเป็นปัจจุบันครบถ้วนทุกรายการโดยอัตโนมัติทันที

ขั้นตอนการใช้งาน Power Automate Loops: การติดตามผลอย่างต่อเนื่องด้วย Do Until
Step 1: เริ่มต้นสร้าง Instant Cloud Flow
- เข้าสู่ระบบ Power Automate แล้วเลือกสร้าง Instant cloud flow
- ตั้งชื่อ Flow ในช่อง Flow name ว่า Do Until
- เลือก Trigger เป็น Manually trigger a flow แล้วคลิกปุ่ม Create

Step 2: ประกาศตัวแปรสำหรับเช็คสถานะการส่งรายงาน (Initialize variable)
- คลิก + New step ค้นหาและเลือก Action Initialize variable

- Name: ตั้งชื่อตัวแปร เช่น IsReportSubmitted
- Type: เลือกประเภทเป็น Boolean
- Value: ใส่ค่า Expression เริ่มต้นเป็น false (เพื่อระบุว่ายังไม่มีการส่งรายงาน)

Step 3: เพิ่มและตั้งค่าลูป Do Until
- คลิก + New step เลือกหมวด Control แล้วกดเลือก Do until

- ตั้งค่าเงื่อนไขการหยุดลูป (Condition):
- ช่องซ้าย: เลือก Dynamic content ตัวแปร IsReportSubmitted
- ช่องกลาง: เลือก is equal to
- ช่องขวา: ใส่ค่า Expression เป็น true (ลูปจะทำงานซ้ำไปเรื่อยๆ จนกว่าตัวแปรนี้จะเปลี่ยนเป็น true)
- Change limits (การจำกัดรอบการทำงาน): สามารถตั้งค่า Count (จำนวนรอบสูงสุด เช่น 60 รอบ) และ Timeout (เช่น PT1H หรือ 1 ชั่วโมง) เพื่อป้องกันไม่ให้ Flow รันค้างตลอดไป

Step 4: ส่ง Adaptive Card แจ้งเตือนบน Microsoft Teams ภายในลูป
- คลิก Add an action ภายในบล็อก Do until
- ค้นหา Action ของ Microsoft Teams เลือก Post adaptive card and wait for a response

- Post as: เลือก Flow bot
- Post in: เลือก Chat with Flow bot
- Recipient: ใส่ระบุอีเมลผู้รับการติดตามผล

- Message: ใส่โครงสร้าง JSON ของ Adaptive Card สำหรับสร้างปุ่มกดตอบรับ/ส่งรายงาน

Step 5: อัปเดตสถานะตัวแปรเมื่อได้รับคำตอบ
- ต่อจาก Action ของ Teams ภายในลูป ให้คลิก Add an action เลือก Set variable
- Name: เลือกตัวแปร IsReportSubmitted
- Value: กำหนดค่าเป็น true (เมื่อผู้ใช้งานกดปุ่ม Submit จากการ์ดใน Teams ค่าจะเปลี่ยนเป็น true ทำให้เงื่อนไข Do Until สมบูรณ์และออกจากลูปทันที)

Step 6: เพิ่ม Action Delay และตั้งค่าการหน่วงเวลา
- เพิ่ม Action Delay ไว้ใต้บล็อก Set variable ภายในลูป Do until

- กำหนดระยะเวลาที่ต้องการให้ระบบรอก่อนจะวนกลับไปเช็คสถานะหรือส่งข้อความซ้ำ (เช่น ตั้งค่าเป็น 1 นาที หรือกำหนดตามความเหมาะสม)
- คลิกที่ไอคอนจุดสามจุด … บน Action Delay แล้วเลือก Configure run after
- ติ๊กเลือกสถานะให้ Delay ทำงานต่อเมื่อขั้นตอนก่อนหน้า (Set variable) เกิดอาการหมดเวลา (is timed out) หรือถูกข้าม เพื่อให้ลูปทำงานต่อเนื่องได้อย่างราบรื่น จากนั้นกด Done

Step 7: กำหนดขีดจำกัดรอบการทำงาน (Change Limits)
- ที่หัวข้อ Do until ให้คลิกที่ Change limits
- Count: กำหนดจำนวนรอบสูงสุดที่อนุญาตให้วนลูป (เช่น ตั้งไว้ที่ 5 รอบ เพื่อป้องกันไม่ให้ระบบส่งข้อความแจ้งเตือนถี่หรือรันไม่หยุดหากผู้ใช้ไม่ว่างตอบ)
- Timeout: กำหนดระยะเวลาสูงสุด เช่น PT10M (10 นาที) เพื่อจำกัดเวลาการทำงานของลูปทั้งหมด
- คลิกปุ่ม Save เพื่อบันทึกการตั้งค่าทั้งหมด

Step 8: ทดสอบการทำงาน (Test Flow)
- คลิกปุ่ม Test บริเวณมุมบนขวาของหน้าจอ
- เลือก Manually แล้วกด Test เพื่อเริ่มจำลองการทำงานของ Flow

- ระบบจะเริ่มส่ง Adaptive Card ไปยังแชท Microsoft Teams ของผู้รับตามที่กำหนดไว้

- หากผู้รับยังไม่กดปุ่ม Submit ระบบจะรอจนครบกำหนดเวลา Delay แล้ววนลูปส่งแจ้งเตือนซ้ำตามจำนวนรอบที่ตั้งค่าไว้
- เมื่อผู้รับกดปุ่ม Submit บนการ์ด ตัวแปรจะเปลี่ยนสถานะเป็น true ทำให้เงื่อนไข Do Until สมบูรณ์ ออกจากลูป และจบกระบวนการทำงานอย่างสมบูรณ์แบบ


Step 9: เพิ่ม Action ส่งอีเมลสรุปผลนอกบล็อก Do Until
- เมื่อกระบวนการในลูป Do until ทำงานจนจบเงื่อนไข (เนื่องจากผู้ใช้กด Submit ส่งรายงานและตัวแปรเปลี่ยนเป็น true) ระบบจะออกจากลูปโดยอัตโนมัติ
- ให้คลิกปุ่ม + New step ด้านล่างบล็อก Do until
- ค้นหาและเลือก Action ของ Outlook คือ Send an email (V2)
- To: ระบุอีเมลของผู้รับรายงานหรือผู้ใช้งานที่ทำการส่งรายงาน
- Subject: ตั้งหัวข้ออีเมล เช่น ระบบทวงถามสถานะการส่งงาน (Weekly Report Follow-up)
- Body: ใส่ข้อความแจ้งยืนยัน เช่น เรียน คุณ [ชื่อผู้ใช้งาน], ตามที่มีการแจ้งเตือนเรื่องการส่งรายงาน Weekly Report ของสัปดาห์ที่ผ่านมานั้น ขอเรียนแจ้งว่าได้ดำเนินการส่งรายงานดังกล่าวเรียบร้อยแล้ว… พร้อมแนบฟังก์ชันวันที่ (formatDateTime) เพื่อบันทึกเวลาที่ส่งสำเร็จ
- คลิกปุ่ม Save เพื่อบันทึก Flow ทั้งหมด

Step 10: ตรวจสอบผลลัพธ์การทำงานจริงผ่าน Teams และ Outlook
- เมื่อระบบส่ง Adaptive Card ไปยังแชท Microsoft Teams และผู้ใช้งานคลิกปุ่ม Submit
- ตัวแปรสถานะจะถูกปรับเป็น true ทำให้ลูป Do Until หยุดทำงานทันที

- ระบบจะส่งอีเมลยืนยัน (Confirmation Email) ผ่าน Outlook ไปยังผู้ใช้งาน เพื่อเป็นหลักฐานว่าได้รับรายงานเรียบร้อยแล้วอย่างสมบูรณ์

Dos & Don’ts ข้อควรทำและข้อควรระวังสำหรับมือใหม่
| ข้อควรกระทำ (Dos) | ข้อควรระวังและไม่ควรทำ (Don’ts) |
| เปิด Concurrency Control เมื่อส่งงานอิสระ: ช่วยเพิ่มความเร็วในการวนลูปได้อย่างมหาศาลเมื่อแต่ละแถวไม่ขึ้นต่อกัน | เปิด Concurrency Control กับงานที่ต้องเรียงลำดับ: ห้ามเปิดหากข้อมูลแถวหลังต้องใช้ผลลัพธ์จากข้อมูลแถวก่อนหน้า |
| ตั้งค่า Count Limit ใน Do Until: กำหนดรอบการทำงานสูงสุดเสมอ (เช่น ไม่เกิน 10 รอบ) เพื่อป้องกันการติด Infinite Loop | ใส่ Action ดึงข้อมูลไว้ข้างใน Loop: หลีกเลี่ยงการใส่ Get items ไว้ในลูป เพราะจะทำให้ติด Throttle และระบบช้า |
| ใช้ Filter Query กรองข้อมูลก่อนนำเข้า Loop: กรองเฉพาะข้อมูลที่จำเป็นต้องใช้ จะช่วยลดจำนวนรอบการวนลูปลงได้ | ปล่อยให้ Do Until รันโดยไม่มี Action Delay: การไม่ใส่การหน่วงเวลาจะทำให้ระบบรันซ้ำย่อยๆ นับพันครั้งในไม่กี่วินาทีจนระบบล้ม |
การเข้าใจหลักการทำงานของ Power Automate Loops ทั้งการประมวลผลข้อมูลชุดด้วย Apply to each, การติดตามผลอย่างยืดหยุ่นด้วย Do Until และการเพิ่มสปีดระบบด้วย Concurrency Control ถือเป็นกุญแจสำคัญที่จะช่วยให้คุณก้าวข้ามการทำสคริปต์เล็กๆ ไปสู่การบริหารจัดการฐานข้อมูลขนาดใหญ่ในระดับองค์กรได้อย่างแท้จริงค่ะ
Q&A: คำถามที่พบบ่อยเกี่ยวกับการทำซ้ำข้อมูล (FAQ)
Q1: เหตุใดเมื่อเลือก Dynamic Content บางตัวเข้ามาใน Action ทั่วไป แล้วระบบถึงสร้างกล่อง Apply to each ขึ้นให้อัตโนมัติ?
A: เพราะ Dynamic Content ตัวนั้นถูกส่งมาจาก Action ก่อนหน้าที่คืนค่าผลลัพธ์มาเป็นชุดข้อมูล (Array/List) ค่ะ เช่น การดึงไฟล์ หรือดึงรายการใน SharePoint ตัวแพลตฟอร์มจึงฉลาดพอที่จะสร้างกล่อง Apply to each มาครอบ Action นั้นให้อัตโนมัติ เพื่อให้แน่ใจว่าคำสั่งจะถูกทำซ้ำกับทุกไอเท็มในชุดข้อมูลนั้นค่ะ
Q2: ตัววนลูป Do Until มีการตั้งค่าจำกัดจำนวนรอบการทำงานสูงสุดไว้หรือไม่?
A: มีค่ะ ค่าเริ่มต้น (Default Limits) ของ Do Until จะตั้งไว้ที่รันซ้ำไม่เกิน 60 รอบ หรือระยะเวลารวมไม่เกิน 1 ชั่วโมง หากอย่างใดอย่างหนึ่งครบกำหนดก่อน ระบบจะหลุดออกจากลูปทันทีแม้เงื่อนไขจะยังไม่สำเร็จ คุณสามารถเข้าไปปรับแก้ขีดจำกัดนี้ได้ในส่วน Change limits ภายในกล่อง Action ค่ะ
Q3: ในการใช้ Apply to each หากเกิด Error ขึ้นกับข้อมูลแถวที่ 5 ข้อมูลแถวถัดไปจะยังคงทำงานต่อหรือไม่?
A: หากเป็นโหมดปกติ (Sequential) การเกิด Error ที่แถวใดแถวหนึ่งจะทำให้ลูปหยุดชะงักลงทันทีค่ะ แต่หากคุณเปิดใช้งาน Concurrency Control รายการอื่นๆ ที่ถูกประมวลผลพร้อมกันในสาขาขนานจะยังคงรันต่อจนจบค่ะ
Q4: สามารถใช้ Action Condition แทรกไว้ภายในกล่อง Apply to each ได้ไหม?
A: ทำได้แน่นอนค่ะ คุณสามารถนำ Action Condition หรือ Switch ไปวางไว้ภายในลูปเพื่อตรวจสอบค่าของแถวข้อมูลนั้นๆ ก่อนที่จะสั่งให้ทำ Action ถัดไปได้ เช่น วนลูปดูพนักงานทุกคน แต่จะส่งอีเมลหาเฉพาะพนักงานที่สังกัดแผนก “IT” เท่านั้นค่ะ
Q5: หากต้องการยกเลิกการวนลูปกลางคันเมื่อเจอข้อมูลที่ต้องการแล้ว ต้องทำอย่างไร?
A: ปัจจุบันแพลตฟอร์มยังไม่มีคำสั่ง Break หรือ Exit Loop โดยตรงสำหรับ Apply to each ค่ะ ดังนั้น หากคุณต้องการความสามารถในการหยุดวนลูปทันทีเมื่อเจอเงื่อนไขที่กำหนด แนะนำให้เปลี่ยนโครงสร้างไปใช้ Do Until ร่วมกับการตั้งค่าตัวแปรแทนค่ะ