OnObjectKeystrokeで「数値だけ」をスマートに入力させるには?
FileMakerで入力画面を作っていると、「このフィールドには数値だけ入れてほしい」「文字や記号が入ると後で集計できなくて困る」といった場面はよくあります。フィールドのオプションで数値フィールドにしておけば、ある程度は防げますが、入力の時点では文字も入力できてしまい、後でエラーが出ることもあります。
こうした「できれば入力の瞬間に間違いを防ぎたい」というニーズにぴったりなのが、スクリプトトリガ「OnObjectKeystroke」です。ここでは、OnObjectKeystrokeを使って数値入力のみを許可する方法を、難しい言い回しをできるだけ避けて紹介します。
OnObjectKeystrokeとは?ざっくりイメージ
OnObjectKeystrokeは、フィールドに対してキーが押された瞬間に反応するスクリプトトリガです。
- ユーザーが数字の「1」を押す
- その直後にスクリプトが動く
- 「このキーは許可する」「このキーはキャンセルする」を判断できる
つまり「押されたキーをチェックして、条件に合わなければ入力自体をなかったことにする」ことができます。これを利用して、0〜9と小数点、バックスペースなどだけを許可するようにすれば、ほとんど数値専用フィールドのように動かせます。
全体の流れを先に確認
やることは次の3ステップです。
- 数値専用にしたいフィールドをレイアウトに配置
- OnObjectKeystroke用のスクリプトを作る
- そのフィールドにスクリプトトリガを設定する
順番に見ていきます。
1. 対象フィールドを準備する
まずは、数値だけを入れたいフィールドを用意します。
- 「管理」メニューから「データベース…」を開きます。
- 「フィールド」タブで、対象テーブルに数値用のフィールド(例:
数量)を作成します。 - タイプは数値にしておくのがおすすめです(必須ではありませんが、後で集計しやすくなります)。
- レイアウトモードで、作成したフィールドをレイアウト上に配置します。
ここまでで、通常の数値フィールドができました。
2. OnObjectKeystroke用スクリプトを作成
次に、キー入力を監視して「数字以外は入力させない」ためのスクリプトを作ります。
- 「スクリプト」メニューから「スクリプトワークスペース」を開きます。
- 新規スクリプトを作成し、名前を例として「数値入力のみ許可_OnObjectKeystroke」のようにします。
中身のイメージは次のようになります(実際の命令名はご利用のバージョン・言語環境に合わせて調整してください)。
// 押されたキーを取得
Set Variable [ $key ; Value: Get ( TriggerKeystroke ) ]
Set Variable [ $code ; Value: Get ( TriggerKeystrokeCode ) ]
// 許可したいキーの条件を定義
// 1. 数字 0〜9
// 2. 小数点(.)
// 3. バックスペース、Delete、Enter、Tab、矢印キー など編集に必要なキー
If [
// 数字か?
PatternCount ( "0123456789" ; $key ) > 0
or
// 小数点か?
$key = "."
or
// バックスペース(WindowsとMacでコードが違う場合があります)
$code = 8
or
// Delete
$code = 127
or
// Enter / Return(※ FileMaker では 10)
$code = 10
or
// Tab
$code = 9
or
// 矢印キー(左右)
$code = -8592 or $code = -8594
]
// 条件に合うキーは許可(=何もしない)
Exit Script [ Result: False ] // False は「イベントをキャンセルしない」
Else
// 条件に合わないキーはキャンセル
Exit Script [ Result: True ] // True は「イベントをキャンセルする」
End If
ポイントは「Exit Script の戻り値」です。OnObjectKeystrokeでは、
- True を返す → そのキー入力をなかったことにする(キャンセル)
- False を返す → 通常通り入力を続ける
というルールになっています。この仕組みを使って、数字など「許可するキー」のときだけ False を返すようにします。
3. フィールドにOnObjectKeystrokeトリガを設定
作成したスクリプトを、対象フィールドのOnObjectKeystrokeに割り当てます。
- レイアウトモードに切り替えます。
- 対象のフィールドを選択します。
- 右クリック(または「フォーマット」メニュー)から「スクリプトトリガの設定…」を開きます。
- 「OnObjectKeystroke」にチェックを入れ、「指定…」ボタンから先ほど作成したスクリプトを選択します。
- OKを押してレイアウトを保存します。
ブラウズモードに戻し、実際に文字を入力しようとしてみてください。数字以外のキーを押してもフィールドに入らなくなっていれば成功です。
よくある工夫と注意点
負の数(マイナス)やカンマを許可したい場合
マイナス記号「-」や「,」を使いたい場合は、スクリプトの条件に追加します。
// マイナス記号を許可
or $key = "-"
// カンマを許可
or $key = ","
このように、欲しい記号だけをピンポイントで許可していくスタイルがおすすめです。
貼り付け操作への対応
OnObjectKeystrokeはキーボードからの入力には強いのですが、「貼り付け(ペースト)」で文字列が一気に入るケースには注意が必要です。確実に数値にしたい場合は、
- OnObjectValidate トリガで「フィールド全体が数値だけか」をチェックする
- 不正な場合はエラーメッセージを表示して元に戻す
といった追加対策を組み合わせるとより安心です。
OSやバージョンによるキーコードの違い
Get ( TriggerKeystrokeCode ) の値は、使用しているOSやバージョンによって多少違いがあることがあります。もしBackspaceやDeleteがうまく判定できない場合は、デバッグ用に
Show Custom Dialog [ "code=" & Get ( TriggerKeystrokeCode ) ]
といったステップを一時的に入れて、実際のコードを確認すると確実です。
OnObjectKeystrokeで入力ミスを「事前に」防ぐ
数値フィールドの定義だけでもエラーはある程度防げますが、「入力しているその場で不正な文字を止める」ことはできません。OnObjectKeystrokeを使えば、
- 入力ミスをその場で防止
- ユーザーが後からエラーに気づいて直す手間を減らせる
- 集計や検索でのトラブルを事前に減らせる
といったメリットがあります。特に、現場での入力件数が多いシステムでは、こうした「ちょっとしたガード」を入れておくだけでも、運用の安定度がぐっと変わってきます。
まずはシンプルな「数字だけ許可」のスクリプトから試し、運用状況を見ながらマイナスやカンマ、小数点など徐々に条件を広げていくと、無理なく導入できます。