~目次~
やったこと
- 特定のセルの値をgetValue()で取得して、その値をもとにIF文を組む。
- なぜかgetValue()で正常に値が取得できなかったので、スプレッドシートでfilter関数を用いてIF文が組めるようにした。
作成コード
作成したコードの一部を載せておく。
// Amazonギフト券が安くなったときに通知する function notification(){ // 通知用のテキストを取得 var text = baseSheet.getRange('P2').getDisplayValue(); // メッセージを送信するかどうかの判定 var flag = baseSheet.getRange('W4').getValue(); // メッセージを送信するかどうかの判定 if(flag != "#N/A"){ // メッセージを送信 var row = getLastRowInColumn(ID_Sheet, 1); var value = ID_Sheet.getRange("A1").getValue(); //送信対象のUserIDを取得して、メッセージを送信 if(value == ""){ return ""; }else{ for(var i = 1; i <= row; i++){ var user_id = ID_Sheet.getRange(i, 1).getValue(); Logger.log(user_id); pushMessage(user_id, text); } } } }
スプレッドシートは以下のような状態。
つまづいたところ
getValue()で取得した値によって、IF文を組んで処理を分岐させようと思ったが、正しくgetValue()で値が取得できなかった。
不具合内容
getValue()で取得した値が、セルの値と違っていた。
セルによっては適切に値が取得できるが、正しく値が取得できないセルもあった。法則性を見出すのも難しかった。
例えば、先程と同じスプレッドシートにおいて、以下のスクリプトを試してみた。
function myFunction() { var id= "1W4frwxxnm7xn0Vv3fKtJcwSPRFDb-yh0-JlW9j0PFrg" var File = SpreadsheetApp.openById(id); var baseSheet = File.getSheetByName("データ取得"); var text = baseSheet.getRange('U4').getDisplayValue(); Logger.log(text); Logger.log(typeof text); }
実行結果は以下。
U4のセルの値を取得しているので、値は1、データ型はnumberが正しい値のはずだが、異なる値を取得している(もしくは、変数にはいってしまっている)。
なお、U4のセルには関数が入っており、関数の内容は以下。特に特殊な関数を使っているわけでもない。
=IFERROR(IF(AND(N4>='条件'!$C$2,N4<='条件'!$C$3,T4>='条件'!$C$4/100),1,0),0)
原因
不明。コードにミスはなかったので、Google Apps Script内部の不具合だと考えられる。
こちら側で対策できることはないと思われる。
また、上記のスプレッドシート関数で集計したデータは、もともとIMPORTHTML関数を用いて取得してきたもの。
IMPORTHTML関数を用いて取得したデータを集計した値に対して、上記の不具合が発生するのかもしれない。
解決策
もともと、実装したい機能としては、
『U2セルの値が1以上のとき、TRUEの処理を行う』というものだった。
U2セルの値が適切に取得できなかったので、FILTER関数を用いて、U列が1のものをW列に出力させた。
W4セルに入れている関数は以下。
=FILTER($T$3:$T,$U$3:$U = 1)
FILTER関数は、条件を満たすものがなかった場合、以下の画像のように「#N/A」が返ってくるので、
『W4セルが#N/Aでないとき、TRUEの処理を行う』というIF文を組んだ。
なお、#N/AはgetValue()で値を取得できた。
やってみた感想
Google Apps Scriptでは、こういうワケのわからんエラーが出たりするのか。
Google Apps ScriptはサーバーレスでWebアプリが開発できる分、内部で起こっているエラーに対応できないということが起きやすいのかもしれない。
しかし、今回の不具合は改善されるのだろうか…。
その他参考記事
Google Apps Script試行錯誤Blog: データの型を取得する
Google Apps Script試行錯誤Blog: 値を取得するメソッドは getValue() と getDisplayValue() がある
コメント