質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1565閲覧

関数式で表示された文字列をNaNと誤認することはありますか?

zigutabi

総合スコア57

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2020/01/08 05:51

編集2020/01/08 12:03

現在、スプレットシートで作成した管理表の中から一定の条件のレコードを抽出する処理を実装しております。
その仕様を満たすため、Personクラスを生成し、それからgetRangeメソッドでデータ一覧を取得します。次にループ内でクラス生成用のメソッドを実行しておりました。
コードは以下の通りになります。

GoogleAppsScript

1 2var Person = function(id, name, status){ 3 this.id = id; 4 this.name = name; 5 this.status = status; 6} 7 8function myfunc(){ 9 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); 10 var dataList = sheet.getRange(1,1,10,10).getValues(); 11 var list = []; 12 for (var data in dataList) { 13 var man = {} 14 man = makePerson(dataList[data]); 15 list.push(man); 16 } 17 Logger.log(list); 18} 19 20var makePerson = function(data){ 21 // レコードから必要なデータのみ抽出 22 if(data[9] === '未完了'){ 23 person = new Person(data[5], data[3], data[9]); 24 return person; 25 } 26}

ログを確認したところ、そのうち、3つ目のデータ(data[9])に「NaN」が入っておりました。
原因はよくわからず、元データのスプレットシートをみたところ、以下の関数式が入っておりました。

=IF(AND(セル1<>"",セル2<>"",セル3<>""),"完了","未完了") /* セルの座標が直接入力されていたのでモック化 */

この結果をLogger.logで確認したところ、
ほとんどがきちんと"完了"、"未完了"が表示されますが、中にはNaNが入っている状態でした。
これはセル内の関数式を誤って認識してしまったからでしょうか。
以下の対策を行ったところ、症状がみられなくなりました。

GoogleAppsScript

1var makePerson = function(data){ 2 var id = 0; 3 var name = ""; 4 var status = ""; 5 6 id = data[5]; 7 name = data[3]; 8 status = data[9]; 9 10 // レコードから必要なデータのみ抽出 11 if(data[9] === '未完了'){ 12 id = data[5]; 13 name = data[3]; 14 status = data[9]; 15 person = new Person(id, name, status); 16 return person; 17 } 18}

対策をとれておりますが、仕様なのか不具合なのかよくわからないので、質問した所存です。
ご回答いただけると助かります。

以上です。
失礼いたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2020/01/08 09:21

getValuesは表示されたデータを取得するのでシート関数を読みません。 10行のデータのうち、例えば3行目と8行目のstatusがNaNになり、他は完了または未完了ということですよね? NaNであってundefinedではないのですよね?また、コードは、teratailに貼るときに加工していないのですよね?
zigutabi

2020/01/08 09:29

>>10行のデータのうち、例えば3行目と8行目のstatusがNaNになり、他は完了または未完了ということですよね? その通りです。statusの列は全て同じ関数式が入っているのですが、400件以上読込んだ時にいくつかNaNが入り込んでいる形になります。 >>NaNであってundefinedではないのですよね? はい、undefinedではなく、NaNであります。元のデータを見ましたが、きちんと「未完了」と表示されておりました。 >>コードは、teratailに貼るときに加工していないのですよね? 申し訳ございません、特定のデータだけを抽出するため、クラスの生成はif文の中で行っております。 また、わかりにくくなると思ったので、必要なところのみ記載しておりました。
papinianus

2020/01/08 09:53 編集

LoggerでNaNに見えるのですよね。 提示されたコードではNaNになりそうにないです。私レベルでは回答不能です。
zigutabi

2020/01/08 12:00

>>LoggerでNaNに見えるのですよね。 Loggerでそうなります。 スプレットシートもGASで実装されているJavaScriptも型エラーを起こしやすい方です。 インスタンス生成時に変化する値を直接引数に割り振っているので、型エラーが生じたのかなと思います。
guest

回答1

0

自己解決

調べたところ仕様とのことでした。
そのため、セルに関数式を直接挿入するのではなく、変数を挟んで実行した方が無難だそうです。

投稿2020/01/22 07:07

zigutabi

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問