はじめに注意事項
かなりニッチな話ですが、せっかくなので記事にしました。
初めに結論から申し上げますと、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くらいのバイト数を確保してくれれば良いのにな。
コメントを残す