無限地獄
今回、GoogleAppsScriptに関する事で、
ぶち当たった事があります。
と言うのも、スクリプトは全く同じはずなのですが、
なぜか違う動きをするという奇怪な話です。
DIFFでファイル照合も行いましたが、
本当に、スクリプト自体には違いはありませんでした。
システムの構成としては、スプレッドシートを使用し、
セルに記述された要素を文字列か数値かを判別し、
文字列ならばその行の処理は行わない、数値ならばその行の処理を行い、
さらに数値を加算するというシステムでした。
問題が起きているとすれば、まず自分が作成したスクリプトを疑います。
しかし、何度検証しても、同じスクリプトのはずなのに、違う動きをする・・・
理解不能な動きに翻弄されつつも、ここは発想を切り替えてみる。
if文を対象にブレークポイント(デバッグモード時の一時停止箇所)を設定し、
条件分岐の動き方を観察してみることに・・・
・・・そこで思ったのが、if文に入れている条件に使っている要素は何だろう・・・
と、その予感は当たっていました。
まずは、行処理実行の有無の対象となる列のうち、
セルE9に入力された要素で確認してみようと思います。
まずは、動作するスクリプトで検証。
「Infinity」だと!!?
そんな変数知らねぇよ! ていうか型が「Number」だし!?
そして、もう片方の動作しないスクリプトで検証。
こっちではなんと! 「∞」という文字列として格納されていました。
つまり、スクリプトのエンジン側で、数値と文字列、別々の型で認識していたもようです。
ちなみに、「Number」だった方は「.toString()」メソッドで
文字列にすればいいのではと思いそうですが、
そうすると「infinity」という文字列になるだけで、同じ結果は得られません。
ついでに、こちらはおまけ。
数値「infinity」に対して減算を行い、スプレッドシートに入力した結果・・・
数値ではないらしいです!
しかし、一体なぜこのような違いが生まれたのでしょうか。
最近行われたAPIの変更? スプレッドシートの仕様?
いや、おそらくはスプレッドシート側の書式の問題かもしれません。
いずれにせよ、「∞」も機種依存文字の一種であり、
システムで正確な結果を得るためには、使用するべきではないでしょう。
最近ではPCの普及率も高く、技術面でも色々進歩し、
現在流通している、ほとんどの端末では、機種依存文字による文字化けもまずないでしょう。
一応この記事では、「∞」を出力するために「∞」を使っていますが。
それゆえに、機種依存文字の意識も薄れていき、自然と使ってしまっているかもしれません。
しかし、機種依存文字の存在は、クリエイターなら関わり深いものであり、
そうでなくてもITに携わっている人間であれば、多少なりと意識するべきかもしれません。
メールによる文字化けも考えられますし、
今回のようにスプレッドシートやExcel等の書式問題もありますでしょうし・・・
もし「」を入力する事を想定したつくりにするのであれば、
以下のようにif文で識別するのもいいでしょう、
if(num.toString() == "∞" || num.toString() == "infinity"){