天天看點

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

我是微軟Dynamics 365 & Power Platform方面的工程師/顧問羅勇,也是2015年7月到2018年6月連續三年Dynamics CRM/Business Solutions方面的微軟最有價值專家(Microsoft MVP),歡迎關注我的微信公衆号 MSFTDynamics365erLuoYong ,回複460或者20211123可友善擷取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!

前面的博文:​​讀取Excel對使用者執行增加/移除角色的控制台程式​​ 我用的是程式,微軟大力推薦低代碼平台Power Platform,我今天就做個簡單的例子,我就讀取Excel來授予使用者角色。

大緻包括幾個步驟:

  • 讀取Excel中的所有記錄
  • 每行看下【增加角色】列是否有值
  • 【增加角色】列有值的話,查詢下使用者是否已經有這個角色
  • 若使用者沒有這個角色,再去Dynamics 365中查詢這個角色的資訊
  • 若是Dynamics 365存在這個角色的資訊,将其授予給使用者

我的Excel内容示例如下:

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

首先需要對Excel進行處理,選擇要處理的内容,點選 【Insert】 > 【Table】,其餘保持預設即可。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

還需要将要處理的Excel上傳到某個地方,我這裡上傳到Onedriver for business中,如下:

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

登入 ​​https://make.powerapps.com/​​ ,點選 Solutions,打開自己的某個Solution,點選【New】>【Automation】>【Cloud flow】>【Instance】,我這裡是新界面,如果不一樣也不用擔心,Instant類型的flow一般是手工觸發運作,其他兩種類型的Cloud flow從名字可以看出來,第一種是事件觸發的flow,第三種是定期運作的flow。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

彈出界面我這麼設定,觸發器(trigger)我選擇Manually trigger a flow。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

我先使用Initialize variable 這個Action 聲明兩個數組類型的變量。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色
使用Cloud Flow無代碼實作讀取Excel授予使用者角色

然後使用Excel Online (Business)中的 List rows present in a table這個Action來擷取excel中的資料。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

這個步驟的具體設定如下:

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

對于每行資料我要循環處理,都要查詢其使用者資訊,是以我添加一個Microsoft Dataverse下面的List rows 這個Action。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

我根據使用者名來查詢使用者,寫法如下,我這裡隻查詢處我需要的三列fullname,_businessunitid_value,systemuserid,注意對于查找字段不能寫字段邏輯名,前面要加上_,後面要加上 _value,這個使用者名我使用前面步驟傳回的【使用者主體名稱】這個字段的值,選擇後可以看到自動會幫我生成一個for each。我這裡還設定了Row count為1,因為我隻需要第一條記錄即可。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

我先檢查要增加的角色列的值不為空,如下:

檢查的左邊的表達式是:empty(items('Apply_to_each_Excel_Row')?['增加角色'])

操作符是:is not equal to

右邊的表達式是 true。

如果不為空我這裡會将之前聲明的變量 toAssociateRoles 設定為null,用來存儲每個使用者需要添加的角色清單。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

下面我還是用一個for each将角色放到變量toAssociateRoles待用。這個for each針對的表達式是 split(items('Apply_to_each_Excel_Row')?['增加角色'],';') ,也就是每行excel的【增加角色】列的值使用;分隔成一個數組,然後逐個添加到變量toAssociateRoles。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

然後我需要找出使用者目前有哪些角色,需要添加的角色使用者目前不擁有我才添加給使用者。是以我查詢下使用者的角色,這裡我用的FetchXml進行查詢,如下:

<fetch version='1.0' mapping='logical' distinct='true' no-lock='true'>
<entity name='role'>
<attribute name='name' />
<attribute name='roleid' />
<link-entity name='systemuserroles' from='roleid' to='roleid' visible='false' intersect='true'>
<link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ad'>
<filter type='and'>
<condition attribute='systemuserid' operator='eq' value='@{items('Apply_to_each_User')?['systemuserid']}' />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>      
使用Cloud Flow無代碼實作讀取Excel授予使用者角色

類似的,我清空 CurrentRolesofUser變量後用個foreach将使用者的角色添加到CurrentRolesofUser變量中,用變量是為了後面維護起來友善。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

然後我需要針對每個要添加的角色,看下使用者目前是否存在。這個for each的輸入表達式是 variables('toAssociateRoles') ,檢查表達式左邊是 contains(variables('CurrentRolesofUser'),items('Apply_to_each_toAssiciateRoles')) ,右邊是false。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

如果不存在,當然我們要先查詢出這個角色的id,查詢角色id需要根據角色名稱+使用者的業務部門來查詢,類似如下:

name eq '@{items('Apply_to_each_toAssiciateRoles')}' and _businessunitid_value eq '@{items('Apply_to_each_User')?['_businessunitid_value']}'

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

如果查詢到了角色,也就是判斷這個查詢結果是否傳回記錄,我這裡進行如下判斷:

length(outputs('Get_role_info_by_role_name_and_business_unit')?['body/value']) 的值是否等于1.

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

如果找到的話就授予使用者這個角色,沒有找到可能就是角色名稱寫錯了。

授予角色不是更新記錄,需要用到 Relate rows這個Action

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

具體的Action設定如下:

Row ID我設定的表達式是:items('Apply_to_each_User')?['systemuserid']

Relate with我設定的表達式是:first(outputs('Get_role_info_by_role_name_and_business_unit')?['body/value'])['@odata.id']

因為我知道前面步驟傳回role的數組隻有一個元素,是以我這裡也不想自動生成for each了,直接取第一行,讓flow看起來更加簡單一點。

使用Cloud Flow無代碼實作讀取Excel授予使用者角色

繼續閱讀