まずは何が問題なのか実際に挙動を見ていただければと。
『おや?変更を加えていないのに時間がコロコロ変わっているぞ?』
これが Teams 上の Power Apps で DateTime型の列を取り扱う場合の問題点です。
DateTime型の列が紐づけられているフォームでは、日付に変更を加えず保存すると時間がずれる
問題の原因
問題の原因は、フォーム内の対応するカードの Update プロパティ と、新しい DatePicker コントロールの性質です。
まず Update プロパティですが、以下の式で与えられます。
DateValue1.Value + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)
この式は通常の Power Apps のフォームでも見慣れた式で、通常のフォームでは Update プロパティは以下のように与えられます。
DateValue1.SelectedDate + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)
同じに見えますよね。ここで問題になるのが新しい DatePickerコントロールの性質です。
新しい DatePicker コントロールでは、選択された日付 (SelectedDate) ではなく、 値 (Value) を返すようになりました。この Value は 日付だけでなく (より正確には日付+0:00 ではなく) 日付+時間を返します。
また、Editフォームでは既定でDatePickerに対して Parent.Default
(DateTime列の値) が適用されます。
例 : DateTime 列が 2020/02/16 15:00 の場合
このとき、DataValue.Value
は 2020/02/16
ではなく 2020/02/16 15:00
を返します。一方で、通常の Power Apps における DatePicker ではあくまでもSelectedDate なので、DateValue1.SelectedDate
は 2020/02/16 00:00
を返します。
これにより、Teams版と通常版ではそれぞれ Update の計算結果は以下のようになります。
Teams 版
DateValue1.Value + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0) = 2020/02/16 15:00 + 15:00 = 2020/02/17 06:00
通常版
DateValue1.SelectedDate + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0) = 2020/02/16 00:00 + 15:00 = 2020/02/16 15:00
ということで、元の問題だった DateTime型の列が紐づけられているフォームでは、日付に変更を加えず保存すると時間がずれる の原因 がおわかりいただけたでしょうか。
修正するには
これを正しくするためにはどうすればよいでしょうか。
考えられる方法は2つ、
- DatePicker のValue (Parent.Default) から時間部分を取り除く
- Update プロパティの DatePicker.Value な部分から 時間を取り除く
です。どちらで対応しても問題ありません。
修正方法1 : DatePicker の Value をいじる
この場合にはDatePickerの Valueプロパティを以下のように変更します。
DateValue(Text(Parent.Default,"[$-en-US]yyyy-mm-dd"))
Parent.Default
だと時間も含んでしまうので、一回 Text関数で日付だけにして、DateValue関数でDate型に戻しています。
修正方法2 : Update プロパティをいじる
同様に、 Updateプロパティで対応する場合には以下のように書き換えを行います。
DateValue(Text(DateValue1.Value,"[$-en-US]yyyy-mm-dd")) + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)
これで無編集で時間がどんどん進んでしまう事象がおこらなくなりました。
おわり
もう一つはClassicコントロールを有効にするという手もあるんですが、コントロールを入れ替えてかつプロパティを書き換えるというのもなかなか大変なので 割愛しました。
今後修正が入るかもしれませんが、いずれにしてもこの修正を行っておけば回避できるので同じ問題にぶつかったら試してみてください。