Skip to main content

จับ SharePoint Workflow 2013 มาชนกับ User Profile

Submitted by ezybzy on

ได้รับความต้องการสนุก ๆ มาข้อหนึ่งในการทำ SharePoint Workflow 2013 นั่นคือ มันต้องหา Manager ของ User ที่เป็นคนสร้างเอกสารให้ได้ เพื่อขออนุญาตทำกิจกรรมบางอย่าง (สร้าง Task ให้ Manager นั่นเอง)

ตอนแรกก็คิดว่าถึงคราวที่จะต้องขุด REST API ของ SharePoint ขึ้นมาผสมกับ Call Web Service ซึ่งเป็น Action ใหม่ใน SharePoint Workflow 2013 แล้วก็เป็นเช่นนั้น แต่หนทางมันกลับไม่ได้ง่ายอย่างที่คาด

จากบทความ Work with user profiles in SharePoint 2013 มองดูรอบ ๆ มีตัวอย่างหนึ่งที่เราใช้ได้เลยนั่นก็คือ

REST: GET http://<siteUri>/_api/SP.UserProfiles.PeopleManager/GetUserProfilePropertyFor(accountName=@v,propertyName='PreferredName')?@v='domain\user'

ทำการแก้ไขนิดหน่อยเปลี่ยนจาก PreferredName เป็น Manager แทน แต่ทีนี้ปัญหาที่พบก็คือ url ด้านบนนี้ โดยค่าปริยายผลลัพธ์ที่ SharePoint จะตอบกลับมาจะเป็น XML ซึ่งไม่สามารถนำมาใช้ต่อบน SharePoint Designer Workflow ได้

เราจำเป็นต้องปรับเปลี่ยนนิดหน่อยโดยการปั้น Request Header เพิ่มเข้าไปเพื่อบังคับให้ผลลัพธ์ที่ตอบกลับมาเป็น json ตามแบบที่ Action ตัวนี้คาดหวังไว้ วิธีการตามที่ Serge Luca ได้อธิบายไว้ใน Calling the SharePoint 2013 Rest API from a SharePoint Designer Workflow นั่นคือ ใช้ Action ชื่อ Build Dictionary สร้าง Dictionary ที่มีคีย์และค่าดังนี้

Accept : application/json;odata=verbose
Content-Type : application/json;odata=verbose

พรุ่งนี้มาดูผลว่า จะได้ตามที่ Luca แนะนำไว้หรือไม่ ยังไม่พอครับ ต้องมี header พิเศษอีกตัวนั่นคือ Authorization (ดู Kevin.Talbot) แล้วก็จะมีประเด็นอีกเรื่องคือ Login Name ที่ได้มามันไม่ใช่ full domain แต่กลายเป็น claim แทนซึ่งมีปัญหาตรง # ซึ่งอาจจะต้องแก้ให้เป็น %23 แทน

เมื่อเราใช้ Action ชื่อ Get Item from Dictionary ดึง Manager ออกมาแล้วจากผลลัพธ์ของ Call HTTP Service จะพบว่ามันอยู่ในสภาพ domain\username ทำให้ต้องใช้ Replace String เปลี่ยน \\ เป็น \ แล้วเมื่อจะนำไปใช้ในการสร้าง Task หรือแม้แต่การตรวจสอบ User จำเป็นต้อง Cast ค่าให้กลับมาเป็น Login Name อีกหน มิเช่นนั้น Workflow อาจจะถูก Suspended ได้

ออ นอกจากนี้ยังมีตัวอย่างการทำ POST เข้าหา REST เช่นกัน ดูตัวอย่างของ Borislav Grgić ก็สามารถนำไปทำกิจกรรมบางอย่างได้ แต่ทั้งนี้ก็ขึ้นกับสิทธิ์ของคนสั่ง Workflow นั่นเองว่าจะสามารถทำได้หรือไม่

Tags