無限地獄

佐野

佐野 2015年5月28日

今回、GoogleAppsScriptに関する事で、
ぶち当たった事があります。

と言うのも、スクリプトは全く同じはずなのですが、
なぜか違う動きをするという奇怪な話です。
DIFFでファイル照合も行いましたが、
本当に、スクリプト自体には違いはありませんでした。

システムの構成としては、スプレッドシートを使用し、
セルに記述された要素を文字列か数値かを判別し、
文字列ならばその行の処理は行わない、数値ならばその行の処理を行い、
さらに数値を加算するというシステムでした。

問題が起きているとすれば、まず自分が作成したスクリプトを疑います。
しかし、何度検証しても、同じスクリプトのはずなのに、違う動きをする・・・
理解不能な動きに翻弄されつつも、ここは発想を切り替えてみる。
if文を対象にブレークポイント(デバッグモード時の一時停止箇所)を設定し、
条件分岐の動き方を観察してみることに・・・

・・・そこで思ったのが、if文に入れている条件に使っている要素は何だろう・・・
と、その予感は当たっていました。

まずは、行処理実行の有無の対象となる列のうち、
セルE9に入力された要素で確認してみようと思います。

20150528133606

まずは、動作するスクリプトで検証。

20150528133230

「Infinity」だと!!?
そんな変数知らねぇよ! ていうか型が「Number」だし!?

そして、もう片方の動作しないスクリプトで検証。

20150528120510

こっちではなんと! 「∞」という文字列として格納されていました。

つまり、スクリプトのエンジン側で、数値と文字列、別々の型で認識していたもようです。

ちなみに、「Number」だった方は「.toString()」メソッドで
文字列にすればいいのではと思いそうですが、
そうすると「infinity」という文字列になるだけで、同じ結果は得られません。

ついでに、こちらはおまけ。
数値「infinity」に対して減算を行い、スプレッドシートに入力した結果・・・

num_ss

数値ではないらしいです!

しかし、一体なぜこのような違いが生まれたのでしょうか。
最近行われたAPIの変更? スプレッドシートの仕様?
いや、おそらくはスプレッドシート側の書式の問題かもしれません。

いずれにせよ、「∞」も機種依存文字の一種であり、
システムで正確な結果を得るためには、使用するべきではないでしょう。

最近ではPCの普及率も高く、技術面でも色々進歩し、
現在流通している、ほとんどの端末では、機種依存文字による文字化けもまずないでしょう。
一応この記事では、「∞」を出力するために「∞」を使っていますが。

それゆえに、機種依存文字の意識も薄れていき、自然と使ってしまっているかもしれません。
しかし、機種依存文字の存在は、クリエイターなら関わり深いものであり、
そうでなくてもITに携わっている人間であれば、多少なりと意識するべきかもしれません。
メールによる文字化けも考えられますし、
今回のようにスプレッドシートやExcel等の書式問題もありますでしょうし・・・

もし「」を入力する事を想定したつくりにするのであれば、
以下のようにif文で識別するのもいいでしょう、

if(num.toString() == "∞" || num.toString() == "infinity"){