Udostępnij za pośrednictwem


Informacje dot. szablonu ekranu spotkań dla aplikacji kanwy

W rozwiązaniu z aplikacjami kanwy w Power Apps można ustalić, jak każda znacząca kontrolka w szablonie ekranu spotkań przyczynia się do ogólnego funkcjonowania ekranu. Ten dogłębny artykuł prezentuje formuły zachowania i wartości innych właściwości określających sposób reakcji formantów na dane wprowadzone przez użytkownika. Aby zapoznać się z ogólną funkcjonalnością tego ekranu na najwyższym poziomie, zobacz Omówienie ekranu spotkań.

W tym temat wyróżniono niektóre istotne elementy sterujące i wyjaśniono wyrażenia lub formuły, w których są ustawione różne właściwości (np. Elementy i OnSelect) tych formantów:

Warunek wstępny

Znajomość sposobu dodawania i konfigurowania ekranów oraz innych elementów sterujących podczas tworzenia aplikacji w programie Power Apps.

Karta zaproszenie

Kontrolka LblInviteTab.

  • Właściwość: Kolor
    Wartość: If( _showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails to zmienna używana w celu określenia, czy jest wybrana kontrolka LblInviteTab lub kontrolka LblScheduleTab. Jeśli wartość _showDetails jest równa prawda, wybierana jest LblScheduleTab; jeśli ta wartość wynosi fałsz, wybrana jest opcja LblInviteTab. Oznacza to, że jeśli wartość _showDetails jest równa prawda (ta karta nie jest zaznaczona), kolor karty jest taki sam, jak w LblRecipientCount. W przeciwnym razie jest on zgodny z wartością wypełnienia w RectQuickActionBar.

  • Właściwość: OnSelect
    Wartość: Set( _showDetails, false )

    Ustawia zmienną _showDetails jako fałsz, co oznacza, że widoczna jest treść karty Zaproszenie, a zawartość karty Harmonogram jest ukryta.

Karta Harmonogram

Karta Harmonogram.

  • Właściwość: Kolor
    Wartość: If( !_showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails to zmienna używana w celu określenia, czy jest wybrana kontrolka LblInviteTab lub kontrolka LblScheduleTab. Jeśli jest to prawda, wybierany jest LblScheduleTab; w przypadku wartości fałszywej, wybeirany jest LblInviteTab. Oznacza to, że jeśli wartość _showDetails jest równa prawda (ta karta jest zaznaczona), kolor karty jest taki sam jak wartość wypełnienia RectQuickActionBar. W przeciwnym razie kolor jest zgodny z wartością LblRecipientCount.

  • Właściwość: OnSelect
    Wartość: Set( _showDetails, true )

    Ustawia zmienną _showDetails jako prawda, co oznacza, że widoczna jest treść karty Harmonogram, a zawartość karty Zaproszenie jest ukryta.

Pole wyszukiwania tekstu

Formant TextSearchBox.

Kilka innych kontrolek na ekranie ma zależność od tego:

  • Jeśli użytkownik zacznie wpisywać tekst, zostanie wyświetlona PeopleBrowseGallery.
  • Jeśli użytkownik wpisze prawidłowy adres e-mail, zostanie wyświetlona AddIcon.
  • Po wybraniu przez użytkownika osoby w PeopleBrowseGallery zawartość wyszukiwania zostaje zresetowana.

Ikona dodawania

Kontrolka AddIcon.

Kontrolka ta pozwala użytkownikom dodawać osoby, które nie istnieją w organizacji, do listy uczestników spotkania, która ma zostać stworzona.

  • Właściwość: Widoczne
    Wartość: trzy kontrolki logiczne, które wszystkie muszą być oszacowane jako prawda, aby kontrola była widoczna:

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

    Wiersz po wierszu, ten blok kodu informuje, że kontrolka AddIcon jest widoczna tylko wtedy, gdy:

    • TextSearchBox zawiera tekst.
    • Tekst w TextSearchBox jest prawidłowym adresem e-mail.
    • Tekst w TextSearchBox nie istnieje już w kolekcji MyPeople.
  • Właściwość: OnSelect
    Wartość: instrukcja Collect, która powoduje dodanie użytkownika do listy uczestników, może również odświeżyć dostępne czasy spotkań i przełączać różne zmienne:

    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 )
    

    Wybranie tej kontrolki powoduje dodanie prawidłowego adresu e-mail (można go wyświetlić tylko wtedy, gdy w TextSearchBox jest wpisany prawidłowy adres e-mail) do kolekcji MyPeople (kolekcja jest listą uczestników), a następnie odświeża dostępne godziny spotkania i nowy wpis użytkownika.

    Na niskim poziomie ten blok kodu:

    1. Program gromadzi adresy e-mail w kolekcji MyPeople i gromadzi je w polach DisplayName, UserPrincipalName i Mail.
    2. Resetuje zawartości kontrolki TextSearchBox.
    3. Ustawia zmienną _showMeetingTimes jako fałsz. Ta zmienna steruje widocznością FindMeetingTimesGallery, która zawiera wolne godziny zaznaczonych uczestników na spotkania.
    4. Ustawia zmienną kontekstu _loadMeetingTimes jako prawda. Ta zmienna określa stan ładowania, który powoduje przełączenie widoczności kontrolek stanu ładowania, takich jak _LblTimesEmptyState, aby wskazać użytkownikowi, że ładowane są jego dane.
    5. Ustawia wartość _selectedMeetingTime na Pusty(). _selectedMeetingTime jest zaznaczonym rekordem z kontrolki FindMeetingTimesGallery. To pole jest puste, ponieważ dodanie innego uczestnika może oznaczać, że poprzednia definicja _selectedMeetingTime nie jest dostępna dla tego uczestnika.
    6. Ustawia wartość _selectedRoom na Pusty(). _selectedRoom jest wybranym rekordem pomieszczenia z poziomu RoomBrowseGallery. Dostępność pomieszczenia jest określana na podstawie wartości _selectedMeetingTime. Po wypełnieniu tej wartości wartość _selectedRoom nie jest już prawidłowa, w związku z czym pole musi być puste.
    7. Ustawia wartość _roomListSelected na fałsz. Ta pozycja może nie dotyczyć wszystkich użytkowników. W pakiecie Office możesz grupować pomieszczenia według różnych „list pomieszczeń”. Jeśli są używane listy pomieszczeń, ten ekran to uwzględnia, umożliwiając najpierw wybranie listy pokoi przed wybraniem pokoju z tej listy. Wartość _roomListSelected decyduje o tym, czy użytkownik (w dzierżawie tylko z listą pokojów) będzie wyświetlać pomieszczenia na liście pomieszczeń lub w zestawie list pomieszczeń. Właściwość jest ustawiona na fałsz, aby zmusić użytkowników do ponownego wybierania nowej listy pomieszczeń.
    8. Program używa operacji Office365.FindMeetingTimes w celu określenia i zebrania dostępnych terminów spotkań dla uczestników. Ta operacja przebiega w następujący sposób:
      • Element userPrincipalName każdego zaznaczonego użytkownika w parametrze RequiredAttendees.
      • MeetingDurationSelect.Selected.Minutes na parametr MeetingDuration.
      • MeetingDateSelect. SelectedDate + 8 godzin w parametrze Start. Dodanie ośmiu godzin jest przypuszczane, ponieważ pełna Data/Godzina dla kontrolki Kalendarz wynosi domyślnie 12:00 i jest zaznaczona Data. W normalnych godzinach pracy warto zapewneć pobieranie dostępności. Normalną godziną rozpoczęcia pracy może być 8:00 AM.
      • MeetingDateSelect.SelectedDate + 17 godzin w parametrze Koniec. Dodano 17 godzin, ponieważ 12:00 AM + 17 = 5:00 PM. Normalną godziną zakończenia pracy może być 5:00 PM.
      • 15 w parametrze MaxCandidates. Oznacza to, że operacja zwraca tylko 15 godzin pierwszych dostępności za wybraną datę. Ma to sens, ponieważ w 8-godzinnym dniu pracy jest tylko szesnaście 30-minutowych kawałków, a 30-minutowe spotkanie to minimum, które można ustawić na tym ekranie.
      • 1 do parametru MinimumAttendeePercentage. W zasadzie czas spotkania jest pobierany głównie wtedy, gdy żaden z uczestników nie jest dostępny.
      • fałsz w parametrze IsOrganizerOptional. Użytkownik aplikacji nie jest opcjonalnym uczestnikiem tego spotkania.
      • „Praca” z parametrem ActivityDomain. Oznacza to, że czasy pobrano tylko w zwykłym okresie roboczym.
    9. Funkcja ClearCollect dodaje również dwie kolumny: "StartTime" i "EndTime". Upraszcza to zwracane dane. Pole zawierające dostępną godzinę rozpoczęcia i zakończenia to pole MeetingTimeSlot. To pole jest rekordem zawierającym rekordy początkowe i końcowe, które same zawierają wartości typu DateTime i TimeZone w odpowiednich sugestiach. Zamiast próby pobrania tego zagnieżdżenia rekordów dodanie kolumn „StartTime” i „EndTime” do kolekcji MeetingTimes powoduje, że wartości Start > DateTime i End > DateTime wysuwają się na powierzchnię kolekcji.
    10. Po wykonaniu wszystkich tych funkcji zmienna _loadingMeetingTimes ma ustawioną wartość fałsz, usuwanie stanu ładowania i _showMeetingTimes jest ustawiona na wartość prawda, czyli wyświetlanie FindMeetingTimesGallery.

Galeria przeglądania osób

Kontrolka PeopleBrowseGallery.

  • Właściwość: Elementy
    Wartość:
    If( !IsBlank( Trim( TextSearchBox.Text ) ), 
        'Office365Users'.SearchUser( { searchTerm: Trim(TextSearchBox.Text), top: 15 } )
    )
    

Elementy tej galerii są wypełniane przez wyniki wyszukiwania z operacji Office365.SearchUser. W tej operacji tekst w Trim(**TextSearchBox**) jest używany w postaci terminu wyszukiwania i zwraca 15 pierwszych wyników, które będą oparte na tym wyszukiwaniu.

TextSearchBox jest otoczony funkcją Trim, ponieważ wyszukiwanie w przestrzeniach użytkownika jest nieprawidłowe. Operacja Office365Users.SearchUser jest otaczana funkcją If(!IsBlank(Trim(TextSearchBox.Text)) ... ), ponieważ pobieranie wyników wyszukiwania przed wyszukaniem przez użytkownika stanowi odpady funkcjonalne.

Ludzie przeglądają galerię Tytuł

Kontrolka PeopleBrowseGallery Tytułu.

  • Właściwość: Text
    Wartość: ThisItem.DisplayName

    Wyswietla wyświetlana nazwa danej osoby z poziomu własnego profilu Office 365.

  • Właściwość: OnSelect
    Wartość: instrukcja Collect, która powoduje dodanie użytkownika do listy uczestników, może również odświeżyć dostępne czasy spotkań i przełączać różne zmienne:

    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 )
        )
    )
    

    Na wysokim poziomie wybranie tej kontrolki dodaje osobę do kolekcji MyPeople (przechowywanie listy uczestników przez aplikację) i odświeża dostępne terminy spotkań na podstawie dodania nowego użytkownika.

    Wybranie tej kontrolki jest bardzo podobne do zaznaczenia opcji AddIcon; jedyna różnica polega na tym, że instrukcja Set(_selectedUser, ThisItem) i kolejność wykonywania operacji są wykonywane. Tak więc dyskusje nie będą tak głębokie. Aby zapoznać się z pełniejszym objaśnieniem, należy zapoznać się z sekcją kontrolka Addicon.

    Wybranie tego formantu powoduje zresetowanie TextSearchBox. Następnie, jeśli wybór nie znajduje się w kolekcji MyPeople, kontrolka:

    1. Powoduje ustawienie stanu _loadMeetingTimes równą prawda, a stan _showMeetingTimes wartość fałsz, puste zmienne _selectedMeetingTime i _selectedRoom, a następnie odświeża kolekcję MeetingTimes przy użyciu nowego dodawania do kolekcji MyPeople.
    2. Określa stan _loadMeetingTimes równy fałsz i ustawia wartość _showMeetingTimes równą prawda. Jeśli dany wybór znajduje się już w kolekcji MyPeople, zresetowana jest jedynie treść TextSearchBox.

Galeria spotkań z ludźmi

Kontrolka MeetingPeopleGallery.

  • Właściwość: Elementy
    Wartość: MyPeople

    MyPeople to kolekcja osób, które zainicjowały lub dodali do programu, zaznaczając kontrolka PeopleBrowseGallery Tytuł.

  • Właściwość: Height
    Wartość: Logika umożliwiająca wzrost galerii do maksymalnej wysokości 350:

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

    Wysokość tej galerii jest regulowana liczbą elementów w galerii i ma maksymalną wysokość 350. Formuła przyjmuje 76 jako wysokość pojedynczego wiersza MeetingPeopleGallery, a następnie mnoży ją przez liczbę wierszy. Właściwość WrapCount jest ustawiona na wartość 2, więc liczba rzeczywistych wierszy wynosi RoundUp(CountRows(MeetingPeopleGallery.AllItems) / 2, 0).

  • Właściwość: ShowScrollbar
    Wartość: MeetingPeopleGallery.Height >= 350

    Po osiągnięciu maksymalnej wysokości galerii (350) widoczny jest pasek przewijania.

Tytuł Galeria spotkań z ludźmi

Kontrolka MeetingPeopleGallery Tytuł.

  • Właściwość: OnSelect

    Wartość: Set(_selectedUser, ThisItem)

    Ustawia zmienną _selectedUser na element zaznaczony w MeetingPeopleGallery.

Galeria spotkań z ludźmi iconRemove

Kontrolka MeetingPeopleGallery iconRemove.

  • Właściwość: OnSelect
    Wartość: instrukcja Remove, która powoduje usunięcie użytkownika z listy uczestników, instrukcja Collect, która powoduje dodanie użytkownika do listy uczestników:

    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 )
    

    Na wysokim poziomie wybranie tej kontrolki usuwa osobę z listy uczestników i odświeża dostępne czasy spotkań w oparciu o usunięcie tej osoby.

    Po pierwszym wierszu poprzedniego kodu wybranie tej kontrolki jest niemal identyczne, aby można było wybrać kontrolkę AddIcon. Tak więc dyskusje nie będą tak głębokie. Aby zapoznać się z pełniejszym objaśnieniem, należy zapoznać się z sekcją kontrolka Addicon.

    W pierwszym wierszu kodu wybrany element jest usuwany z kolekcji MyPeople. Kod:

    1. Powoduje zresetowanie TextSearchBox, a następnie usunięcie zaznaczenia z kolekcji MyPeople.
    2. Powoduje ustawienie stanu _loadMeetingTimes równą prawda, a stan _showMeetingTimes wartość fałsz, puste zmienne _selectedMeetingTime i _selectedRoom, a następnie odświeża kolekcję MeetingTimes przy użyciu nowego dodawania do kolekcji MyPeople.
    3. Określa stan _loadMeetingTimes równy fałsz i ustawia wartość _showMeetingTimes równą prawda.

Selektor daty spotkań

Kontrolka MeetingDateSelect.

  • Właściwość: DisplayMode
    Wartość: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    Data spotkania nie może być wybierana, dopóki nie zostanie dodany do kolekcji MyPeople co najmniej jeden uczestnik.

  • Właściwość: OnChange
    Wartość: Select( MeetingDateSelect )

    Zmiana wybranej daty powoduje wyzwolenie kodu we właściwości OnSelect na uruchomienie tej kontrolki.

  • Właściwość: OnSelect
    Wartość: oświadczenie Collect umożliwiające odświeżenie dostępnych godzin spotkań i przełączników różnych zmiennych:

    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 )
    

    Na wysokim poziomie wybranie tej kontrolki odświeża dostępne czasy spotkań. Jest to przydatne, ponieważ jeśli użytkownik zmieni datę, dostępne czasy spotkań muszą zostać zaktualizowane w celu odzwierciedlenia dostępności danego dnia przez uczestników.

    Z wyjątkiem początkowej instrukcji Collect jest to jednak identyczne z funkcją OnSelect kontrolki AddIcon. Tak więc dyskusje nie będą tak głębokie. Aby zapoznać się z pełniejszym objaśnieniem, należy zapoznać się z sekcją kontrolka Addicon.

    Wybranie tego formantu powoduje zresetowanie TextSearchBox. W ten sposób:

    1. Ustawia stan _loadMeetingTimes na prawda, a stan _showMeetingTimes na fałsz, usuwa puste zmienne _selectedMeetingTime i _selectedRoom , i odświeża kolekcję MeetingTimes z nowym wyborem daty.
    2. Określa stan _loadMeetingTimes równy fałsz i ustawia wartość _showMeetingTimes równą prawda.

Pole rozwijane czasu trwania spotkania

Formant MeetingDateSelect — czas trwania.

  • Właściwość: DisplayMode
    Wartość: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    Czas trwania nie może być wybierana, dopóki nie zostanie dodany do kolekcji MyPeople co najmniej jeden uczestnik.

  • Właściwość: OnChange
    Wartość: Select(MeetingDateSelect1)

    Zmiana wybranego czasy trwania powoduje wyzwolenie kodu we właściwości OnSelect kontrolki MeetingDateSelect do uruchomienia.

Galeria wyszukiwania terminów spotkań

Kontrolka FindMeetingTimesGallery.

  • Właściwość: Elementy
    Wartość: MeetingTimes

    Zbieranie potencjalnych terminów spotkań pobranych z operacji Office365.FindMeetingTimes.

  • Właściwość: Widoczne
    Wartość: _showMeetingTimes && _showDetails && !IsEmpty( MyPeople )

    Galeria jest widoczna tylko wtedy, gdy _showMeetingTimes ma wartość prawda, użytkownik wybrał kontrolkę LblScheduleTab, a do spotkania jest dodawany co najmniej jeden uczestnik.

Galeria wyszukiwania terminów spotkań Tytuł

Kontrolka FindMeetingTimesGallery Tytuł.

  • Właściwość: Text
    Wartość: Konwersja czasu rozpoczęcia, która ma być wyświetlana na czas lokalny użytkownika:

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

    Pobrana wartość parametru StartTime jest w formacie UTC. Aby można było przeprowadzić konwersję z czasu UTC na lokalny, stosowana jest funkcja DateAdd. Funkcja tekstu pobiera datę/godzinę jako pierwszy argument, a formatowanie jest oparte na drugim argumencie. W tym celu należy przekazać lokalną konwersję czasu ThisItem.StartTime i wyświetlić ją jako DateTimeFormat.ShortTime.

  • Właściwość: OnSelect
    Wartość: kilka instrukcji Collect polegających na zgromadzeniu pomieszczeń spotkań i ich sugerowanej dostępności, a także wielu przełączników zmiennych:

    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} )
    

    Na wysokim poziomie ten blok kodu gromadzi dostępne pomieszczenia dla użytkowników, którzy nie mają list pomieszczeń, na podstawie wybranej daty/godziny spotkania. W przeciwnym razie są po prostu pobrane listy pomieszczeń.

    Na niskim poziomie ten blok kodu:

    1. Ustawia _selectedMeetingTime na zaznaczony element. Ta funkcja umożliwia znalezienie, jakie pomieszczenia są dostępne w tym samym czasie.
    2. Ustawia zmienną stanu ładowania _loadingRooms równą prawda, co powoduje włączenie stanu ładowania.
    3. Jeśli kolekcja RoomsLists jest pusta, jest pobierana lista pomieszczeń dzierżawy użytkownika i zawiera je w kolekcji RoomsLists.
    4. Jeśli użytkownik nie ma listy pomieszczeń ani jednej listy pomieszczeń:
      1. Zmienna noRoomLists jest ustawiona na wartość prawda, a ta zmienna jest używana do określania elementów wyświetlanych w kontrolce RoomBrowseGallery.
      2. Operacja Office365.GetRooms() jest używana do pobierania pierwszych 100 pomieszczeń w ich dzierżawie. Są one przechowywane w kolekcji AllRooms.
      3. Zmienna _allRoomsConcat jest ustawiona na ciąg rozdzielany średnikami z pierwszych 20 adresów e-mail pomieszczeń w kolekcji AllRooms. Dzieje się tak, ponieważ Office365.FindMeetingTimes jest ograniczony do wyszukiwania dostępnych godzin 20 osobego obiektu w ramach jednej operacji.
      4. Kolekcja RoomTimeSuggestions używa Office365.FindMeetingTimes w celu pobrania dostępności pierwszych 20 pomieszczeń w kolekcji AllRooms na podstawie wartości godzinowych zmiennej _selectedMeetingTime. Zauważ, że & "Z" jest używana do prawidłowego formatowania wartości DateTime.
      5. Kolekcja AvailableRooms została utworzona. Jest to po prostu kolekcja RoomTimeSuggestions dostępności uczestników z dwiema dodatkowymi kolumnami: „Adres” i „Nazwa”. „Adres” to adres e-mail pomieszczenia, a „nazwa” to nazwa pomieszczenia.
      6. Kolekcja AvailableRoomsOptimal została utworzona. Jest to tylko kolekcja AvailableRooms z usuniętymi kolumnami „Dostępność” i „Uczestnik”. Jest to zgodne ze schematami elementów AvailableRoomsOptimal i AllRooms. Zezwala to na korzystanie z obu zbiorów we właściwości Elementy RoomBrowseGallery.
      7. _roomListSelected jest ustawiona na fałsz.
    5. Stan ładowania, _loadingRooms, jest ustawiany na fałsz po zakończeniu wykonywania innych czynności.

Galeria przeglądania pomieszczeń

Kontrolka RoomBrowseGallery.

  • Właściwość: Elementy
    Wartość: Logicznie ustawione na dwie wewnętrzne kolekcje o identycznym schemacie, w zależności od tego, czy użytkownik wybrał listę pomieszczeń, czy ma listy pomieszczeń w dzierżawie:

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

    W tej galerii jest wyświetlona kolekcja AvailableRoomsOptimal, jeśli _roomListSelected lub _noRoomLists jest prawdą. W przeciwnym razie zostanie wyświetlona kolekcja RoomsLists. Można to zrobić, ponieważ schemat tych kolekcji jest identyczny.

  • Właściwość: Widoczne
    Wartość: _showDetails && !IsBlank( _selectedMeetingTime ) && !_loadingRooms

    Galeria jest widoczna tylko wtedy, gdy w trzech poprzednich instrukcjach jest obliczana wartość prawda.

RoomBrowseGallery Tytuł

Kontrolka tytułu RoomBrowseGallery.

  • Właściwość: OnSelect
    Wartość: Zestaw logicznie powiązanych instrukcji Collect i Set, które mogą lub nie zostać wyzwolone, w zależności od tego, czy użytkownik wyświetla listę pomieszczeń lub pomieszczenia:

    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} )
    

    Akcje występujące po wybraniu tej kontrolki zależą od tego, czy dany użytkownik wyświetla obecnie zestaw list pomieszczeń i zestawu pomieszczeń. Jeśli jest to pierwsze, wybranie tego elementu sterującego spowoduje pobranie pomieszczeń dostępnych w wybranym czasie z listy wybranych pomieszczeń. Jeśli to ostatnie, wybranie tej kontrolki powoduje ustawienie zmiennej _selectedRoom dla wybranego elementu. Powyższa instrukcja jest bardzo podobna do instrukcji Wybierz dla FindMeetingTimesGallery Tytuł.

    Na niskim poziomie poprzedni blok kodu:

    1. Włącza stan ładowania pokoi, ustawiając _loadingRooms na prawdę.
    2. Sprawdza, czy wybrano listę pomieszczeń i czy dzierżawca ma listy pomieszczeń. Jeśli tak:
      1. Ustawia _roomListSelected na prawda i ustawia _selectedRoomList na zaznaczony element.
      2. Zmienna _allRoomsConcat jest ustawiona na ciąg rozdzielany średnikami z pierwszych 20 adresów e-mail pomieszczeń w kolekcji AllRooms. Dzieje się tak, ponieważ operacja Office365.FindMeetingTimes jest ograniczona do wyszukiwania dostępnych godzin 20 osobego obiektu w ramach jednej operacji.
      3. Kolekcja RoomTimeSuggestions używa operacji Office365.FindMeetingTimes w celu pobrania dostępności pierwszych 20 pomieszczeń w kolekcji AllRooms na podstawie wartości godzinowych zmiennej _selectedMeetingTime. Zauważ, że & "Z" jest używane do prawidłowego formatowania wartości DateTime.
      4. Kolekcja AvailableRooms została utworzona. Jest to po prostu kolekcja RoomTimeSuggestions dostępności uczestników z dwiema dodatkowymi kolumnami: „Adres” i „Nazwa”. „Adres” to adres e-mail pomieszczenia, a „nazwa” to nazwa pomieszczenia.
      5. Kolekcja AvailableRoomsOptimal została utworzona. Jest to tylko kolekcja AvailableRooms z usuniętymi kolumnami „Dostępność” i „Uczestnik”. Jest to zgodne ze schematami elementów AvailableRoomsOptimal i AllRooms. Zezwala to na korzystanie z obu zbiorów we właściwości Elementy RoomBrowseGallery.
      6. _roomListSelected jest ustawiona na fałsz.
    3. Stan ładowania, _loadingRooms, jest ustawiany na fałsz po zakończeniu wykonywania innych czynności.

Tylna podwójna strzałka

Kontrolka RoomsBackNav.

  • Właściwość: Widoczne
    Wartość: _roomListSelected && _showDetails

    Kontrolka jest widoczna tylko wtedy, gdy została zaznaczona opcja listy pokojów i wybrana karta Harmonogram.

  • Właściwość: OnSelect
    Wartość: Set( _roomListSelected, false )

    Kiedy _roomListSelected ma wartość fałsz, zmienia kontrolkę RoomBrowseGallery, tak aby wyświetlała elementy z kolekcji RoomsLists.

Ikona wysyłania

Kontrolka IconSendItem.

  • Właściwość: DisplayMode
    Wartość: Logika, aby zmusić użytkownika do wprowadzenia określonych szczegółów spotkania, zanim ikona stanie się edytowalna.

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

    Ikona jest wybierana tylko wtedy, gdy wypełniany jest temat spotkania, dla danego spotkania jest co najmniej jeden uczestnik i jest wybierany czas spotkania. W przeciwnym razie jest wyłączone.

  • Właściwość: OnSelect

    Wartość: Kod, aby wysłać zaproszenie na spotkanie do wybranych uczestników i wyczyścić wszystkie pola wprowadzania:

    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 )
    )
    

    Na niskim poziomie ten blok kodu:

    1. Ustawia _myCalendarName z kalendarzem w operacji Office365.CalendarGetTables() podając DisplayName jako „Kalendarz”.
    2. Planuje spotkanie ze wszystkimi wartościami wejściowymi pochodzącymi z różnych wyborów wprowadzonych przez użytkownika na ekranie przy użyciu operacji Office365.V2CalendarPostItem.
    3. Powoduje zresetowanie wszystkich pól wejściowych i zmiennych użytych podczas tworzenia spotkania.

Uwaga

W zależności od regionu odpowiedni kalendarz może nie mieć nazwy wyświetlanej „Kalendarz”. W celu sprawdzenia, jaki jest tytuł kalendarza, należy przejść do programu Outlook i wprowadzić odpowiednie zmiany w aplikacji.

Następne kroki

Uwaga

Czy możesz poinformować nas o preferencjach dotyczących języka dokumentacji? Wypełnij krótką ankietę. (zauważ, że ta ankieta jest po angielsku)

Ankieta zajmie około siedmiu minut. Nie są zbierane żadne dane osobowe (oświadczenie o ochronie prywatności).