Plannerを救いたい with Power Apps

## 緒言
**Plannerってとても魅力的**だと思うんです。シンプルな入力、バケットで整理も楽、充実の自動通知、OutlookやTeamsからも確認しやすい優れた動線、等々。
一方で若干物足りないなと思うところも。例えば関連ファイル連携が弱かったり、ビューがあまり実用的でなかったり、承認機能が無かったり。
そんなこんなで誰しも一度は使おうとして断念した経験がおありじゃないでしょうか。
**せっかく魅力たっぷりのPlannerを救いたい！Power！**

## Plannerを救うには
Plannerの良さを活かしつつ、拡張性の低さやビューの実用性の低さを補うには、**SharePointをデータソースにしたPower AppsとPlannerを連携**させれば良い！さすれば拡張性もあるしPower BIで実用性のある可視化もできる！
ただしPower Apps編集⇒Planner連動は即時だが、Planner編集⇒Power Apps連動は[Plannerコネクタ](https://learn.microsoft.com/ja-jp/connectors/planner/#triggers)の限られたタイミングしかないのでそこは我慢。

## 作り方
### SharePointリストの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/a34521ff-3e71-d920-e194-ae75c04487fd.png)
上から順に`タイトル`から`Description`までがPlannerと連動する項目。
`PercentComplete`はPlannerの進捗率と連動しており"0","50","100"の3択選択肢。

`Approver`以降は任意で拡張したい列を設定。承認機能つけてみたり、関連ファイル保存フォルダ設定してみたり、完了日を入力させてみたり。

### Power Appsの設定
完成イメージはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/5da61e1e-16ad-6cf2-ea8f-3cf4f2c857c0.png)
ギャラリーとフォームのシンプルな構成

#### 1. データ接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/fe026f41-bcec-24ee-ab3c-2857bbc6cf80.png)
最小構成はPlannerとSharePointのみ

#### 2. App.Formulas
ここで連携させるPlannerの基本情報（グループID、プランID、バケットリスト）を定義する。
```
_GroupId="グループID";
_PlanId="プランID";
_BucketList=Planner.ListBucketsV3(_PlanId,_GroupId).value;
```
グループIDとプランIDは下記のようにPlannerのURLで分かる。
```
https://planner.cloud.microsoft/webui/plan/プランID/view/grid?tid=グループID
```

#### 3. ギャラリーの設定
データソースにSharePointリストを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/5bb9c622-6b85-c493-e25c-908c86ab20bd.png)
注意点はバケットIDからバケット名を取得して表示させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/6fecd58d-6c9c-ad20-8921-ff3a83538a18.png)

#### 4. フォームの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/c40c16ee-6371-f719-cff9-7b8c6db8dea2.png)
`BucketID`は"一行テキスト"だが、ID入力は大変なのでコンボボックスに置換してApp.Formulasで定義した`_BucketList`をコンボボックスの`Items`に設定しバケット名で選択できるようにする。コントロールの置換方法は[こちら](https://qiita.com/meccha__eeyan/items/72ebe64fa7692d8f43d7)参照。

`OnSuccess`にPlannerとの連動させる数式を記述しておく。
```
With(
    {_rec: Form1.LastSubmit},
    If( 
        //TaskIDが空=新規保存、TaskIDが空じゃない=編集保存で場合分け
        IsBlank(_rec.TaskID),
        
        //【新規保存の時】
        UpdateContext( //Plannerタスクを新規作成しTaskIDを取得
            {
                _newTaskId: Planner.CreateTaskV4(
                    _GroupId,
                    _PlanId,
                    _rec.タイトル,
                    {
                        bucketId: _rec.BucketID,
                        dueDateTime: _rec.DueDate,
                        startDateTime: _rec.StartDate,
                        assignments: Concat(_rec.Assignments,Email,";")
                    }
                ).id
            }
        );
        //連動するSharePointへTaskID記録
        Patch(PlannerPlus,_rec,{TaskID: _newTaskId}); 
        //Plannerの"Notes"(=description)を保存
        Planner.UpdateTaskDetailsV2(_newTaskId,{description: _rec.Description});
        //Plannerの"進捗"(=percentComplete)を保存
        Planner.UpdateTaskV3(_newTaskId,{percentComplete:Value(_rec.PercentComplete.Value)}),
        
        //【編集保存の時】
        Planner.UpdateTaskV3(
            _rec.TaskID,
            {
                bucketId: _rec.BucketID,
                dueDateTime: _rec.DueDate,
                startDateTime: _rec.StartDate,
                percentComplete: Value(_rec.PercentComplete.Value),
                title: _rec.タイトル
            }
        );
        Planner.UpdateTaskDetailsV2(_rec.TaskID,{description: _rec.Description});
        //編集保存の時は一度アサインユーザーを全削除してから更新
        Planner.UnassignUsers(_rec.TaskID,Concat(Planner.GetTaskV2(_rec.TaskID)._assignments,userId,";"));
        Planner.AssignUsers(_rec.TaskID,Concat(_rec.Assignments,Email,";"))
    )
);
ResetForm(Form1)
```
## 結言
Power Apps ⇒ Plannerの即時連動は上述で問題ないが、Planner ⇒ Power Appsの連動はPower Automateのスケジュールトリガー等で即時性は無いが別途担保しておくと良いかも。Planner直接は確認程度に留め、変更必要な場合は基本Appsを使ってもらうように利用者に周知しておくと良いかも。[Plannerの制限](https://learn.microsoft.com/ja-jp/planner/planner-limits)をチェックしつつこれからもお世話になります！