序
以下の画像のように、特定の条件を満たした時だけ送信ボタンを押せるようにしたい時の手順についてまとめました。
ポイントは「一気に実装しようとしない」です。まず、どういう時にボタンを押させたくないのかを箇条書きで言語化してみると分かりやすいです。
今回は、次の条件を満たした時だけボタンを押せるようにします:
- 当日午前11時以降はボタンを押させない
- ただし、翌日分の入力は可能
- 日付選択が今日よりも前の日付になっている場合、ボタンは押させない
- テキスト入力ボックスが空欄の場合はボタンを押させない
これらを1つずつ実装したあと、それぞれを連結させていくイメージで完成に導くとよいと思います。
1. 表示モード(DisplayMode)の種類
まずは、表示モードについておさらいします。表示モードとは、配置した部品(=コントロール)を「使える状態」にするか「押せない状態」にするか「見るだけ」にするのかを決める設定です。英語では "DisplayMode" と表現されます。
上の画像のように、未設定のままだと、画面上部の "DisplayMode" には DisplayMode.Edit という数式が入力されており、画面右側(プロパティ)の「表示モード」には「編集」という設定になっています。表にすると次のとおりです。
| DisplayMode | 状態 | ボタンの場合 | 入力欄の場合 |
|---|---|---|---|
DisplayMode.Edit |
操作できる状態 | 押せる | 入力、編集できる |
DisplayMode.Disabled |
操作できない状態 | 押せない | 入力、編集できない |
DisplayMode.View |
表示専用の状態 | 押せない | 入力、編集できない |
当記事を参考に、任意の部品を配置して、実際に各モードを切り替えてみると動きが分かりやすいと思います。
2. テキスト入力ボックスに入力がなかったら押せないようにする
早速ですが、ボタンとテキスト入力ボックスを1つずつ配置して、まずはテキスト入力ボックスに入力がなかった時だけ「送信」を押せないように制御してみましょう。
2.1. テキスト入力ボックス(TextInput1)の設定
「テキスト入力」を配置したら「アプリを開いたときに入力されている情報」について設定します。この情報を「既定(既定値)」といい、英語では Default プロパティと呼ばれています。
今回は、ユーザーがアプリを開いた時点では、何も入力されていて欲しくないので、配置時点で設定されている「"テキスト入力"」を削除しておきます。
2.2. ボタン(Button1)の設定
次に、ボタンの表示モードを、テキスト入力(TextInput1)の入力内容が空だった時(=何も入力されていなかった時)だけ「DisplayMode.Disabled(無効)」に設定します。
今回は、少し長めの数式を書いて制御するので、画面上部の数式バーを使って設定を行います。上の画像を参考に、DisplayMode に切り替えておきます(※単に「編集」か「無効」か「表示」かを設定したい場合は右側のプロパティで設定すればOKです)
DisplayMode プロパティの数式バーに「TextInput1 の入力がなかったら、DisplayMode.Disabled、入力があったら DisplayMode.Edit」という意味の数式を入力します。
If(IsBlank(TextInput1.Text),DisplayMode.Disabled,DisplayMode.Edit)
この時の IsBlank ( TextInput1.Text ) は、()でくくった部品が「空」か「空でないか」を判定するための数式です。入力した数式を図解すると次のようになります。
実際に、アプリの動きを確認してみると、何か入力をした時だけボタンが押せるようになりました。反対に、何も入力しなかったり、入力内容を消したりした場合は、ボタンが押せなくなりました。
3. 当日よりも前の日付だったら押せないようにする
この調子で、当日よりも前の日付をユーザーが選択していた場合の処理を考えてみます。
3.1. 日付の選択(DatePicker1)の設定
ボタンはそのままで大丈夫なので、今度は「日付の選択(英:DatePicker)」を配置します。
配置したら、上の画像を参考に、DefaultDate プロパティに切り替えて Today() を数式バーに入力します。すると、操作時点の年月日が表示されます(※ 記事の執筆時点が2026年6月17日なので、読者の方の画面とは異なります)
Today()
3.2. ボタンの設定
今日の日付を既定値として設定できたら、ボタン(Button1)の DisplayMode プロパティの設定に移ります。先ほど(2.2.)で入力しておいた数式の先頭にマウスカーソルを立てて、半角英数字の「スラッシュ」を2つ入力します。
この機能を「コメントアウト」といい、今回のように複雑な数式を入力する時など、メモ書きとして残しておくことができて便利です。
そのコメントの下に、改行で移動して「今日の日付よりも過去だったら、表示モードを無効にする」という意味の数式を入力します。
If(DatePicker1.SelectedDate < Today(), DisplayMode.Disabled,DisplayMode.Edit)
先ほど「テキスト入力(TextInput1)」が空だった際に、ボタン(Button1)に設定した If 関数の内、条件の部分が変わっただけです。図解すると次のとおりです。
数式の入力が終わったら、アプリを実行して動作を確認してみましょう。今日よりも前の日付を選んだ時と今日以降の日付をそれぞれ入力してみると分かりやすいです(※記事では上部に日付を表示していますが不要です)
なお、条件によって様々な制御ができます。以下を参考にするとアプリをより便利にできるかもしれません。この記号のことを「演算子」といいます。
| 演算子 | 意味 | 用例 |
|---|---|---|
< |
左側の値が右側の値より小さい(過去の)場合に true になる | DatePicker1.SelectedDate < Today() |
> |
左側の値が右側の値より大きい(未来の)場合に true になる | DatePicker1.SelectedDate > Today() |
<= |
左側の値が右側の値以下の場合に true になる | DatePicker1.SelectedDate <= Today() |
>= |
左側の値が右側の値以上の場合に true になる | DatePicker1.SelectedDate >= Today() |
= |
左側の値と右側の値が同じ場合に true になる | DatePicker1.SelectedDate = Today() |
<> |
左側の値と右側の値が異なる場合に true になる | DatePicker1.SelectedDate <> Today() |
4. 選択した日付の11時以降は押せないようにする
今度は、選択した日付の11時以降はボタンを押せないように設定します。この設定は、先ほどの設定の応用となります。「選択した日付の11時以降」をもっと噛み砕いて考える必要があります。
4.1. 選択した日付の11時以降...とは
以下の画像で表示されているように、日付選択で選ばれる日付には「11:00:00」という時刻の情報まで含まれていません。より正確に言うと「2026年06月17日 00時00分00秒」という情報の内、年月日の情報だけが表示されている状態です。
したがって、この状態から「11時00分」を判別するためには、選択した日付に「11時間」を加算して、選択した日付の11:00を作る必要があります。その日時と、現在の日時を比較することで、現在日時が選択した日付の11:00以降であれば、ボタンを押せないように設定できます。図解すると次のとおりです。
ただ、このままだと「現在時刻が11時以降かどうか」を判定しているだけです。「選択された日付が今日よりも過去かどうか」までは判定されていません。そのため、この数式に「今日の日付と一致する」を付け加えます。
以上で「選択した日付の11時以降」は表現できました。しかし、「選択した日付が過去のものかどうか」を判定できていません。さらに、以下の数式を付け加える必要があります。
あとは、上の画像で整理した日本語を、Power Apps の数式で表現すれば「選択した日付の11時以降」はボタンを押せない設定を実現できます。
4.2. 現在日時を取得する
Today 関数は、アプリを開いた時点の「日付」を表示する関数でした。アプリを開いた時点の「日付」に加えて「時刻」も取得したい場合は、Now 関数を使用します。
適当なラベル(あとで削除するラベル)に Now 関数を入力してみると、関数の入力時点の日時データを表示できることが分かります。この値と「今日の日付 + 11時間」を比較して、11時00分を超えていないかを判断します。
4.3. 今日の日付 + 11時間 を取得する
4.1. にて、Today 関数で得られる日付データは「年月日 00時00分00秒」であると述べましたが、この日付データに対して DateAdd 関数を使用することで時刻のデータを加えられます。
今回は 11 時間追加したいので、DateAdd 関数の設定内容は上の画像のとおりです。反対に11時間減らしたい場合は、-11 のように、マイナス値を設定すれば実現できます。
| 指定する単位 | 意味 | 例 |
|---|---|---|
TimeUnit.Minutes |
分を加算する | DateAdd(Now(), 30, TimeUnit.Minutes) |
TimeUnit.Hours |
時間を加算する | DateAdd(Today(), 11, TimeUnit.Hours) |
TimeUnit.Days |
日を加算する | DateAdd(Today(), 1, TimeUnit.Days) |
TimeUnit.Months |
月を加算する | DateAdd(Today(), 1, TimeUnit.Months) |
また、図解にある ③ の TimeUnit.Hours は「時間(Hour)」を意味しています。一般的なものを上の表でまとめましたので、よろしければご参考ください。
4.4. ボタンの設定
さて、これで「選択した日付の11時以降」を Power Apps の数式で表す準備ができました。あとは、これらを組み合わせていきます。数式は、以下の 3.2. で DisplayMode プロパティに設定したものをベースにします。
If(DatePicker1.SelectedDate < Today(), DisplayMode.Disabled,DisplayMode.Edit)
この数式の「条件」を設定する部分に「選択された日付が今日の日付かつ11時以降であるか、または、選択された日付が今日の日付よりも過去かどうか」を判定する数式を追記します。
数式の全体像は以下のとおりです。
If(
DatePicker1.SelectedDate < Today() ||
(
DatePicker1.SelectedDate = Today() &&
Now() >= DateAdd(Today(), 11, TimeUnit.Hours)
),
DisplayMode.Disabled,
DisplayMode.Edit
)
数式を設定できたら、結果をそれぞれ見てみましょう。過去の日付、今日の日付で11時以降では押せませんが、翌日のデータは(11時よりも前なので)入力できるようになりました。
なお、今回の数式の設定時に、&& や || という記号が出てきました。関数を使ってもいないのに()が登場したりもしました。Power Apps は、こういった記号を使用することで、より複雑な条件を設定できます。
| 演算子 | 読み方 | 意味 | 例 |
|---|---|---|---|
&& |
かつ | 左右の条件がどちらも true の場合に true になる | DatePicker1.SelectedDate = Today() && Now() >= DateAdd(Today(), 11, TimeUnit.Hours) |
|| |
または | 左右の条件のどちらか一方でも true の場合に true になる | `IsBlank(TextInput1.Text) |
! |
ではない | 条件の true / false を反対にする | !IsBlank(TextInput1.Text) |
()で数式を囲むのは、曖昧性を除くためです。考え方は算数の計算と同じです。
2 × 2 +(1 + 1)
上の計算式を例にすると、優先して計算しなければならないのは(1 + 1)なので、解答は6です。これが、2 ×(2 + 1 + 1)という数式になっていた場合の解答は8です。プログラミングでも同じで、優先して処理する必要のあるものを()で囲むルールがあります。
DatePicker1.SelectedDate < Today() ||
(
DatePicker1.SelectedDate = Today() &&
Now() >= DateAdd(Today(), 11, TimeUnit.Hours)
)
今回の条件だと()が外れていても大きな問題はないかもしれませんが「選択された日付が今日よりも過去ではない11時以降」言い換えると「選択された日付が今日、かつ、現在時刻は11時以降」となります。
ここに、過去の日付が選択されていた時の条件を OR で結ぶことによって「選択された日付が今日よりも過去ではない11時以降」を実現しているので()で囲っておくと安心です。
5. 全ての数式を組み合わせる
最後に、これまで作成してきた数式を、ボタン(Button1)の DisplayMode プロパティにまとめて作業終了です。まとめるときも、&& や || の記号を活用します。
最終的に、Button1 の DisplayMode プロパティに入力される数式は以下のとおりです。
If(
IsBlank(TextInput1.Text) ||
DatePicker1.SelectedDate < Today() ||
(DatePicker1.SelectedDate = Today() && Now() >= DateAdd(Today(),11,TimeUnit.Hours)),
DisplayMode.Disabled,
DisplayMode.Edit
)
結
Power Apps のボタンを条件によって押せないようにする方法を紹介しました。
ボタンを押せるかどうかの制御は、ボタンの DisplayMode プロパティで制御できます。DisplayMode.Edit(編集)を指定するとボタンを押せる状態になり、DisplayMode.Disabled(無効)を指定するとボタンを押せない状態になります。
- 個数が入力されていない
- 選択した日付が今日より前
- 選択した日付が今日で、現在時刻が11時以降
という条件で数式を書く場合、If 関数や演算子を組み合わせることで、これらの条件を制御できるようになります。ボタンを押した後にエラーを表示するだけでなく、そもそも押せない状態にしておくことで、利用者の誤操作を防ぎやすくなる利点があるといえるでしょう。
考え方として、ボタンの制御では 「どの条件なら押せないようにするか」 を先に日本語で整理し、それを Power Apps の数式に置き換えていくと考えやすくなります。
余談 : Now 関数の挙動について考える
ここまでの説明では、Now 関数を使って「現在時刻が11時以降かどうか」を判定しました。
ただし、厳密にいうと、Now() は時計のように常に画面上で自動更新され続けるものではありません。Now() は、式が発動したタイミング(今回だとアプリ起動時)の現在日時を取得します。
そのため、例えば、10時59分にアプリを開いたまま何も操作せず、11時00分を過ぎた場合、画面上のボタンの状態がその瞬間に必ず切り替わるとは限らない点に注意が必要です。
今回のような簡易的な制御であれば、この書き方で問題になるケースはそう多くないと思います。一方で「11時00分になった瞬間にボタンを無効化したい」という厳密な制御が必要な場合は、Timer コントロールを使って定期的に現在時刻を変数へ入れ直す、といった実装が必要です。
その際は、Timer コントロールの OnTimerEnd に次のような式を設定します。
Set(gblNow, Now())
その上で、ボタンの DisplayMode に設定した数式内では Now() の代わりに gblNow を使います。
以上、余談でした。




















