การซ่อน SharePoint List ด้วย Power Automate Flow และ PowerShell

Narisorn Limpaswadpaisarn
EchoO365
Published in
5 min readOct 19, 2021

Content difficulty — Technical

จากตอนที่แล้วเราได้มีการ hide input บาง column บน SharePoint Online List เพื่อไม่ให้ user สามารถมา input ในค่าที่เราไม่ต้องการให้เขามา edit ได ้ซึ่งสามารถดูตอนที่แล้วได้ที่

เนื่องด้วยการกรอก SharePoint List ในสมัยนี้หลายๆองค์กรอาจจะไม่ได้ให้ user ได้มากรอกตรงๆใน SharePoint Site อีกต่อไปแต่มีการสร้าง Power Apps Canvas เข้ามาโดยการทำเป็น Form ให้กรอกและดู Data ผ่าน Gallery Object ซะเป็นส่วนใหญ่

การกรอก Form ระหว่างกรอกตรงที่ SharePoint List หรือ ผ่าน App หน้ากากอย่าง Power Apps

ซึ่งการ 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

List ต่างๆที่ยังอยู่ใน SharePoint Site
หรือ Search หา List item ได้
user เข้าได้ 2 ทางทั้งจาก Power Apps หรือ เข้าตรง

อันที่จริงแล้ว 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 เดียวกันก็ได้ด้วย

ตัวอย่างการปรับและการ Add Security Group มาเป็น role เพื่มใน Advance Security Settings
Permission Level ที่เป็น Default template แต่สามารถเข้าไปปรับให้มีมากกว่านี้ได้

แต่เนื่องจากบางทีการ 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 วิธีครับ

  1. ผ่าน Power Automate Flow ซึ่งไม่ต้องใช้ SharePoint Administrator account
  2. ผ่าน 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

Site ยังไม่ได้ถูกซ่อนซึ่งจะอยู่ใน Navigation tab ด้านซ้ายและใน Site Contents

โดยเราเองควร 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

สร้าง Flow

ให้เราสร้างแบบ Manually trigger a flow แล้วใส่ Input ไป 2 อันครับ

ประเภท Text Input

SPO Site, SPO Listname และของ Hidden ให้กด … แล้วทำเป็น Add Dropdown list option คือ true และ false

Manually trigger a flow

จากนั้น 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
}

ทุกอันใช้ครอบด้วยตัวฟันหนูตรง แทน “”

HTTP request to SharePoint

จากนั้น Save แล้ว test เพื่อ run manually ระบบจะถาม Input 3 ตัวคือ SPO Site และ SPO Listname ให้ใส่ตามที่เราต้องการ แล้วตัวที่ 3 ก็เลือกเป็น hidden เป็น true ครับเพราะเราจะซ่อน ส่วน false อันนี้ไว้ใช้ run ตอน จะ unhide

test เพื่อ run flow

แบบ PowerShell

ทำได้โดยการ Download PowerShell module ของ SharePoint PnP ถ้าใครเคยทำแล้วก็ข้ามไปได้ โดยเราจะ run script 2 บรรทัดนี้ใน Windows PowerShell ในแบบ run as administrator

Install-Module -Name PnP.PowerShell

Update-Module -Name PnP.PowerShell

Download and update PowerShell module

ใส่ชื่อ SharePoint Site ใน variable ชื่อ $SiteURL และ ชื่อ SharePoint List ใน site นั้นใน variable ชื่อ $ListName

$SiteURL = “https://TenantName.sharepoint.com/sites/YouSPOsiteName"

$ListName = “Your SPO list Name”

Input variables

จากนั้น 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

PnP command

ในจุดนี้จะมีการ Hide ตัว List เรียบร้อยซึ่งถ้าอยากเอากลับคืนมาก็ให้เปลี่ยน Command ใน Set-PnPList ตรงส่วน $true เป็น $false

แต่ในฐานะ Admin ก็จะเห็นได้รวมถึงอันอื่นที่ไมได้ซ่อนไว้โดยคำสั่ง Get-PnPList

Admin ยังเรียกทั้งหมดขึ้นมาดูได้แต่ในหน้าของ user จะซ่อนไว้แล้ว

ผลลัพธ์

ตัว SharePoint List ที่ชื่อ 2Fellows จะหายไปจาก Navigation tab, Site Contents และ ไม่สามารถ Search เจอได้

2Fellows หายไปจากทั้ง Navigation Tab และ Site Content

ถ้าเราสร้าง Flow เพื่อจะ target ไปที่ list นั้นเราก็จะไม่มี auto-suggestion ขึ้นมาต้อง Enter custom value ว่า “2Fellows” เองครับถึงจะต่อได้

ต้อง Enter custom value

ในส่วน Power Apps ถ้าเราสร้าง App แล้วจะต่อ List นี้ด้วย SharePoint connector หลังจากที่ใส่ URL ชื่อ Site ไปก็จะไม่เหน List นี้ เช่นกัน ถ้าอยากต่อจะต้อง Enter custom table name ว่า “2Fellows”

เทียบกับ List อื่นใน SharePoint Site นี้แล้วตัว 2Fellows จะหายไปถ้าอยากต่อจะต้อง Enter custom table name

--

--

Narisorn Limpaswadpaisarn
EchoO365

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