はじめに
お久しぶりのブログ更新になります。
最近やりたいことが渋滞して逆になにも進められていないという悪循環に陥っております。
近況報告はこの程度にしておきまして、今回はPower Apps からSPOリストの値を空(Blank)で更新する方法を纏めたいと思います。
最近Power Apps からSPOリストの日付フィールドを空で更新したい!!と思って試してみたところ、空の値をSubmitFormやPatchでPower Apps からSPOリストに渡してみたところ、なんと特になにもエラーがでていないにも関わらず値が前回のまま更新されずに残ってしまう。
という事象が発生してしまいました。
この事象の解決方法と、なぜこれで解決できるのか?について備忘録を今回は記載します。
とりあえず解決方法だけ知りたい方向け
以下設定を行うだけで今回の問題は解決できます。
設定 > 実験段階 > 数式レベルのエラー管理
がデフォルトですと「オフ」になっているので「オン」に設定します。
これだけで、今回の問題は解決します。
発生した事象
今回の問題は「アイテムを空の値で更新できない」というものですので、まずは適当なデータを作成します。
- 適当なSPOリストを用意して、そのリストをもとにアプリを作成します。
- 適当なデータを作成します。
- 無事アイテムを登録することができました!
- ではいよいよ本題です。
こちらのアイテムを空のデータで更新したいと思います。
Power Apps でこちらのアイテムを選択してDispScreen1 へ遷移し、IconEdit1 を選択してEditScreen1 へ遷移します。
- 必須項目(Title)以外の入力項目を空にします。
値が更新されたことをわかりやすくするためにTitleは連番を付与しておきます。
- これでSubmitForm を行うと...一部空になってない!!
1行テキストと複数行テキストの項目は空白になっていますが、他項目は空白になっていませんね。
次に空白に設定する方法を変えてみます。
先ほどは入力項目の値を手で消して空にしましたが、今度はBlank 関数を用いて空白の値をセットさせてあげようと思います。
適当にReset ボタンを用意して、 OnSelect
に以下を設定します。
Button1.OnSelect
UpdateContext({isReset:true});
次に入力項目の Default
を以下のように設定します。
XXX_DataCard[N]
If( !isReset, ThisItem.XXX, Blank() )
XXX は各項目名になります。
これでReset ボタンが押されたときに空白の値が各項目に設定されるようになりました。
この状態でSubmitForm してみます。
その結果は以下になります。
先ほどは空が入っていた1行テキストと複数行テキストについても空が設定されていないですね。
これは 空文字を設定しているのか と 空白値を設定しているのか の違いです。
前者の入力項目を消して設定した方法で設定されたのが空文字で、 Blank()
を用いて設定した後者は空白値を設定していることになります。
ちなみにことらPatch 関数でアイテムの更新を行った場合も同様の結果となります。
気になった方は試してみてください。
なぜ空白を登録できないのか
ではなぜ空白を登録できないのでしょうか?
これはBkank 関数の説明をしているdocs の注意書きをみると理由が記載されていました。
注意
切り替えの期間にいます。 これまでは、空白 を使用してエラーをレポートし、エラーから有効な "値なし" を区別することができませんでした。 このため、現時点で、空白 値の格納は、ローカル コレクションでのみサポートされています。 設定 > 今後の機能 > 実験的 で 数式レベルのエラー管理実験機能 をオンにしておくと、他のデータソースに 空白 の値を保存することができます。 この機能を完了し、およびエラーからの 空白 値の適切な分離を完了することに積極的に取り組んでいます。
どうやら現時点では空白値の設定はローカルコレクションでのみしかサポートされていないようですね。
空白値を設定するには
これを回避するためには
設定 > 実験段階 > 数式レベルのエラー管理
を「オン」に設定するよう記載されているので「オン」にして試してみます。
まずは入力項目を手動で空にした場合です。
この状態でSubmitForm を行います。
無事値のクリアができました!
次にBlank 関数で空白値を設定します。
この場合も同様に値のクリアができるようになりました!
おわりに
Power Apps からSPOリストに空白値を設定する方法を纏めてみました。
空白値を設定したい。というケースは少なくないと思いますので早くこの設定がデフォルトで実装されるようになるといいですね。
私の所感ですが、こちらの機能は実験段階の機能にあるとはいえあのdocs の記載方法てきに今回紹介した機能がまったくなくなるということはないのではないかな?と思っています。
機能のロールアウトステージに関してはこちら。
とはいえ、実験的な機能は、「まだこの機能に依存しないでください」と明言されている機能なので実務では使えない。使いたくない。とい場合があるかと思います。
そのような場合は項目が「テキスト」であれば空文字を、
「選択肢」であれば以下のように空文字を選択したような状態にするなどすれば回避できます。
If( !isReset, ThisItem.Choice, { Claims: "i:0#.f|membership|" & Lower(User().Email), Value: "" } )
ただし、「数値」や「日付」は上記のような回避策がないので、0を設定する(日付項目に0などの数値を設定すると「1970/1/1」が設定されます。)などして運用で回避するしか現時点ではなさそうです。