การ run ตัว Flow ที่ trigger จาก Flow หลักใน Power Automates (Child Flow & Parent Flow)

Narisorn Limpaswadpaisarn
EchoO365
Published in
4 min readMar 12, 2021

Content difficulty — Technical

วันที่จะมาว่ากันด้วยแนวทางการแก้จำนวน Action ของ Power Automate (หรือ Azure Logic Apps) ครับซึ่งในแต่ละ flow จะมี limit ตัว Action ให้สร้างได้แค่ที่ 500 ตัวครับ ถ้าเกินกว่านั้นก็จะไม่สามารถสร้างเพิ่มได้

คราวนี้ถ้า requirement ของเรามีความ complex มากจริงๆ เช่นการทำ sequential approval ว่าคนแรก approve เสร็จมาคนสองต่อ ตัว action ก็อาจจะเกินได้ (ในกรณีเราทำการ loop หลายๆครั้งด้วย) แล้วก็ยังมี limit ในส่วนของการทำ approval ซ้อน approval อีกใน condition ซ้อนๆกัน (Nested condition) ก็จะมี limit อยู่ที่ 8 ชั้น เพราะฉะนั้นถ้ามีคนที่เก้าก็อาจจะเพิ่มมาไม่ได้

Nested condition

สำหรับ limitation ทั้งหมดของ Power Automate ดูได้ที่ https://docs.microsoft.com/en-us/power-automate/limits-and-config

ซึ่งก็เป็นที่มาของการทำ Child flow เอามาแก้โจทย์ให้ trigger จาก flow หลักไป flow อื่นได้ ทำให้เราสามารถลดความซับซ้อนใน flow หลักด้วย เนื่องจากจำนวน action ที่เยอะเกินถ้าเราใช้ Child flow แล้วเราก็อาจจะลด action ใน flow หลัก แล้วยกไป flow อื่นๆได้ ผลคือเกิด performance ที่ดีขึ้นหรือ บริหารจัดการ debug ได้ง่ายและแก้ 500 actions limit

Requirements

การสร้าง Child Flow เราจะใช้ Action ของการไปสั่ง trigger ตัว Child Flow ใน Power Automate แต่การที่เราจะใช้ได้จะต้อง group ตัว flow ทั้งตัวหลัก (Parent Flow) และตัวที่มา run ต่อ (Child Flow) ไปในสิ่งที่เรียกว่า Solutions ซะก่อน ซึ่ง concepts ของ Solutions บน Power Platforms จะซับซ้อนซักหน่อย แต่ main idea คือเราสามารถ group ตัว services ซึ่งอาจจะประกอบด้วย Apps ของ Power Apps, Flows, Connectors หรือ schema ของ Dataverse ใน Environment เราตั้งเป็น Solutions รวมถึงการที่เราสามารถตั้ง Versioning ของ Solutions เพื่อสามารถ deploy ไปยัง Environment อื่นๆทั้งในและนอก Office 365 tenant ได้เหมาะสำหรับในกรณีการทำ DevOps ของ Power Platform เพราะไม่งั้นเราต้อง Export/Import ตัว flow หรือ Apps ที่มี dependency กันแบบ manual

สมมุติว่าผมต้องการทำ Flow สองอันมีชื่อว่า

1 Parent Flow test (Form attachment) ที่มาจากตอนที่แล้วซึ่งเป็น Microsoft Form request ที่ให้ user มากรอกเพื่อขอ claim เงิน ซึ่งสามารถแนบหลักฐานไปใน Form ได้และมีการทำ Approval

ตอนที่แล้วสามารถดูได้ที่ https://link.medium.com/Gj77YLoOyeb

2 child flow test ตัวที่จะมา run ต่อจาก flow ตัวแรก

เรามาสร้าง Solution ก่อนในหน้าของ https://flow.microsoft.com/

ซึ่งในตัวอย่างนี้ จะสร้าง Solutions บน Default Environment ที่มี user permissionในการสร้าง

สร้าง Solution ใหม่

ใส่ชื่อของ Solutions และสร้าง Publisher ของเราใหม่ด้วยชื่อ Display Name และ Prefix

Prefix จะคล้ายๆชื่อ schema ที่ใช้บน Dataverse (คล้ายๆพวก dbo. ของ SQL) ซึ่งในตัวอย่างนี้ไม่ได้เน้นก็ขอให้ใส่ไปก่อน อย่างอื่นเป็น Default

ใส่ชื่อ solution และ สร้าง Publisher (รูปขวา ทั้ง name และ prefix) และใส่ version ตามชื่อที่สมควร

สร้าง Child Flow

ให้เราสร้าง Child flow ขึ้นมาภายใน Solution

จะเป็นประเภท Cloud Flow

โดย trigger จะเป็น Manually trigger a flow แล้วก็จะมี parameter ที่รอรับจาก Parent flow ซึ่งเราก็ต้องมาคิดโจทย์เราว่า เราต้องการค่า parameter อะไรมาใส่เป็น input เพื่อ run ตัว Child flow

เช่นในกรณีนี้

สมมุติว่ามีโจทย์คือ มีตัว Parent คือ approver คนแรก ถ้าทำการ approve ให้ส่งไป Child flow ในนั้นเป็น approver คนที่สอง

การที่ Child flow จะ run เพื่อไปหา approver คนที่สอง กรณีนี้คนที่สองก็คงอยากจะเห็น Content ใน Form ของที่ user กรอกมาเหมือนคนแรก เช่นว่าเขาขอ Request วันไหน เป็นใคร หรือ แนบไฟล์อะไรมา

ซึ่งการที่เราจะดึง content จาก Form นั้นมาได้ เราก็ต้องหาว่าเป็น From ID ที่เท่าไหร่ในระบบ กรณีนี้ค่าของ Form ID ใน Action ของ Power Automate จะเรียกว่า Response Id (คือทุกครั้งที่คนไปตอบ Microsoft Form แต่ละครั้งมันก็จะเก็บคำตอบคนกรอกและนับ Response Id ของแต่ละคนไว้เพื่ออ้างอิง) เพราะฉะนั้น parameter แรกคือ Response Id (ซึ่งเป็นประเภท Integer ไม่ใช่ String) ส่วน parameter อันสองอาจจะเก็บชื่อคน หรือ comment ของ คน approve คนแรกหรืออื่นๆก็แล้วแต่สะดวก

นอกจาก Manually trigger a flow แล้วใช้ trigger เช่น จากปุ่ม Power Apps หรือ When an HTTP request is received ก็ trigger Child flow ได้เช่นกัน

เลือก input ที่ต้องการที่คิดว่าจะรับมาจาก Parent Flow (Respond Id เป็นประเภท Number) และ Data type ที่ต้องการ

หลังจากนั้นก็สร้าง Action ตามที่ต้องการใน Child Flow เช่นผมเอา Respond Id ของ Microsoft Form มาเพื่อเอา content ของคนที่กรอก Form ว่า กรอกไรไป แนบไฟล์อะไรบ้าง ในกรณีเอาไฟล์แนบก็ไป Get file content ตามปกติเพื่อส่งเมล์ไปให้ approver คนที่สอง ซึ่งรายละเอียดการสร้าง Flow ก็จะเหมือนกับตอนที่แล้ว

เราก็ต่อ Flow ตามปกติ

เมื่อเราเสร็จแล้วสุดท้ายของ Child Flow ให้เราเพิ่มไป 1 Action คือ Respond to a PowerApp or flow ในกรณีนี้ก็ลอก parameter แบบอันต้นให้เป็น Output

Respond to a PowerApp or flow

ให้ save flow แล้วออกมาที่หน้าของการ manage flow จากนั้นไปแก้ในส่วนของ run only ใน Connector ออกให้หมด

Run only users
แก้ connection เอา run only ออก

สร้าง Parent Flow

เราสามารถสร้าง Flow ใหม่แบบตอนที่สร้าง Child Flow ได้เลยหรือเราจะ import จากที่เราเคยสร้าง ซึ่งจากหน้า Solution เราสามารถ import ตัว cloud flow ของเราที่มีอยู่แล้วนอก Solutions เข้ามาใน Solutions นี้ได้ (ยกเว้น Flow ที่มี trigger ประเภท Instant flow)

แล้วก็เลือก Flow ที่เป็น parent เข้ามา

จากนั้นเราก็สร้าง Flow โดยการ add trigger และ action ตามปกติ หรือถ้า import มาก็ไป edit flow โดยใน step สุดท้าย (หรือหลังจาก step ที่เราต้องการจะไป trigger ตัว Child flow) เราจะ add action ชื่อ Run a Child Flow เข้ามาในกรณีนี้จะสั่งให้ run ตัว Child flow มาเมื่อ approver คนแรกทำการ approve

ถ้า Flow ไม่ได้อยู่ใน Solutions เราจะหา action นี้ไม่เจอ

Run a Child Flow

เมื่อเราเลือก action แล้วก็เลือกชื่อของ Child Flow จากนั้นตัว parameter ที่ required ก็จะโผล่ขึ้นมาเราก็ใส่ dynamic content ตามเราต้องการที่จะส่งไป Child Flow จากนั้นก็ Save แล้วลอง run

ถ้า Child flow run แล้ว Failed อาจจะทำให้ Parent Flow มี Status เป็น failed ไปด้วย

ถ้า Save แล้วขึ้น error แล้วเราคิดว่าเราได้ทำในส่วนของ Run only user และ Respond to a PowerApp or flow ไปแล้วอันนี้อาจจะเป็น bug ของ Power Automate ซึ่งมีปัญหากับการ import flow ที่เรามีอยู่แล้วจากนอก Solutions

ทางแก้คือเราต้องสร้าง Parent Flow เองใหม่จากในหน้า Solutions

Parent Flow run ผ่าน
Child Flow รับค่ามาจาก Flow แรกสำเร็จ

--

--

Narisorn Limpaswadpaisarn
EchoO365

Office 365 and Modern Workplaces: Please follow my publication https://medium.com/echoo365 for Microsoft 365 & Power Platform Blog (In Thai)