現在、スプレットシートで作成した管理表の中から一定の条件のレコードを抽出する処理を実装しております。
その仕様を満たすため、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}
対策をとれておりますが、仕様なのか不具合なのかよくわからないので、質問した所存です。
ご回答いただけると助かります。
以上です。
失礼いたします。
getValuesは表示されたデータを取得するのでシート関数を読みません。
10行のデータのうち、例えば3行目と8行目のstatusがNaNになり、他は完了または未完了ということですよね?
NaNであってundefinedではないのですよね?また、コードは、teratailに貼るときに加工していないのですよね?
>>10行のデータのうち、例えば3行目と8行目のstatusがNaNになり、他は完了または未完了ということですよね?
その通りです。statusの列は全て同じ関数式が入っているのですが、400件以上読込んだ時にいくつかNaNが入り込んでいる形になります。
>>NaNであってundefinedではないのですよね?
はい、undefinedではなく、NaNであります。元のデータを見ましたが、きちんと「未完了」と表示されておりました。
>>コードは、teratailに貼るときに加工していないのですよね?
申し訳ございません、特定のデータだけを抽出するため、クラスの生成はif文の中で行っております。
また、わかりにくくなると思ったので、必要なところのみ記載しておりました。
LoggerでNaNに見えるのですよね。
提示されたコードではNaNになりそうにないです。私レベルでは回答不能です。
>>LoggerでNaNに見えるのですよね。
Loggerでそうなります。
スプレットシートもGASで実装されているJavaScriptも型エラーを起こしやすい方です。
インスタンス生成時に変化する値を直接引数に割り振っているので、型エラーが生じたのかなと思います。
回答1件
あなたの回答
tips
プレビュー