从今天开始,我们一起来拆解Powerapps模板库里的一个"请假申请", 看看其构成模块、涉及到的函数、处理逻辑等,希望能从中学到点新东西。
同时,解析的内容中如有差错,也还请朋友们随时指出,感激不尽!!!
1. 首先登录到Powerapps里,利用模板创建出"Leave Request"这个App。
2. 看一下App的总体结构
等App创建完成后,从左边的树状视图里可以看到App的所有Screen构成。
最下面的三个是App的参数配置说明,本文就不加描述了。
剩下的就是App运行所需的各个主体Screen(如下面的截屏),接下来我们根据App的运行逻辑来逐个进行解析。
这里的“App”是一个对象,用于为当前的App 提供数据(比如全局变量、集合数据)及总体性的控制。App 对象里有两个属性最常用:
本文的App对象里就在OnStart属性里使用了 Set 和 Collect 函数,下面具体来看OnStart属性的代码设置:
OnStart = //设置启动时要执行的操作
Concurrent( //同时执行多个函数,语法:Concurrent( Formula1, Formula2 [, ...])
ClearCollect( //ClearCollect代码段的目的: 将假期类型添加到自定义的集合LeaveTypeCollection中。
//ClearCollect相当于Clear 和 Collect 两个命令的组合,也就是先把集合里的数据清除“Clear”,然后再添加”Collect”新的数据。
//语法 :ClearCollect(集合名,条目,...)
LeaveTypeCollection, //ClearCollect函数的第一个参数,集合名LeaveTypeCollection
{ type:"Vacation", icon:vacation, description:"说明什么是Vacation." },
{ type:"Sick Leave", icon:'sick-leave', description:"说明什么是Sick-leave "},
{ type:"Floating Holiday", icon: 'floating-holiday', description:"说明什么是Floating Holiday." },
{ type:"Jury Duty", icon: 'jury-duty', description:"说明什么是Jury Duty." },
{ type:"Bereavement", icon: bereavement, description:"说明什么是Bereavement." } //ClearCollect的第2、3、4、5、6个参数,也就是集合里的五个假期类型的数据(包括假期类型名,对应的图标和假期类型的说明)。同时,如要对假期类型进行自定义,也可以在这里增删或修改。
), //Concurrent的第一个函数 --- ClearCollect()
Set(_myProfile,Office365Users.MyProfile()); // 这里利用Set函数 将用户的Profile 赋予全局变量 "_myProfile"。
//Concurrent的第二个函数 --- Set(), 注意:这里是以 分号 结尾,表示这个Set 函数会和下面的两个Set 函数以及一个 IF 函数组合在一起,作为一个函数集合做Concurrent的第二个"函数"。
Set(_defaultApprover,Office365Users.Manager(_myProfile.Id)); //把用户的经理作为审批人赋值给变量 _defaultApprover
Set(_defaultApproverPhoto, If(Office365Users.UserPhotoMetadata(_defaultApprover.Id).HasPhoto, Office365Users.UserPhoto(_defaultApprover.Id))); //设置审批人的头像。 其中的If语句只设置了条件为真的操作,没有设置条件为假的操作。
If(
IsBlank( //通过 IsBlank() 函数的结果来作为If语句的判断条件, 下面的LookUp函数的输出就是IsBlank的参数。
LookUp(Balance, Year = Text(Year(Now())) && EmployeeEmail = _myProfile.UserPrincipalName)), //通过LookUp()函数,查询Balance表,看用户今年在表里有没有年假可用天数。
//如果没有,IsBlank就为假,反之If语句的值为真,就会继续执行下面的Patch命令来为用户添加今年的默认的假期天数已经相关的信息。
//另外,这里链接了一个数据源,名为Balance, 它是存储在OneDrive 里一个Excel文件里的表格。默认的,通过模板创建了这个App后,会在下面的路径下生成一个data.xlsx文件, 里面包含Leave,Holidays, Balance 三个表格。
Patch(Balance, Defaults(Balance), // 当上面的 If 语句返回为 真 时,通过 Patch 命令向Balance表的各个字段(如下面的截图)添加数据
{
EmployeeEmail: _myProfile.UserPrincipalName,
EmployeeName: _myProfile.DisplayName,
Year: Text(Year(Now())),
Vacation:10, //这里可以自定义各种假期默认的天数
VacationUsed:0,
Sick:8,
SickUsed:0,
Floating:8,
FloatingUsed:0,
JuryDuty:3,
JuryDutyUsed:0,
Bereavement:5,
BereavementUsed:0,
BalanceID:_myProfile.UserPrincipalName&Text(Now(), "[$-en-US]mm-dd-yyyy-hh-mm-ss-fff")
}
) // Patch 函数结束
), //IF语句结束, 同时,也结束了Concurrent 函数的第二个“函数” (上面提到过,其实这第二个是四条函数组合而成的一个函数组合)
ClearCollect(EmailTemplate, //和上面一样,这里又用到了ClearCollect函数,目的是:设置用来发送请假申请通知的电子邮件模板。
{Row: 1, Value:
"
There is a leave request from: {SubmitterName} pending your approval.
{Row: 2, Value:
"
Your leave request from {LeaveStart} to {LeaveEnd} has been {LeaveStatus}" & "
//由此总体来看,这个Onstart属性是利用Concurrent 函数做了三件事:
//第一,利用ClearCollect 设置假期类型的说明。
//第二,利用几个Set 函数设置了全局变量,以及利用Patch 函数向Excel 文件里写入变量值
//第三,利用ClearCollect 设置了一个电子邮件模板, 当用户提交请假申请后,他的主管就会收到一封提示邮件,样式如下。
------------------------ 本节结束,下一节继续-- --------------------------