AppSheet実践編シリーズ⑥~AppSheetにおける入力チェックが全てわかる!(後編)~
はじめに
こんにちは。ソシオネットの髭晩酌です。前回のブログの冒頭で「コロッケそば」の話を書きました。駅のホームなど改札内ある立ち食いそば屋さんはきっと美味しいはず!と勝手に思っているのは私だけでしょうか??改札内に立ち食いそば屋がある駅に行く際はなるべく行きたいのですが、使う鉄道会社が異なると立ち寄れないのが少し残念です。さすがに、そのためだけに入場券は買わないので。。(中途半端なそば好きです。。)
ということで、さっそく前回の続きとなる入力チェックの後編を始めましょう!
なお、本ブログの画面説明は前回同様「improved editor」モードにて説明していきます。
日付が特定の範囲かどうかのチェック
さて後編の一つ目のお話は、DATE型のデータにおける日付のチェックです。前回書いた数値のチェックと似ていますが、業務上のユースケース考えると日付に関してはいろんなチェックのパターンがありそうです。
例1:2022年の日付のみ許可する場合
まず数値の時と同じように、基本的な特定の範囲の日付かどうかのチェックを見ていきます。数値と違い「Maximum value」「Minimum value」のような設定はないので、潔く「Valid If」を使いましょう!
この場合の実装としては、以下のいずれを「Valid If」に設定しても同じ結果を得ることができます。
AND(
[_THIS] >= DATE("2022/1/1"),
[_THIS] <= DATE("2022/12/31")
)
YEAR([_THIS])= "2022"
例2:現在日の翌年以降の日付のみ許可する場合
以下を「Valid If」に設定します。
YEAR([_THIS]) > YEAR(TODAY())
例3:現在日の翌月以降の日付のみ許可する場合
以下を「Valid If」に設定します。
[_THIS] >= EOMONTH(TODAY(),0) + 1
ここで出てくるEOMONTH関数ですが、End Of MONTH の略だそうです。文字通り、月末の日付を取得する関数です。第一引数には日付、第二引数には第一引数から見た月数の差を設定しましょう。
上記の例の場合、第二引数が「0」のためEOMONTH関数では今日が所属する月の月末日付を取得しています。それに「1」日を加えているので、右辺は翌月1日を意味しています。
ちなみに、「例2をマネして以下だとダメなの?」と思った方もいるかもしれません。
が、これだと、年が変わって月が1月に戻ったときにチェックをすり抜けてしまうのでNGです。このロジックを生かすならAND条件で年の条件も入れる必要がありますが、前述のEOMONTH関数を使うやり方のほうが簡単ですね。
MONTH([_THIS]) > MONTH(TODAY())
※NGの例です!!
例4:現在日の翌週月曜以降の日付のみ
以下を「Valid If」に設定します。
[_THIS] >= EOWEEK(TODAY()) + 2
はい、前述のEOMONTHと似たような関数が出てきましたね。このEOWEEK関数ですが、End Of WEEK の略だそうで、週末の日付を取得する関数です。なお、AppSheetの世界では週末は土曜日らしいです。
ということで上記の例だと、右辺は今週土曜日に「2」日を加えているので翌週月曜日を意味することになります。
よくある日付のチェックパターンの説明は以上となります。
入力値が決まった文字数以内かどうかのチェック
続いて、入力値の文字数チェックです。これは文字列に含まれる文字数を返すLEN関数を使えば簡単です。
例えば、5文字以内の文字列で入力させたい場合は、以下を「Valid If」に設定してください。
LEN([_THIS]) <= 5
ちなみに、似たようなチェックで「決まったバイト数以内かどうかのチェック」をかけたい場合があると思います。入力したデータを用いて後続のシステムに登録する際に、後続システム側で入力バイト数に制限がある場合などでよく出てきますね。
ただAppSheetでバイト数を返す関数がないため、この実装は一筋縄ではいかないようです。というか正直、筆者にはいいやり方が思いつきませんでした。。。
AppSheetでもLENB関数のような関数の実装が待たれるところです。
特定の文字のみで入力されているかのチェック
これも業務でよく出てくるチェックですね。TEXT型の入力欄で「半角カナでのみ入力させたい」や「銀行関連システムにおいて全銀仕様で使用可能文字だけで入力させたい」などの要件はよくあるかと思います。
では、まず一番簡単な例として、小文字の「a」のみ許可する場合の「Valid If」の設定を見ていきましょう。
LEN(
SUBSTITUTE(
[_THIS],
"a",
""
)
)
=0
こちらの意味については、以下のように関数を分解して解説していきます。
最初に①の部分についてですが、まずSUBSTITUTE関数の説明をします。Excelなどでも同名の関数があるためもうご存じの方もいるかもしれませんが、文字列中の指定した文字を新しい文字で置き換える関数です。 第一引数に元の文字列、第二引数に検索文字列、第三引数に置換文字列を渡すことにより、元の文字列の中にある検索文字列を置換文字列に置き換えます。
よって①の部分では、入力した文字列の中から「a」を探してブランクに置換した文字列が返ることになります。
次に②の部分です。LEN関数は前述の通り引数文字列の文字数を返す関数です。つまり②の部分では①で置換した結果の文字数が0であればTrueを返す、ということになります。
よって全体としては、入力した文字列から「a」を取り除いた結果の文字列の文字数が「0」、つまり「a」しか含まれていない文字列であればTrueを返します。
逆に「a」以外の文字列が含まれていた場合は、入力した文字列から「a」を取り除いた結果の文字列の文字数が「0」にならないため、Falseとなります。
ここまでが一番簡単な例の説明でした。
次は、「a」「b」のみ許可する場合となります。
かなり冗長的な書き方ですが、以下を「Valid If」に設定します。※大変なのでここからは一部インデントを端折ります。。。
LEN(
SUBSTITUTE(SUBSTITUTE([_THIS],"a",""),"b","")
)
=0
かなり力技ですが、「a」を取り除くSUBSTITUTE関数を「b」を取り除くSUBSTITUTE関数の中に入れて、最後にLEN関数で文字数を判断する、というやり方です。
ということで、使用可能とする文字がたくさんある場合は、上記の例と同じようにSUBSTITUTE関数をどんどん入れ子にするという強引なやり方で対応できます。
まあ、力技、とか、強引、とかネガティブなワードを書きましたが、個人的には、誰もが知っている関数でシンプルに実装するのが後から見直すと一番わかりやすいと思ってます。シンプルイズベストです!
終わりに
本ブログでは、Appsheetにおいて入力チェックをする方法を前後編の2回に分けて紹介しました。
以下のブログでも書きましたが、登録されたデータの利活用の観点で考えると、ダーティデータの生成はできるだけ防がなければなりません。そのためには今回のブログにご紹介したような入力チェックを実装するのが王道かと思います。
せっかくアプリからデータを入力したのに、後から誰か他の人に「このデータではダメなので入力し直してください!」と言われたら、アプリを使う気をなくしてしまいます。
そうならないように、アプリの入力画面上に適切な入力チェックを実装してユーザの二度手間を防いでいくようにしましょう。
ということで、今回のブログは以上となります。ではまた次回ブログでお会いしましょう!ルネッサーンス!!
AppSheet勉強会を開催しております
弊社主催のAppSheet勉強会を毎月開催しております。6月~7月開催分のお申込みは以下からお願いいたします。
6/20(火)【毎月第3火曜開催】AppSheetでかんたんアプリ開発!~実践編~/途中入退場可 | Peatix
7/11(火)【毎月第2火曜開催】Appsheetを知ろう!初心者向けかんたんハンズオン勉強会! | Peatix
IT内製化支援、Salesforceの運用・導入、DX化推進に関するご相談をお待ちしております
弊社では、ノーコード開発アプリを用いたIT内製化支援、Salesforceの運用・導入、および、DX化推進に関するご相談を承っております。お気軽に弊社お問い合わせサイトよりご相談などをお寄せいただければと思います。
ソシオネットHP:http://www.socionet.co.jp/
IT内製化支援支援サービス:https://socionet.co.jp/insourcing-support-service/
Salesforce最適化支援サービス:https://socionet.co.jp/salesforce-service/
DXサポーターズ特設サイト:https://socionet.co.jp/dx-supporters/
お問い合わせ:https://socionet.co.jp/contact/