MENU

PowerAppsのgalleryにTeams投稿の一覧を表示させる

どうやら「MicrosoftTeams.×××」という式でTeamsから色々と情報を取得できるようです。
Teams見たいならTeams見ろや、アプリで見させる意味って何だよ、と思う人間なのでどういう業務に使えるかは分かりませんが。
いつか必要になるかもしれませんし。
式で取得できる情報は知っておきたい。

ということで、レッツチャレンジ☆

目次

完成図と仕様

上のコンボボックスでチームを選択。
下のコンボボックスでチャネルを選択。

2つが揃ったタイミングで垂直ギャラリーに投稿メッセージの一覧を表示。
ギャラリー内に表示しているのは、投稿日時(JST)、投稿者、件名です。

ユーザー投稿の場合は投稿者が表示されますが、ボット投稿の場合は空欄。

件名がない投稿は空欄。

データ

Appsのデータで「Teams」をデータソースとして追加します。

スクリーン

名称:Screen2

プロパティOnVisible
ClearCollect(colTeams2,    { id:"", displayName:"", description:"" }); RemoveIf(colTeams2, true);
ClearCollect(colChannels2, { id:"", displayName:"", description:"" }); RemoveIf(colChannels2, true);
ClearCollect(colMsgs2,
    {
        id:"", replyToId:"", subject:"", summary:"",
        body:{ contentType:"", content:"" },
        createdDateTime: DateTimeValue("1900-01-01T00:00:00Z")
    }
); RemoveIf(colMsgs2, true);

ClearCollect(colTeams2, MicrosoftTeams.GetAllTeams().value);
  1. colTeams2 というコレクションを作成
  2. 空データを入れて、コレクションの構造を定義
    ※id(識別子)、displayName(チーム名)、description(チームの説明)
  3. RemoveIf(colTeams2, true)で空データを削除
  4. 上記と同様に「colChannels2」というチャネル用のコレクションを作成して初期化
  5. 上記と同様に「colMsgs2」というメッセージ用のコレクションを作成して初期化
    • bodyにはcontentType(テキスト形式など)、content(本文)などを設定
  6. createdDateTimeを日付型に変換するため、DateTimeValueで1900年1月1日を設定
  7. Teamsから取得したすべてのチーム情報をcolTeams2に格納

チーム一覧を選択するコンボボックス

名称:cboTeam_1

DisplayFields

備忘:どのフィールド(列)を画面上に表示するか指定するプロパティ

["displayName"]

InputTextPlaceholder

備忘:何も入力してないときボックスに表示されるテキスト

"チーム名"

Items

colTeams2

NoSelectionText

備忘:何も選択されていない時に表示されるテキスト
(InputTextPlaceholderと同じようなプロパティ)

"チーム名"

OnChange

備忘:cboTeam_1が変更されたときに働く式

Reset(cboChannel_1);
Clear(colChannels2);
If(
    !IsBlank(cboTeam_1.Selected.id),
    ClearCollect(
        colChannels2,
        MicrosoftTeams.GetChannelsForGroup(cboTeam_1.Selected.id).value
    )
);
  1. 前回選択したチャネルをクリアます
  2. colChannels2に格納されたチャネル一覧をすべて削除します
  3. コンボボックス(cboTeam_1)が選択されている場合のみclearcollectが働くようにします
    ※チーム名を変更したときは変更後のチャネルがまだ取得されていないため、この式がないとエラーになります
  4. 指定したチームIDに属するチャネル一覧を取得します
  5. clearcollectで、取得したチャネル一覧をcolChannels2に保存します

SearchFields

["displayName"]

SelectMultiple

備忘:複数選択を許可するか否か

false

チャネル一覧を選択するコンボボックス

名称:cboChannel_1

DisplayFields[“displayName”]
DisplayMode// cboTeam_1が何も選択されていない場合は無効化
If(IsBlank(cboTeam_1.Selected), DisplayMode.Disabled, DisplayMode.Edit)
InputTextPlaceholder“チャネル名”
ItemscolChannels2
NoSelectionText“チームを選択してください”
SearchFields[“displayName”]
SelectMultiplefalse

Messageの一覧を表示

ギャラリーを挿入します
名称:Gallery3_1

プロパティ:Items

If(
    IsBlank(cboTeam_1.Selected.id) || IsBlank(cboChannel_1.Selected.id),
    FirstN(
        Table(
            {
                id: "",
                replyToId: "",
                subject: "",
                summary: "",
                body: { contentType: "", content: "" },
                from: { user: { displayName: "" } },
                createdDateTime: DateValue("2000-01-01")

            }
        ),
        0
    ),
    MicrosoftTeams.GetMessagesFromChannel(
        cboTeam_1.Selected.id,
        cboChannel_1.Selected.id
    ).value
)
  1. cboTeam_1かcboChannel_1のどちらかが空欄である場合は次を実行します
  2. 空っぽのテーブルを返します
    ギャラリーには何も表示しませんが、構造は保ちます
  3. コンボボックスが両方選択されている場合、選ばれたチームのIDと選ばれたチャネルのIDに対応するメッセージ一覧を取得して表示します(レコードの配列)

Gallery3_1のレコード表示設定

1行に以下のようなアイテムを挿入表示しています

コントロールコントロール名表示内容Textプロパティ
テキストラベルdaytime投稿日時Text(ThisItem.createdDateTime, “yyyy/mm/dd hh:mm”,”ja-JP”)
テキストラベルmsgName投稿者ThisItem.from.user.displayName
テキストラベルLabel5件名ThisItem.subject
アイコンNextArrow2_1これはOnselectに設定します

UpdateContext({ ctxMessageId: Text(ThisItem.id)});
Select(Parent)

単純に投稿一覧だけであれば最後のアイコンやOnselectは不要です

設定完了

上記で設定は完了です。
変更していないコントロール名が結構あるため、分かりにくいかもしれません。
Copilotと試行錯誤しながらだったため、今となっては不要な式もあると思われますが、ご容赦ください。
あと細かいデザイン(Height、Width、X、Y)は好みで調整してください。

また、ここでは投稿一覧を表示させるところまでで終了ですが、投降を1つ選択したらメイン画面にそのスレッドが表示される設定に挑戦中です。

広告

目次