今回のアプリは設定した項目を表示し、チェックした記録を残すものです。定型業務から頻繁に項目が入れ替わるものでも柔軟に対応できます。機能要件や開発レベルは下記のとおりです。
- 1日1回人別に実施項目とその記録を残す
- 途中経過は記録しない
- 同日同人の重複登録はさせない
- 承認権者の承認前なら本人が記録を削除できる
- 実施項目の修正加除に対応する
- 過去記録閲覧は当時の実施項目を表示する
- 承認権者に通知を発信する
- SharePointにリストを登録できる
- PowerAppsの操作について、データの追加やオブジェクトの配置ができる
- PowerAppsの関数や用語をなんとなく理解できる
アプリの作成は敷居が高いと思われがちですが、PowerAppsなら容易に作成することが可能です。複雑なコードもコピペできるように用意していますで、一緒に作り上げていきましょう。
01│完成イメージ
実際に操作したデモ動画です。
02│データの構成
使用するリストは2つだけです。
ひとつは実施項目をまとめたものです。何日まではこの実施項目を使ってくださいねという区分と報告先のメールアドレスもあります。頭文字のMはマスターを示しています。

ふたつめは実施記録をまとめたものです。どの実施項目を使ったかを判定する区分もあります。頭文字のTはテーブルを示しています。

各々のデータ型や用途、関係は下記のとおりです。テストデータなので項目数は5つですがいくつでも増やせます。ただし、ContentsxxとAnswerxxの数は一致させてください。

03│使用するオブジェクト
使用するオブジェクト数は合計で9個です。なんと一桁に抑えることができました。ギャラリーを活用しているので少なく抑えられています。同じことをフォームで行うと実施項目数が増えるほど、その差は大きくなっていきます。この規模なら作れる気になってきたのではないでしょうか?

04│アプリの作成
事前準備
- はじめにブラウザでPowerAppsを開き、空のアプリ > 空のキャンバスアプリ を選択します。アプリの形式は 電話 を選びます。
- M_実施項目とT_実施記録をSharePointリストとして登録します。データ型を間違えないように気を付けましょう。
- PowerAppsで先ほど登録したリストを接続します。
- 続いてOffice365ユーザーとOffice365Outlookを接続します。
アプリの形式はモバイル端末での操作を想定してるため、 電話 を選びます。
PC等で操作させたい場合は タブレット を選びます。
画面上部ーラベル
- ラベルをふたつ挿入し、Text にそれぞれ 実施日 と 実施者 と入力します。
画面上部ー日付の選択
- 日付の選択をひとつ挿入し、OnChange に下記コードをコピペします。
- また、次回起動時以降、コレクションを作成させるためスクリーンの OnVisible にもコピペします。
- 初回のみコレクションを作成させるため、日付を初期値以外に変えて、OnChange を実行させておきます。
ForAll関数の使い方はこちらも読んでください。
Clear(_Ck);Clear(_Ans);
//実施日基準で最新バージョンのレコードを抽出
ClearCollect(_CkList,LookUp(M_実施項目,EndDate >= DatePicker1.SelectedDate));
//抽出したレコードの項目を列に変換しつつ連番付与
ForAll(
Split(
Concatenate(
First(_CkList).Contents01,",",//項目数分、記述を増やす
First(_CkList).Contents02,",",
First(_CkList).Contents03,",",
First(_CkList).Contents04,",",
First(_CkList).Contents05
),
","
),
Collect(_Ck,
{
id:CountRows(_Ck)+1, // 1週するたびに1増える
con:Result
}
)
);
//登録済みデータを抽出
ClearCollect(_AnsList,LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text));
//重複判定用変数
Set(_duplicate,CountRows(_AnsList));
//抽出したレコードの回答を列に変換しつつ連番付与
ForAll(
Split(
Concatenate(
First(_AnsList).Anser01,",",//回答数分、記述を増やす
First(_AnsList).Anser02,",",
First(_AnsList).Anser03,",",
First(_AnsList).Anser04,",",
First(_AnsList).Anser05
),
","
),
Collect(_Ans,
{
id:CountRows(_Ans)+1, // 1週するたびに1増える
ans:Result
}
)
);
//idを基準にコレクションを結合
ClearCollect(_List,
Ungroup(
AddColumns(_Ck,
"ans",
Filter(
RenameColumns(_Ans,"id","id1"),
id1 = id
)
)
, "ans")
)
画面上部ーテキスト入力
- テキスト入力をひとつ挿入します。自動で実施者を反映させるため、Default は Office365ユーザー.MyProfileV2().surname&Office365ユーザー.MyProfileV2().givenName をコピペします。
- 手入力で実施者を変更されないように DisplayMode は DisplayMode.View を設定します。
ここまでで下記のように実施者にユーザー名が表示されます。表示されない場合はOffice365ユーザーが接続されているか確認してみましょう。

中段ーギャラリー
- ギャラリーをひとつ挿入します。
ラベルは実施項目を表示させるため Text に ThisItem.con をコピペします。
チェックボックスはチェック状態を都度コレクションに送るため OnCheck と OnUncheck に Patch(_List,ThisItem,{ans:Self.Value}) をコピペします。 - 承認後はチェックできないようにギャラリーのDisplayModeに下記コードをコピペします。
If(IsBlank(LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text,Approver)),
DisplayMode.Edit,DisplayMode.View)
ここまでで下記のように実施項目が表示されます。

下段ーボタン
- ボタンをひとつ挿入します。
Text、OnSelect、DisplayModeにそれぞれ下記コードをコピペします。
If(CountRows(Filter(Gallery1.AllItems,Checkbox1.Value))/CountRows(Gallery1.AllItems)=1,
If(!_duplicate,"〇 登録","〇 登録済み"),
"× 漏れあり"
)
//同じデータあるか確認
If(!_duplicate,
//登録する
Patch(T_実施記録,
{
CheckDate:DatePicker1.SelectedDate,
Title:TextInput1.Text,
Version:First(_CkList).Version,
Anser01:If(First(_List).ans="true",true),
Anser02:If(First(LastN(_List,CountRows(_List)-1)).ans="true",true),//項目数分とおなじ数だけ増やす
Anser03:If(First(LastN(_List,CountRows(_List)-2)).ans="true",true),//-xは1ずつ増やす
Anser04:If(First(LastN(_List,CountRows(_List)-3)).ans="true",true),
Anser05:If(Last(_List).ans="true",true)
}
)
,
//上書きする
Patch(T_実施記録,LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Title=TextInput1.Text),
{
CheckDate:DatePicker1.SelectedDate,
Title:TextInput1.Text,
Version:First(_CkList).Version,
Anser01:If(First(_List).ans="true",true,false),
Anser02:If(First(LastN(_List,CountRows(_List)-1)).ans="true",true,false),//項目数分とおなじ数だけ増やす
Anser03:If(First(LastN(_List,CountRows(_List)-2)).ans="true",true,false),//-xは1ずつ増やす
Anser04:If(First(LastN(_List,CountRows(_List)-3)).ans="true",true,false),
Anser05:If(Last(_List).ans="true",true,false)
}
)
);
//報告メールを発信する
Office365Outlook.SendEmail(
First(_CkList).ReportAddress,//メールアドレス
"作業完了報告",//タイトル
"終わったので承認してください。チェック内容や承認用アプリのアドレス付けると親切"//本文
);
///登録済みデータを抽出
ClearCollect(_AnsList,LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text));
//重複判定用変数
Set(_duplicate,CountRows(_AnsList));
//完了通知
Notify("更新しました。")
//実施記録がすべて埋まる または 重複している場合はボタン押せる。承認済みだと不可。
If(
(CountRows(Filter(Gallery1.AllItems,Checkbox1.Value))/CountRows(Gallery1.AllItems)=1||_duplicate)
&&IsBlank(LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text,Approver)),
DisplayMode.Edit,DisplayMode.Disabled
)
下段ーアイコン
- アイコンのごみ箱を挿入します。
OnSelect 、Visibleにそれぞれ下記コードをコピペします。
//登録済みデータを削除
Remove(T_実施記録,LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text));
Clear(_Ck);Clear(_Ans);
//実施日基準で最新バージョンのレコードを抽出
ClearCollect(_CkList,LookUp(M_実施項目,EndDate >= DatePicker1.SelectedDate));
//抽出したレコードの項目を列に変換しつつ連番付与
ForAll(
Split(
Concatenate(
First(_CkList).Contents01,",",//項目数分、記述を増やす
First(_CkList).Contents02,",",
First(_CkList).Contents03,",",
First(_CkList).Contents04,",",
First(_CkList).Contents05
),
","
),
Collect(_Ck,
{
id:CountRows(_Ck)+1, // 1週するたびに1増える
con:Result
}
)
);
//登録済みデータを抽出
ClearCollect(_AnsList,LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text));
//重複判定用変数
Set(_duplicate,CountRows(_AnsList));
//抽出したレコードの回答を列に変換しつつ連番付与
ForAll(
Split(
Concatenate(
First(_AnsList).Anser01,",",//回答数分、記述を増やす
First(_AnsList).Anser02,",",
First(_AnsList).Anser03,",",
First(_AnsList).Anser04,",",
First(_AnsList).Anser05
),
","
),
Collect(_Ans,
{
id:CountRows(_Ans)+1, // 1週するたびに1増える
ans:Result
}
)
);
//idを基準にコレクションを結合
ClearCollect(_List,
Ungroup(
AddColumns(_Ck,
"ans",
Filter(
RenameColumns(_Ans,"id","id1"),
id1 = id
)
)
, "ans")
)
//登録済み かつ 承認済みではない場合に表示
_duplicate && IsBlank(LookUp(Filter(T_実施記録,CheckDate=DatePicker1.SelectedDate),Person=TextInput1.Text,Approver))
以上で作成完了です。実際に操作して動作確認してみましょう。メールが送信されない場合はOffice365Outlookが接続されているか、届かない場合はM_実施項目のメールアドレスが正しいか確認してください。
05│次回予告
実施項目の編集機能、承認権者の承認機能を紹介していきます。
この記事では全2回に分けて、汎用性の高いチェックリストアプリを作成します。チェック項目や実施結果をリストに保存するため、トレーサビリティもバッチリです。下記の問題解決に役立ちます。