有关画布应用的会议屏幕模板的参考信息

对于 Power Apps 中的画布应用,了解会议屏幕模板中的每个重要控件对屏幕的整体默认功能有何作用。 这篇深入研究文章介绍行为公式以及确定控件如何响应用户输入的其他属性的值。 有关此屏幕默认功能的高深讨论,请参阅会议屏幕概述

本主题重点介绍一些重要的控件,并说明这些控件的各种属性(如 ItemsOnSelect)所设置的表达式或公式:

先决条件

熟悉在 Power Apps 中创建应用时如何添加和配置屏幕及其他控件。

Invite tab

LblInviteTab 控件。

  • 属性:Color
    值: If( _showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails 是用于确定选择了 LblInviteTab 控件还是 LblScheduleTab 控件的变量。 如果 _showDetails 的值是 true,表明选择了 LblScheduleTab;如果值为 false,表明选择了 LblInviteTab。 这意味着,如果 _showDetails 的值为 true选择此选项卡),选项卡颜色与 LblRecipientCount 的一致。 否则,它与 RectQuickActionBar 的填充值一致。

  • 属性:OnSelect
    值: Set( _showDetails, false )

    _showDetails 变量设置为 false,这意味着 Invite tab 的内容可见,Schedule tab 的内容隐藏。

“计划”选项卡

“计划”选项卡。

  • 属性:Color
    值: If( !_showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails 是用于确定选择了 LblInviteTab 控件还是 LblScheduleTab 控件的变量。 如果为 true,表明选择了 LblScheduleTab;如果为 false,则选择了 LblInviteTab。 这意味着,如果 _showDetails 为 true(选择此选项卡),选项卡颜色与 RectQuickActionBar 的填充值一致。 否则,它与 LblRecipientCount 的颜色值一致。

  • 属性:OnSelect
    值: Set( _showDetails, true )

    _showDetails 变量设置为 true,这意味着 Schedule tab 的内容可见,Invite tab 的内容隐藏。

TextSearchBox 控件。

屏幕中的其他几个控件与此控件有依赖关系:

  • 如果用户开始键入文本,PeopleBrowseGallery 变为可见。
  • 如果用户键入有效的电子邮件地址,AddIcon 变为可见。
  • 当用户在 PeopleBrowseGallery 中选择人员时,搜索内容将被重置。

Add icon

AddIcon 控件。

此控件允许用户将组织中不存在的人员添加到正在组织的会议的参与者列表中。

  • 属性:Visible
    值:为了使控件可见,必须全部计算为 true 的三个逻辑检查:

    !IsBlank( TextSearchBox.Text ) &&
        IsMatch( TextSearchBox.Text, Match.Email ) &&
        Not( Trim( TextSearchBox.Text ) in MyPeople.UserPrincipalName )
    

    此代码块以逐行形式显示只有在以下情况下 AddIcon 控件才可见:

    • TextSearchBox 包含文本。
    • TextSearchBox 中的文本是有效的电子邮件地址。
    • TextSearchBox 中的文本在 MyPeople 集合中尚不存在。
  • 属性:OnSelect
    值:一个将用户添加到参与者列表的 Collect 语句,一个刷新可用会议时间的语句,以及几个变量切换:

    Collect( MyPeople,
        { 
            DisplayName: TextSearchBox.Text, 
            UserPrincipalName: TextSearchBox.Text, 
            Mail: TextSearchBox.Text
        }
    );
    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    { 
                        RequiredAttendees: Concat(MyPeople, UserPrincipalName & ";")
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ),
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage:1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    选择此控件会将有效的电子邮件地址(仅当在 TextSearchBox 中输入有效的电子邮件地址时可见)添加到 MyPeople 集合(此集合为参与者列表)中,然后根据新用户条目刷新可用会议时间。

    在较低级别,此代码块:

    1. 将电子邮件地址收集到 MyPeople 集合中,将电子邮件地址收集到 DisplayNameUserPrincipalNameMail 字段中。
    2. 重置 TextSearchBox 控件的内容。
    3. _showMeetingTimes 变量设置为 false。 此变量控制 FindMeetingTimesGallery 的可见性,其显示所选参与者可以开会的空闲时间。
    4. _loadMeetingTimes 上下文变量设置为 true。 此变量设置加载状态,这可以切换诸如 _LblTimesEmptyState 等加载状态控件的可见性,来向用户指示其数据正在加载。
    5. _selectedMeetingTime 设置为 Blank()_selectedMeetingTime 是在 FindMeetingTimesGallery 控件中选择的记录。 它在此处将被清空,因为添加另一个参与者可能意味着之前的 _selectedMeetingTime 定义对该参与者不可用。
    6. _selectedRoom 设置为 Blank()_selectedRoom 是在 RoomBrowseGallery 中的选择的会议室记录。 会议室可用性由 _selectedMeetingTime 的值确定。 将该值清空后,_selectedRoom 值不再有效,因此必须清空。
    7. _roomListSelected 设置为 false。 此行可能并不适用于所有人。 在 Office 中,您可以按不同的“会议室列表”对会议室进行分组。 如果您有会议室列表,此屏幕会加以说明,从而允许您先选择一个会议室列表,然后再从该列表中选择会议室。 _roomListSelected 的值确定用户(仅在具有会议室列表的租户中)将查看一个会议室列表还是一组会议室列表中的会议室。 设置为 false 将强制用户重新选择新会议室列表。
    8. 使用 Office365.FindMeetingTimes 操作可以确定和收集参与者的可用会议时间。 此操作传递:
      • 将每个所选用户的 UserPrincipalName 传递到 RequiredAttendees 参数。
      • MeetingDurationSelect.Selected.Minutes 传递到 MeetingDuration 参数。
      • 将“MeetingDateSelect.SelectedDate + 8 hours”传递到 Start 参数。 加上八小时是因为默认情况下,日历控件的完整日期/时间是所选日期的 12:00 AM。 您可能希望在正常工作时间内检索可用性。 正常的工作开始时间为 8:00 AM。
      • MeetingDateSelect.SelectedDate + 17 hours 传递到 End 参数。 加上 17 小时是因为 12:00 AM + 17 = 5:00 PM。 正常的工作结束时间为 5:00 PM。
      • 15 传递到 MaxCandidates 参数。 这意味着此操作仅返回所选日期的前 15 个可用时间。 这样做是因为在一个 8 小时的工作日中只有 16 个 30 分钟的块,一个 30 分钟的会议是在此屏幕中可以设置的最小块。
      • 1 传递到 MinimumAttendeePercentage 参数。 基本上,除非没有参与者可用,否则都会检索会议时间。
      • false 传递到 IsOrganizerOptional 参数。 该应用用户不是此会议的可选参与者。
      • 将 "Work" 传递到 ActivityDomain 参数。 这意味着检索到的时间只有正常工作时间段内的时间。
    9. ClearCollect 函数还会添加两列:“StartTime”和“EndTime”。 这将简化返回的数据。 包含可用开始时间和结束时间的字段是 MeetingTimeSlot 字段。 此字段是包含“开始”和“结束”记录的记录,这些记录本身包含各自建议的 DateTimeTimeZone 值。 不尝试检索记录的嵌套,而是将“StartTime”和“EndTime”列添加到 MeetingTimes 集合中,将那些 Start > DateTimeEnd > DateTime 值添加到集合的表面。
    10. 这些函数全部完成后,_loadingMeetingTimes 变量将设置为 false,删除加载状态,_showMeetingTimes 将设置为 true,显示 FindMeetingTimesGallery

PeopleBrowseGallery 控件。

  • 属性:Items
    值:
    If( !IsBlank( Trim( TextSearchBox.Text ) ), 
        'Office365Users'.SearchUser( { searchTerm: Trim(TextSearchBox.Text), top: 15 } )
    )
    

此库的项由 Office365.SearchUser 操作的搜索结果填充。 此操作将 Trim(**TextSearchBox**) 中的文本作为搜索词,并根据该搜索返回前 15 个结果。

TextSearchBox 被包装在 Trim 函数中,因为用户对空格的搜索无效。 Office365Users.SearchUser 操作包装在 If(!IsBlank(Trim(TextSearchBox.Text)) ... ) 函数中,因为在用户搜索之前检索搜索结果是对性能的浪费。

PeopleBrowseGallery 标题控件。

  • 属性:Text
    值: ThisItem.DisplayName

    显示人员在 Office 365 个人资料中的显示名称。

  • 属性:OnSelect
    值:一个将用户添加到参与者列表的 Collect 语句,一个刷新可用会议时间的语句,以及几个变量切换:

    Concurrent(
        Reset( TextSearchBox ),
        Set( _selectedUser, ThisItem ),
        If( Not( ThisItem.UserPrincipalName in MyPeople.UserPrincipalName ), 
            Collect( MyPeople, ThisItem ); 
            Concurrent(
                Set( _showMeetingTimes, false ),
                UpdateContext( { _loadMeetingTimes: true } ),
                Set( _selectedMeetingTime, Blank() ),
                Set( _selectedRoom, Blank() ),
                Set( _roomListSelected, false ),
                ClearCollect( MeetingTimes, 
                    AddColumns(
                        'Office365'.FindMeetingTimes(
                            {
                                RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ),
                                MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                                Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ),
                                End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                                MaxCandidates: 15, 
                                MinimumAttendeePercentage: 1, 
                                IsOrganizerOptional: false, 
                                ActivityDomain: "Work"
                            }
                        ).MeetingTimeSuggestions,
                        "StartTime", MeetingTimeSlot.Start.DateTime, 
                        "EndTime", MeetingTimeSlot.End.DateTime
                    )
                )
            );
            UpdateContext( { _loadingMeetingTimes: false } );
            Set( _showMeetingTimes, true )
        )
    )
    

    在较高级别上,选择此控件会将人员添加到 MyPeople 集合(应用中参与者列表的存储)中,并基于新添加的用户刷新可用会议时间。

    选择此控件与选择 AddIcon 控件非常相似;唯一的区别是 Set(_selectedUser, ThisItem) 语句和操作的执行顺序。 同样,此处的讨论不会太深入。 有关更完整的说明,请通读 AddIcon 控件一节。

    选择此控件将重置 TextSearchBox。 然后,如果所作选择不在 MyPeople 集合中,控件将:

    1. _loadMeetingTimes 状态设置为 true,将 _showMeetingTimes 状态设置为 false,清空 _selectedMeetingTime_selectedRoom 变量,并根据 MyPeople 集合的新增项刷新 MeetingTimes 集合。
    2. _loadMeetingTimes 状态设置为 false,将 _showMeetingTimes 设置为 true。 如果所作选择已经在 MyPeople 集合中,将仅重置 TextSearchBox 的内容。

MeetingPeopleGallery 控件。

  • 属性:Items
    值: MyPeople

    MyPeople 集合是通过选择 PeopleBrowseGallery Title 控件初始化或添加的人员的集合。

  • 属性:Height
    值:允许库增加到最大高度 350 的逻辑:

    Min( 
        76 * RoundUp( CountRows( MeetingPeopleGallery.AllItems ) / 2, 0 ),
        350
    )
    

    此库的高度根据库中项的数量进行调整,最大高度为 350。 此公式将 76 作为 MeetingPeopleGallery 单个行的总高度,然后将其乘以行数。 WrapCount 属性设置为 2,因此实际行数为 RoundUp(CountRows(MeetingPeopleGallery.AllItems) / 2, 0)

  • 属性:ShowScrollbar
    值: MeetingPeopleGallery.Height >= 350

    当达到库的最大高度 (350) 时,滚动条可见。

MeetingPeopleGallery Title 控件。

  • 属性:OnSelect

    值: Set(_selectedUser, ThisItem)

    _selectedUser 变量设置为 MeetingPeopleGallery 中选择的项。

MeetingPeopleGallery iconRemove 控件。

  • 属性:OnSelect
    值:一个将用户从参与者列表中删除的 Remove 语句,一个刷新可用会议时间的 Collect 语句,以及几个变量切换:

    Remove( MyPeople, LookUp( MyPeople, UserPrincipalName = ThisItem.UserPrincipalName ) );
    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    {
                        RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ), 
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ), 
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage: 1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    在较高级别上,选择此控件会将该人员从参与者列表中删除,并基于对该人员的删除刷新可用会议时间。

    在前面代码的第一行之后,选择此控件几乎与选择 AddIcon 控件相同。 同样,此处的讨论不会太深入。 有关更完整的说明,请通读“AddIcon 控件”一节

    在代码的第一行中,所选项将从 MyPeople 集合中删除。 然后,代码:

    1. 重置 TextSearchBox,然后从 MyPeople 集合中删除所作选择。
    2. _loadMeetingTimes 状态设置为 true,将 _showMeetingTimes 状态设置为 false,清空 _selectedMeetingTime_selectedRoom 变量,并根据 MyPeople 集合的新增项刷新 MeetingTimes 集合。
    3. _loadMeetingTimes 状态设置为 false,将 _showMeetingTimes 设置为 true

Meeting date picker

MeetingDateSelect 控件。

  • 属性:DisplayMode
    值: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    至少有一个参与者被添加到 MyPeople 集合之后,才能选择会议的日期。

  • 属性:OnChange
    值: Select( MeetingDateSelect )

    更改所选日期会触发此控件的 OnSelect 属性中的代码运行。

  • 属性:OnSelect
    值:一个刷新可用会议时间的 Collect 语句,以及几个变量切换:

    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadingMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    {
                        RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ), 
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ), 
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage: 1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    在较高级别上,选择此控件将刷新可用会议时间。 这很有价值,因为如果用户更改日期,则需要更新可用会议时间以反映参与者当天的可用性。

    除了初始 Collect 语句外,这与 AddIcon 控件的 OnSelect 功能相同。 同样,此处的讨论不会太深入。 有关更完整的说明,请通读 AddIcon 控件一节。

    选择此控件将重置 TextSearchBox。 然后它:

    1. _loadMeetingTimes 状态设置为 true,将 _showMeetingTimes 状态设置为 false,清空 _selectedMeetingTime_selectedRoom 变量,并根据新选择刷新 MeetingTimes 集合。
    2. _loadMeetingTimes 状态设置为 false,将 _showMeetingTimes 设置为 true

Meeting duration drop-down

MeetingDateSelect 控件 - 持续时间。

  • 属性:DisplayMode
    值: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    至少有一个参与者被添加到 MyPeople 集合之后,才能选择会议的持续时间。

  • 属性:OnChange
    值: Select(MeetingDateSelect1)

    更改所选持续时间会触发 MeetingDateSelect 控件 OnSelect 属性中的代码运行。

FindMeetingTimesGallery 控件。

  • 属性:Items
    值: MeetingTimes

    Office365.FindMeetingTimes 操作检索到的潜在会议时间的集合。

  • 属性:Visible
    值: _showMeetingTimes && _showDetails && !IsEmpty( MyPeople )

    仅当将 _showMeetingTimes 设置为 true,用户选择了 LblScheduleTab 控件,并且会议至少添加了一个参与者时,库才可见。

FindMeetingTimesGallery Title 控件。

  • 属性:Text
    值:将以用户本地时间显示的开始时间的转换:

    Text(
        DateAdd(
            DateTimeValue( ThisItem.StartTime ),
            - TimeZoneOffset(), 
            Minutes
        ),
        DateTimeFormat.ShortTime
    )
    

    检索到的 StartTime 值为 UTC 格式。 为从 UTC 转换为本地时间,将应用 DateAdd 函数。 Text 函数将日期/时间作为其第一个参数,并基于其第二个参数设置此参数的格式。 您将它传递给 ThisItem.StartTime 的本地时间转换,将其显示为 DateTimeFormat.ShortTime

  • 属性:OnSelect
    值:用于收集会议室及其建议的可用性的几个 Collect 语句,以及几个变量切换:

    Set( _selectedMeetingTime, ThisItem );
    UpdateContext( { _loadingRooms: true } );
    If( IsEmpty( RoomsLists ),
        ClearCollect( RoomsLists, 'Office365'.GetRoomLists().value) );
    If( CountRows( RoomsLists ) <= 1,
        Set( _noRoomLists, true );
        ClearCollect( AllRooms, 'Office365'.GetRooms().value );
        Set( _allRoomsConcat, Concat( FirstN( AllRooms, 20 ), Address & ";" ) );
        ClearCollect( RoomTimeSuggestions, 
            'Office365'.FindMeetingTimes(
                {
                    RequiredAttendees: _allRoomsConcat, 
                    MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                    Start: _selectedMeetingTime.StartTime & "Z", 
                    End: _selectedMeetingTime.EndTime & "Z", 
                    MinimumAttendeePercentage: "1",
                    IsOrganizerOptional: "false", 
                    ActivityDomain: "Unrestricted"
                }
            ).MeetingTimeSuggestions
        );
        ClearCollect( AvailableRooms, 
            AddColumns(
                AddColumns(
                    Filter( 
                        First( RoomTimeSuggestions ).AttendeeAvailability,
                        Availability="Free"
                    ), 
                    "Address", Attendee.EmailAddress.Address
                ), 
                "Name", LookUp( AllRooms, Address = Attendee.EmailAddress.Address ).Name 
            )
        );
        ClearCollect( AvailableRoomsOptimal, 
            DropColumns(
                DropColumns( AvailableRooms, "Availability" ), 
                "Attendee" 
            )
        ),
        Set( _roomListSelected, false) 
    );
    UpdateContext( {_loadingRooms: false} )
    

    在较高级别,此代码块基于会议的选定日期/时间为没有会议室列表的用户收集可用会议室。 否则,它只是检索会议室列表。

    在较低级别,此代码块:

    1. _selectedMeetingTime 设置为所选项。 这用于查找在这段时间内可用的会议室。
    2. 将加载状态变量 _loadingRooms 设置为 true,打开加载状态。
    3. 如果 RoomsLists 集合为空,它将检索用户租户的会议室列表,并将它们存储在 RoomsLists 集合中。
    4. 如果用户没有会议室列表或有一个会议室列表:
      1. noRoomLists 变量设置为 true,此变量用于确定 RoomBrowseGallery 控件中显示的项。
      2. Office365.GetRooms() 操作用于检索其租户中的前 100 个会议室。 这些内容存储在 AllRooms 集合中。
      3. _allRoomsConcat 变量设置为 AllRooms 集合中会议室前 20 个电子邮件地址的分号分隔的字符串。 这是因为 Office365.FindMeetingTimes 仅限于在单个操作中搜索 20 个人员对象的可用时间。
      4. RoomTimeSuggestions 集合使用 Office365.FindMeetingTimes 检索 AllRooms 集合中前 20 个会议室的可用性,检索基于 _selectedMeetingTime 变量中的时间值。 请注意,& "Z" 用于正确设置 DateTime 值的格式。
      5. 将创建 AvailableRooms 集合。 这只是参与者可用性的 RoomTimeSuggestions 集合,其中添加了两个额外列:“Address”和“Name”。 “Address”是会议室的电子邮件地址,“Name”是会议室的名称。
      6. 然后,将创建 AvailableRoomsOptimal 集合。 这只是 AvailableRooms 集合,其中删除了“Availability”和“Attendee”列。 这样做与 AvailableRoomsOptimalAllRooms 的架构相匹配。 这使您可以在 RoomBrowseGalleryItems 属性中使用这两个集合。
      7. _roomListSelected 将设置为 false
    5. 一旦其他所有内容执行完毕,加载状态 _loadingRooms 将设置为 false

RoomBrowseGallery 控件。

  • 属性:Items
    值:逻辑上设置为两个具有相同架构的内部集合,具体取决于用户是选择会议室列表还是在租户中包含会议室列表:

    Search(
        If( _roomListSelected || _noRoomLists, AvailableRoomsOptimal, RoomsLists ),
        Trim(TextMeetingLocation1.Text), 
        "Name", 
        "Address"
    )
    

    如果 _roomListSelected_noRoomListstrue,此库将显示 AvailableRoomsOptimal 集合。 否则,它将显示 RoomsLists 集合。 之所以可以这样做是因为这些集合的架构是相同的。

  • 属性:Visible
    值: _showDetails && !IsBlank( _selectedMeetingTime ) && !_loadingRooms

    仅当前面三个语句计算为 true 时,此库才可见。

RoomBrowseGallery Title

RoomBrowseGallery Title 控件。

  • 属性:OnSelect
    值:一组逻辑绑定的 CollectSet 语句,可能触发也可能不触发,具体取决于用户查看会议室列表还是会议室:

    UpdateContext( { _loadingRooms: true } );
    If( !_roomListSelected && !noRoomLists,
        Set( _roomListSelected, true );
        Set( _selectedRoomList, ThisItem.Name );
        ClearCollect( AllRooms, 'Office365'.GetRoomsInRoomList( ThisItem.Address ).value );
        Set( _allRoomsConcat, Concat( FirstN( AllRooms, 20 ), Address & ";" ) );
        ClearCollect( RoomTimeSuggestions, 
            'Office365'.FindMeetingTimes(
                {
                    RequiredAttendees: _allRoomsConcat, 
                    MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: _selectedMeetingTime.StartTime & "Z", 
                    End: _selectedMeetingTime.EndTime & "Z", 
                    MinimumAttendeePercentage: "1",
                    IsOrganizerOptional: "false", 
                    ActivityDomain: "Unrestricted"
                }
            ).MeetingTimeSuggestions
        );
        ClearCollect( AvailableRooms, 
            AddColumns(
                AddColumns(
                    Filter(
                        First( RoomTimeSuggestions ).AttendeeAvailability, 
                        Availability = "Free"
                    ),
                    "Address", Attendee.EmailAddress.Address 
                ), 
                "Name", LookUp( AllRooms, Address = Attendee.EmailAddress.Address ).Name
            )
        );
        ClearCollect( AvailableRoomsOptimal, 
            DropColumns(
                DropColumns( AvailableRooms, "Availability" )
            ), 
            "Attendee" )
        ),
        Set( _selectedRoom, ThisItem )
    );
    UpdateContext( {_loadingRooms: false} )
    

    选择此控件时发生的操作取决于用户当前正在查看一组会议室列表还是一组会议室。 如果是前者,选择此控件将从选定会议室列表中检索在选定时间可用的会议室。 如果是后者,选择此控件会将 _selectedRoom 变量设置为所选项。 前面的语句与 FindMeetingTimesGallery TitleSelect 语句非常相似。

    在较低级别,前面的代码块:

    1. 通过将 _loadingRooms 设置为 true,打开会议室的加载状态。
    2. 查看是否已选择会议室列表,以及租户是否有会议室列表。 如果已完成这两项:
      1. _roomListSelected 设置为 true,将 _selectedRoomList 设置为所选项。
      2. _allRoomsConcat 变量设置为 AllRooms 集合中会议室前 20 个电子邮件地址的分号分隔的字符串。 这是因为 Office365.FindMeetingTimes 操作仅限于在单个操作中搜索 20 个人员对象的可用时间。
      3. RoomTimeSuggestions 集合使用 Office365.FindMeetingTimes 操作检索 AllRooms 集合中前 20 个会议室的可用性,检索基于 _selectedMeetingTime 变量中的时间值。 请注意,& "Z" 用于正确设置 DateTime 值的格式。
      4. 将创建 AvailableRooms 集合。 这只是参与者可用性的 RoomTimeSuggestions 集合,其中添加了两个额外列:“Address”和“Name”。 “Address”是会议室的电子邮件地址,“Name”是会议室的名称。
      5. 然后,将创建 AvailableRoomsOptimal 集合。 这只是 AvailableRooms 集合,其中删除了“Availability”和“Attendee”列。 这样做与 AvailableRoomsOptimalAllRooms 的架构相匹配。 这使您可以在 RoomBrowseGalleryItems 属性中使用这两个集合。
      6. _roomListSelected 将设置为 false
    3. 一旦其他所有内容执行完毕,加载状态 _loadingRooms 将设置为 false

Back chevron

RoomsBackNav 控件。

  • 属性:Visible
    值: _roomListSelected && _showDetails

    仅当同时选择了会议室列表和日程安排选项卡时,此控件才可见。

  • 属性:OnSelect
    值: Set( _roomListSelected, false )

    _roomListSelected 设置为 false 时,它将 RoomBrowseGallery 控件更改为显示 RoomsLists 集合中的项。

Send icon

IconSendItem 控件。

  • 属性:DisplayMode
    值:强制用户在图标变为可编辑状态之前输入某些会议详细信息的逻辑。

    If( Len( Trim( TextMeetingSubject1.Text ) ) > 0
        && !IsEmpty( MyPeople ) && !IsBlank( _selectedMeetingTime ),
        DisplayMode.Edit, DisplayMode.Disabled
    )
    

    仅当填写了会议主题,至少有一个参与者参加会议并且选择了会议时间时,图标才变为可选择状态。 否则,处于禁用状态。

  • 属性:OnSelect

    值:用于将会议邀请发送给您选择的参与者并清除所有输入字段的代码:

    Set( _myCalendarName, LookUp( 'Office365'.CalendarGetTables().value, DisplayName = "Calendar" ).Name );
    Set( _myScheduledMeeting, 
        'Office365'.V2CalendarPostItem( _myCalendarName,
            TextMeetingSubject1.Text, 
            Text(DateAdd(DateTimeValue( _selectedMeetingTime.StartTime), -TimeZoneOffset(), Minutes) ),
            Text(DateAdd(DateTimeValue( _selectedMeetingTime.EndTime), -TimeZoneOffset(), Minutes) ),
            {
                RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ) & _selectedRoom.Address, 
                Body: TextMeetingMessage1.Text, 
                Location: _selectedRoom.Name, 
                Importance: "Normal", 
                ShowAs: "Busy", 
                ResponseRequested: true
            }
        )
    );
    Concurrent(
        Reset( TextMeetingLocation1 ),
        Reset( TextMeetingSubject1 ),
        Reset( TextMeetingMessage1 ),
        Clear( MyPeople ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoomList, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false )
    )
    

    在较低级别,此代码块:

    1. _myCalendarName 设置为 Office365.CalendarGetTables() 操作中的日历,其中的 DisplayName 为“Calendar”。
    2. 使用 Office365.V2CalendarPostItem 操作使用用户在整个屏幕上进行的各种选择的所有输入值安排会议。
    3. 重置在创建会议中使用的所有输入字段和变量。

备注

根据您所在的地区,所需的日历可能没有显示名称“Calendar”。 转到 Outlook 查看日历的标题,并在应用中进行适当的更改。

后续步骤

备注

您能告诉我们您的文档语言首选项吗? 进行简短调查。(请注意,此调查是英文版调查)

此调查大约需要七分钟。 不会收集个人数据(隐私声明)。