AppSheet 入力値のバイト数チェック(シフトJIS連携)

AppSheet 入力値のバイト数チェック(シフトJIS連携)

はじめに注意事項

かなりニッチな話ですが、せっかくなので記事にしました。

初めに結論から申し上げますと、AppSheetの機能のみでバイト数チェックはかなり困難です。

この記事は、連携先システムの文字コードが「シフトJIS」場合に限定されます。

UTF-8のみなさま、期待させていたらごめんなさい。もしUTF-8での実現方式をご存じの方は、逆に教えて頂けると嬉しいです。

バイト数をチェックする関数

文字数であれば、len関数で簡単にカウントが可能です。

例えば「摘要(社外)」を今回のチェック対象とする場合は、

len([摘要(社外)])

で求められます。

一方、バイト数をチェックする関数は、AppSheetにはありません。(2024/10月時点)

そのため、自前で用意する必要があります。

文字コードとバイト数

簡単に文字コードとバイト数についてです。

シフトJISでは,1文字のバイト数は半角1バイト,全角2バイトと決まっていますが,Unicodeでは,1文字のバイト数は文字によって異なります。

そのため、Unicodeでは文字ごとにバイト数を判定する必要があるため、私は断念しております。

以降、この記事は、シフトJISの場合、つまり「1文字のバイト数」が、

  • 「半角」は「1バイト」
  • 「全角」は「2バイト」

の場合になります。

おそらくバイト数を意識するのは、基幹システムなどのレガシーなシステムにデータ連携する場合だと思います。相手先の文字コードが何かは、事前に問合せして確認しておきましょう。

チェックするための計算式

SJIS前提でバイト数を算出する数式を考えます。

[バイト数] = [全角文字数]×2 + [半角文字数]×1

です。

しかし、残念ながら入力文字が「全角」「半角」のどちらか?を判定する関数もありません。

そこで、入力された文字から半角を消すことで、全角文字数を出すことにします。なぜ半角文字を消すかというと、全角文字より半角文字の方が少ないからです。

文字コード(日本語漢字コード表)http://charset.7jp.net/sjis.html

あらためて、SJIS前提でバイト数を算出する数式を考えます。

[バイト数] = [全角文字数]×2 + [半角文字数]×1
     = [全角文字数]×2 + ([入力文字数] - [全角文字数]) ×1
     = [全角文字数] + [入力文字数]

以上から、バイト数は以下の式から求めることができることが分かります。

[バイト数]  = [全角文字数] + [入力文字数]

「全角文字数」・「入力文字数」の求め方

①[入力文字数]

これは簡単で、以下の通りです。

len([摘要(社外)])

②[全角文字数]

こっちらは、先ほどの通り半角文字を削除して求めます。文字列から特定の文字を消す方法は、SUBSTITUE()関数を使えば簡単です。

ただし1点問題があり、削除する半角文字数が多すぎるためネストが深くなりすぎ、AppSheetの制限を超えてしまいます。

そのため半角文字の削除は、「半角英数字」「半角カタカナ」の2段階で分けて実施します。イメージとしては、

[全角文字数] = SUBSTITUE([入力文字],[半角文字],"")
       = SUBSTITUE(SUBSTITUE([入力文字],[半角英数字],""),[半角カタカナ],"")

今回は、以下の2つの項目をテーブルに追加します。

バイト数計算用_半角英字削除入力文字([摘要(社外)])から半角英数字が削除された状態
バイト数計算用_ASCII削除入力文字([摘要(社外)])から半角英数字・半角カタカナが削除された状態(つまり、全角文字のみ)

それぞれの「Formula」には以下の数式を入力します。

バイト数計算用_半角英字削除
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE([摘要(社外)],"!",""),"""",""),"#",""),"$",""),"%",""),"&",""),"",""),"(",""),")",""),"*",""),"+",""),",",""),"-",""),".",""),"/",""),"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),":",""),";",""),"<",""),"=",""),">",""),"?",""),"@",""),"A",""),"B",""),"C",""),"D",""),"E",""),"F",""),"G",""),"H",""),"I",""),"J",""),"K",""),"L",""),"M",""),"N",""),"O",""),"P",""),"Q",""),"R",""),"S",""),"T",""),"U",""),"V",""),"W",""),"X",""),"Y",""),"Z",""),"[",""),"\",""),"]",""),"^",""),"_",""),"`",""),"a",""),"b",""),"c",""),"d",""),"e",""),"f",""),"g",""),"h",""),"i",""),"j",""),"k",""),"l",""),"m",""),"n",""),"o",""),"p",""),"q",""),"r",""),"s",""),"t",""),"u",""),"v",""),"w",""),"x",""),"y",""),"z",""),"{",""),"|",""),"}",""),"~","")
バイト数計算用_ASCII削除
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE([バイト数計算用_半角英字削除],"。",""),"「",""),"」",""),"、",""),"・",""),"ヲ",""),"ァ",""),"ィ",""),"ゥ",""),"ェ",""),"ォ",""),"ャ",""),"ュ",""),"ョ",""),"ッ",""),"ー",""),"ア",""),"イ",""),"ウ",""),"エ",""),"オ",""),"カ",""),"キ",""),"ク",""),"ケ",""),"コ",""),"サ",""),"シ",""),"ス",""),"セ",""),"ソ",""),"タ",""),"チ",""),"ツ",""),"テ",""),"ト",""),"ナ",""),"ニ",""),"ヌ",""),"ネ",""),"ノ",""),"ハ",""),"ヒ",""),"フ",""),"ヘ",""),"ホ",""),"マ",""),"ミ",""),"ム",""),"メ",""),"モ",""),"ヤ",""),"ユ",""),"ヨ",""),"ラ",""),"リ",""),"ル",""),"レ",""),"ロ",""),"ワ",""),"ン",""),"゙",""),"゚","")

チェック処理の追加

そして最後に、文字数のチェック処理を追加します。バイト数は以下の計算式から求められるので、

[バイト数] = [全角文字数] + [入力文字数]

20バイト以上の場合にエラーとしたい場合は、以下の数式で求めることが可能です。

len([_this]) + len([バイト数計算用_ASCII削除]) <=20

以上となります。

まとめ

基幹系システム側で、入力文字数×3くらいのバイト数を確保してくれれば良いのにな。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です