てんこ製作

Tenco Works

PowerAppsで作ったキャンバスアプリで入力履歴を残したい

PowerAppsのキャンバスアプリでテキストの入力履歴を保存するようなフォーム作りをしてみました。

環境

勤め先の会社での話になります。会社ではMicrosoft 365が使えます。使うアプリは、

  • SharePoint上のリスト
  • PowerApps

やりたいこと

  • リストの1つのアイテムで依頼者と対応者が質問/回答のやり取りをする想定です。
  • 複数行テキストの項目を作って、そこに質問を入力させます。
  • アイテムを一回保存するときに、今回入力したテキストの先頭に日時を自動的に入れるようにします。
  • 過去から入力した質問を全部日時付きで履歴として保存していきます。
  • 回答も同様に履歴を保存していきます。

というようなことをしたいのです。

標準機能ではできないか?

リストで複数行テキストの項目を作成するときに、「既存のテキストに変更を追加する」というオプションがあるのは見つけました。

ただこの機能はリスト自体の設定で「アイテムのバージョン履歴」をオンにする必要があって、かつ保存するバージョン数も一緒に指定するオプションになってます。想定以上の保存数になったときに履歴が消えていくのでしょうきっと。なのでこれは要件的に不可かなぁ。

で、他に妥当そうな機能も見当たらず、標準機能での実現は諦めました。

考えた解決策

PowerAppsを使って多少ゴリゴリできそうです。

  • リスト上で入力用と保存用の2つを列を作っておきます。両方とも複数行テキストにしておきます。1つは入力用、1つは履歴保存用です。
  • フォーム上では入力用に文字列を入力してもらいます。
  • フォームの保存時に、履歴保存用の項目に対して「日時文字列+入力用文字列+履歴保存用文字列」を保存します。
  • 入力用に入力されたデータはクリアします。

実際に作ってみます

リストの作成

まずはこんな感じの列をリストで作ります。

名前 種類 備考
ID デフォルトで存在
タイトル デフォルトで存在
進捗入力 複数行テキスト
進捗履歴 複数行テキスト

PowerAppsフォームの作成

PowerAppsで前述のリストをデータソースにしたフォームを含むPowerAppsアプリを作成します。

これがまた図解しかできないところがPowerAppsはむずかしい・・・

フォームの細工

リストで保存するときには、PowerApps上ではSharePointIntegrationOnSaveプロパティの内容が実行されます。OnSaveプロパティには通常SubmitForm(いずれかのフォーム)が記述されているはずです。

で、このSubmitForm()が実行されたときに、指定されたフォームの中に含まれる各DataCardのUpdateプロパティに設定されている内容をサーバーに送信するという動きをするんだそうです。

なので、DataCardのUpdateプロパティに細工を施していきます。

進捗履歴のUpdateプロパティ

進捗履歴のUpdateプロパティを次のように設定します。

If(DataCardValue_Added.Text <> "",
  Text(Now())&Char(10)&Char(10) &
  DataCardValue_Added.Text & Char(10) &Char(10) &
  DataCardValue_History.Text & Char(10) & Char(10),
  DataCardValue_History.Text)

if()の第1引数は条件、第2引数は条件が成立する場合の値、第3引数は条件が成立しない場合の値です。

この処理が動く条件は「進捗入力になにか入力されている場合」としたいので、DataCardValue_Added.Text<>""としました。DataCardValue_Addedは、進捗入力DataCardの中にあるテキスト入力ボックスです。

第2引数は「進捗入力になにか入力されている場合」の値です。その場合は「今日の日付+進捗入力に入力された内容+もともとあった進捗履歴の内容」にします。今日の日付文字列はText(Now))、改行はChar(10)、文字列の連結は&です。また、DataCardValue_Added.Textは進捗入力DataCard内のテキストボックスに入力されたテキストデータ、DataCardValue_History.Textは進捗履歴DataCard内のテキストボックスに入力されたテキストデータです。

そして第3引数は「進捗入力に何も入力されなかった場合」の値です。その場合は進捗入力の内容を付け足す必要がないのでDataCardValue_History.Textとしておきます。

画面的にはこんな感じ。

進捗入力のUpdateプロパティ

進捗入力プロパティは都度毎回進捗を入力してもらうことを想定してますので、一回入力を保存したら内容はクリアしたいと思っています。次に表示するときはまたからの状態になっているようにします。

なので、進捗入力DatacardのUpdateプロパティは次のように空の文字列を設定しておきます。

""

動作確認

こんな感じで保存してくれました。

てんこがハマったところ

  • Updateプロパティはテキストボックスのプロパティではなく、データカード自体のプロパティであること
  • フォームの内容をサーバーに送るときは、データカード自体のUpdateプロパティの内容が参照されること