Teamsのアンケートなどの投稿に対してリマインダー（PowerApps編)

# はじめに
会社のアンケートなどがあった際にTeamsで回答依頼の投稿を行い、
対応した人はその投稿に対してリアクションを行っている。
期限までにリアクションがない人に対してメンションを行っているが、
それらを自動で行いたいという思いで過去にいくつか取り組んできた。

[PowerAutomateを使ってTeamsの投稿に対してリマインダーする(アンケートなど)～概要編～](https://qiita.com/ctc-m-yomo/items/d5d7eac9b8c9b2b2d2ce)
[PowerAutomateを使ってTeamsの投稿に対してリマインダーする(アンケートなど)～詳細編～](https://qiita.com/ctc-m-yomo/items/43444848b3f8b104f082)


以前のツールは、投稿に対してPowerAutomate(以下、Automate)を実行するやり方だったが、
社内の方からPowerApps(以下、Apps)を使って投稿フォームを作ったほうが
より使いやすくなるのではというアドバイスをいただいたので、
Appsで投稿フォームを作成してみた。

※紹介するAppsはまだシンプルな投稿のみの実装のため、
　UIは今後改修予定である。
※Automateについては動作確認中のため、
　修正が終わり次第記事にする予定。

# 結論
前回の課題についての実施状況
【済】PowerAppsと連携させて、投稿文をテンプレート化し入力項目を削減
【済】〇日前と当日と、リアクションしていないメンバーへの通知の処理を共通化する
【未】通知のタイミングを土日を考慮してリマインドを実施する

※補足：この記事でのやり方として、次の準備が必要
　　　　⇒メンション先をUIと合わせるためにTeamsのタグ機能を使い
    　　　メンションのパターンに合わせてあらかじめタグを割り当てておく必要がある
       ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/9653b37b-34a1-8eb5-86aa-21463cd16a7b.png)


# 感想
初めて触るAppsであったため、Udemyで学習したり周囲に確認しながら作成した。
AppsではなくFormsも検討したが、カスタマイズ性が高いのと勉強もかねてAppsを選択。
Apps始めたてなのでもっといいやり方があるかもしれないのアドバイスいただきたい。

### 今後の課題
+ **TasksまたはExcelを使ってアンケート一覧を管理できるようにする**
+ **通知のタイミングを営業日を考慮してリマインドを実施する**
+ **Appsの操作性向上**

# 目次
1. [Apps図](#C1)
1. [Appsの設定](#C2)
1. [参考文献](#ref)

<a id="#C1"></a>
# Apps図
**Appsの投稿画面は以下の通り**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/302767fe-8c33-a9d1-14bb-b77f15246406.png)


[投稿先チーム][投稿先チャネル]
汎用性を持たせるために投稿先のチームとチャネルはプルダウンで選べるようにした。
※デフォルト値でよく投稿する場所を指定できる

[メンション先]
ラジオボタン形式でメンション先を指定。
準備としてラジオボタンの項目名をそのままTeamsのタグに割り当てておくことで
Automateにおけるパターンごとのメンションの仕方を簡略化した。

[回答期限]
カレンダーを使うことで日付選択がしやすくなった。

[通知タイプ][投稿件名]
通知タイプを選択することで件名の頭の文字を変化させるようにした

[投稿本文]
リッチテキストエディタを利用することで、絵文字を利用可能

<a id="#C2"></a>
# Appsの設定
Appsの基本的な使い方の説明は省略するため、実際に行った設定を紹介する。

**[投稿先チーム]**
・オブジェクト：コンボボックス
・パラメータ
　　Default："yomo"
　　　デフォルトにしたいチーム名）
　　Items　：MicrosoftTeams.GetAllTeams().value
　　　Teamsのチームを取得してくれる

**[投稿先チャネル]**
・オブジェクト：コンボボックス
・パラメータ
　　Default："General"
　　　デフォルトにしたいチャネル名）
　　Items　：MicrosoftTeams.GetChannelsForGroup(cmbTeam.Selected.id).value
　　　チームのチャネルを取得してくれる

**[メンション先]**
・オブジェクト：ラジオボタン
・パラメータ
　　Default："管理職なし"
　　　デフォルトにしたいメンション先）
　　Items　：["管理職なし", "管理職あり", "正社員", "なし"]
　　　このリストの名前をそのままTeamsにてメンバータグとしてあらかじめ付与しておく
　　OnChange と OnSelect：※コピーしやすいようにコードブロックにした
　　　値が変化しても対応できるように共に同じ値を入れた
```
  //メンション先によって文言を変える
Set(
    menTarget,
    If(
        rdoMention.Selected.Value = "管理職あり",
        "、管理職は😮",
    )
);

Set(
    MainHead,
    If(
        rdoNotType.Selected.Value = "依頼",
        "下記について依頼です。<br>完了しましたら👍" & menTarget & "でリアクションしてください。<br>" & "・対象者：" & rdoMention.Selected.Value & "<br>" & "・期限　：" & dtpLimit.SelectedDate & "<br>" & "・実施内容　：<br>",
        If(
            rdoNotType.Selected.Value = "周知",
            "下記について周知です。<br>"
        )
    )
);
```

**[通知タイプ]**
・オブジェクト：ラジオボタン
・パラメータ
　　Default："依頼"
　　　デフォルト値
　　Items　：["依頼","周知"]
　　Layout ：Layout.Horizontal
　　OnChange と OnSelect：※コピーしやすいようにコードブロックにした
　　　値が変化しても対応できるように共に同じ値を入れた
```
//件名の頭に付ける文言
Set(
    SubHead,
    If(
        rdoNotType.Selected.Value = "依頼",
        "【依頼】",
        If(
            rdoNotType.Selected.Value = "周知",
            "【周知】"
        )
    )
);

//本文に付ける文言
Set(
    MainHead,
    If(
        rdoNotType.Selected.Value = "依頼",
        "下記について依頼です。<br>完了しましたら👍" & menTarget & "でリアクションしてください。<br>" & "・対象者：" & rdoMention.Selected.Value & "<br>" & "・期限　：" & dtpLimit.SelectedDate & "<br>" & "・実施内容　：<br>",
        If(
            rdoNotType.Selected.Value = "周知",
            "下記について周知です。<br>"
        )
    )
);
```

**[リマインド要否]**
・オブジェクト：ラジオボタン
・パラメータ
　　Default："あり"
　　　デフォルト値
　　Items　：["あり","なし"]
　　Layout　：Layout.Horizontal

**[回答期限]**
・オブジェクト：日付の選択
・パラメータ
　　Default："あり"
　　　デフォルト値
　　OnChange ：※コピーしやすいようにコードブロックにした
　　　必ず変更される想定のためOnSelectは省略
```
//本文に付ける文言
Set(
    MainHead,
    If(
        rdoNotType.Selected.Value = "依頼",
        "下記について依頼です。<br>完了しましたら👍" & menTarget & "でリアクションしてください。<br>" & "・対象者：" & rdoMention.Selected.Value & "<br>" & "・期限　：" & dtpLimit.SelectedDate & "<br>" & "・実施内容　：<br>",
        If(
            rdoNotType.Selected.Value = "周知",
            "下記について周知です。<br>"
        )
    )
);
```

**[URL]**
・オブジェクト：テキスト入力
・パラメータ
　　Default："なし"
　　　デフォルト値
　　HintText："http://"
　　　好みであってもなくてもいいかも

**[投稿件名]**
※【依頼】などの箇所
・オブジェクト：テキストラベル
・パラメータ
　　Text：SubHead
　　　変数を指定

※投稿件名
・オブジェクト：テキスト入力
・パラメータ
　　なし

**[投稿本文]**
・オブジェクト：リッチテキストエディタ
・パラメータ
　　Default：※コピーしやすいようにコードブロックにした
```
 "<br>" &
MainHead

& "<br><br>"
&"・リンク：<a>" & tinURL.Text & "</a><br><br><br>" 
```

**[投稿する]**
・オブジェクト：ボタン
・パラメータ
　　Text："投稿する"
　　Default：※コピーしやすいようにコードブロックにした
　　　「投稿リマインダー付きPAv1」というAutomateに値を引き渡す
```
 投稿リマインダー付きPAv1.Run(cmbTeam.Selected.id, cmbChannel.Selected.id, rdoMention.Selected.Value, rdoRemind.Selected.Value, dtpLimit.SelectedDate, tinURL.Text, lblSubHead.Text, tinSub.Text, rteMain.HtmlText);
```


UIの細かい作りこみは今後行う予定。
Automateの箇所については動作確認中のため修正後に後日投稿予定。

<a id="#ref"></a>
# 参考文献
改めて自分が過去に書いた記事
[PowerAutomateを使ってTeamsの投稿に対してリマインダーする(アンケートなど)～概要編～](https://qiita.com/ctc-m-yomo/items/d5d7eac9b8c9b2b2d2ce)
[PowerAutomateを使ってTeamsの投稿に対してリマインダーする(アンケートなど)～詳細編～](https://qiita.com/ctc-m-yomo/items/43444848b3f8b104f082)