การซ่อน SharePoint List ด้วย Power Automate Flow และ PowerShell
Content difficulty — Technical
จากตอนที่แล้วเราได้มีการ hide input บาง column บน SharePoint Online List เพื่อไม่ให้ user สามารถมา input ในค่าที่เราไม่ต้องการให้เขามา edit ได ้ซึ่งสามารถดูตอนที่แล้วได้ที่
เนื่องด้วยการกรอก SharePoint List ในสมัยนี้หลายๆองค์กรอาจจะไม่ได้ให้ user ได้มากรอกตรงๆใน SharePoint Site อีกต่อไปแต่มีการสร้าง Power Apps Canvas เข้ามาโดยการทำเป็น Form ให้กรอกและดู Data ผ่าน Gallery Object ซะเป็นส่วนใหญ่
ซึ่งการ communicate ให้ user ได้ใช้งานก็จะเป็นการบอก user แค่ว่าให้มาใช้ Power Apps ในการกรอก Form request หรือ Data Entry ต่างๆแค่ทางเดียว แล้วคนที่ทำ app เองก็สามารถ Filter หรือ ป้องกัน Field หรือ ข้อมูลใน row บางอย่างที่ฝั่ง Power Apps (Client side) ด้วยการใช้เทคนิคลูกเล่นของทาง Power Apps เช่น Lock การ edit บาง field หรือให้ view data แค่ของที่ตัวเอง add เข้าไป
แต่ user เองสุดท้ายแล้วเขาก็ยังสามารถ เข้าไป SharePoint List นั้นๆได้ถ้ารู้ว่า SharePoint Site นั้นชื่อว่าอะไร หรือ Search หาชื่อ list หรือ Item นั้นๆได้เลยเพื่อเข้าไปหาที่อยู่ของ SharePoint List นั้นแม้ว่า permission จะเหมือนกับที่ Power Apps แต่ user ก็อาจจะเห็นอะไรมากกว่าที่ทาง App maker เขาจำกัดไว้ที่ App
อันที่จริงแล้ว SharePoint ก็มี Security role พอสมควร โดยมี Default เป็น SharePoint Group แต่ก็สามารถ add ตัว user เป็นคนๆ หรือ Security Group ที่ทางองค์กรทำมาจาก Azure AD เพื่อสร้าง unique permission ในการ access หรือ edit ระดับ Document Library, Folder, File, SharePoint List หรือ Item ให้ต่างกันได้ เช่น การไม่ให้มองเห็นข้อมูล หรือ ห้าม Add/Edit ซึ่งจะสามารถสร้างให้ list นี้มีความ unique กว่า permission อื่นๆใน List หรือ Document Library ที่อยู่ใน SharePoint Site เดียวกันก็ได้ด้วย
แต่เนื่องจากบางทีการ maintain อาจจะต้องทำทั้ง 2 ฝั่งคือดูทั้ง Power Apps + Flow และในขา SharePoint List รวมถึงอาจจะต้องไปยุ่งฝั่ง Azure AD Groups ด้วยถ้ามีความต้องการในส่วนของ Permission ที่ละเอียดแบบนั้นในบางสถานการณ์อาจจะไม่สะดวกนัก หรือไม่ได้มีความต้องการการสร้าง Role หรือ ระดับ Permission ให้ยุ่งยากขนาดที่เหมือนระดับ Database หรือ Service แบบ Dataverse เพราะคนทำอาจจะ maintain ลำบากในกรณีที่มี user ใหม่เข้ามาใช้งานในบริษัท ถ้าเทียบกับว่า App มันไม่ได้ Business critical มากขนาดนั้น
Requirement ที่ต้องการอยากจะแค่สามารถซ่อน SharePoint List ในการ Search หา หรือจากใน SharePoint Site หลักเท่านั้นเพื่อให้ยากขึ้นต่อการมาเข้าตรงๆ
Solutions
มีความสามารถในการ Hide ตัว SharePoint List ได้ 2 วิธีครับ
- ผ่าน Power Automate Flow ซึ่งไม่ต้องใช้ SharePoint Administrator account
- ผ่าน PowerShell ซึ่งต้องมีการใช้ SharePoint Administrator หรือ Global Administrator account
ตรงนี้ก็ที่เสนอมาลองไปปรับใช้กันดูครับ จริงๆแล้วอาจจะไม่ใช่ ideal solution แต่ก็คิดว่าตอบโจทย์หลายๆคนครับ (Ideal solution ก็มีอยู่ครับแต่มีความซับซ้อนทั้งในการ setup ทั้งฝั่ง SharePoint และ Power App Canvas App ครับ)
สมมุติมี SharePoint Site อยู่ Site นึง และ SharePoint List ชื่อ 2Fellows อยู่ใน SharePoint site ชื่อ testsite
เข้าตรงผ่าน https://xxx.sharepoint.com/sites/testsite/Lists/2Fellows/AllItems.aspx
ถ้าเป็น SharePoint ที่สร้างจาก Microsoft Teams จะเป็น https://xxx.sharepoint.com/teams/testsite/Lists/2Fellows/AllItems.aspx
โดยเราเองควร copy ตัว URL เข้า List ตรงนี้เก็บไว้เองก่อนครับเพราะถ้าเรา hide จะหาเองไม่ได้ด้วย สุดท้ายแล้วทั้งเราและ user อื่นถ้าอยากจะเข้าตรงก็จะต้องรู้ URL เข้าตรงเท่านั้น ซึ่งการซ่อนแบบนี้ก็โอเคในระดับหนึ่งเลยในเบื้องต้น
แบบ Power Automate
อันนี้เราจะสร้าง Flow แบบ Instant Flow ให้ run แค่ครั้งเดียว จะใช้อีกทีกับ SharePoint List นั้นๆก็ตอนเราจะ run flow นี้เพื่อ unhide
ไปสร้าง Flow ที่ https://flow.microsoft.com/ และไปที่ My Flow -> + New Flow -> Instant cloud flow
ให้เราสร้างแบบ Manually trigger a flow แล้วใส่ Input ไป 2 อันครับ
ประเภท Text Input
SPO Site, SPO Listname และของ Hidden ให้กด … แล้วทำเป็น Add Dropdown list option คือ true และ false
จากนั้น Add Action ของ SharePoint ชื่อ HTTP request to SharePoint จากนั้นใส่ parameter ดังนี้ (ดูรูปด้านล่างประกอบ)
Site Address: ใส่ Dynamic content ค่า Input ของ SPO Site
Method: POST
Uri: /_api/web/lists/GetByTitle(SPO Listname)
Dynamic Content ของ SPO Listname ต้องครอบด้วยตัวฟันหนูตรง
Headers: ใส่ค่าระหว่าง ลูกน้ำในแต่ละบรรทัดดังนี้
X-HTTP-Method, MERGE
Content-Type, application/json;odata=verbose
IF-MATCH, *
Accept, application/json;odata=verbose
Body: ให้ใส่ค่าตามด้านล่าง
{
“__metadata”: {
“type”: “SP.List”
},
“Hidden”: ตรงนี้ Dynamic Content ชื่อ Hidden ,
“NoCrawl”: ตรงนี้ Dynamic Content ชื่อ Hidden
}
ทุกอันใช้ครอบด้วยตัวฟันหนูตรง แทน “”
จากนั้น Save แล้ว test เพื่อ run manually ระบบจะถาม Input 3 ตัวคือ SPO Site และ SPO Listname ให้ใส่ตามที่เราต้องการ แล้วตัวที่ 3 ก็เลือกเป็น hidden เป็น true ครับเพราะเราจะซ่อน ส่วน false อันนี้ไว้ใช้ run ตอน จะ unhide
แบบ PowerShell
ทำได้โดยการ Download PowerShell module ของ SharePoint PnP ถ้าใครเคยทำแล้วก็ข้ามไปได้ โดยเราจะ run script 2 บรรทัดนี้ใน Windows PowerShell ในแบบ run as administrator
Install-Module -Name PnP.PowerShell
Update-Module -Name PnP.PowerShell
ใส่ชื่อ SharePoint Site ใน variable ชื่อ $SiteURL และ ชื่อ SharePoint List ใน site นั้นใน variable ชื่อ $ListName
$SiteURL = “https://TenantName.sharepoint.com/sites/YouSPOsiteName"
$ListName = “Your SPO list Name”
จากนั้น run command นี้เพื่อ hide ตัว SharePoint List ซึ่งจะมีการ Sign In ใหใส่ username password ของ SharePoint Administrator หรือ Global Administrator
Connect-PnPOnline -Url $SiteURL -Interactive
Set-PnPList -Identity $ListName -Hidden $true -NoCrawl $true
Disconnect-PnPOnline
ในจุดนี้จะมีการ Hide ตัว List เรียบร้อยซึ่งถ้าอยากเอากลับคืนมาก็ให้เปลี่ยน Command ใน Set-PnPList ตรงส่วน $true เป็น $false
แต่ในฐานะ Admin ก็จะเห็นได้รวมถึงอันอื่นที่ไมได้ซ่อนไว้โดยคำสั่ง Get-PnPList
ผลลัพธ์
ตัว SharePoint List ที่ชื่อ 2Fellows จะหายไปจาก Navigation tab, Site Contents และ ไม่สามารถ Search เจอได้
ถ้าเราสร้าง Flow เพื่อจะ target ไปที่ list นั้นเราก็จะไม่มี auto-suggestion ขึ้นมาต้อง Enter custom value ว่า “2Fellows” เองครับถึงจะต่อได้
ในส่วน Power Apps ถ้าเราสร้าง App แล้วจะต่อ List นี้ด้วย SharePoint connector หลังจากที่ใส่ URL ชื่อ Site ไปก็จะไม่เหน List นี้ เช่นกัน ถ้าอยากต่อจะต้อง Enter custom table name ว่า “2Fellows”