Google Apps ScriptでgetValue()すると、セルの値と取得した値がずれてるんだが。

~目次~

  1. やったこと
    1. 作成コード
  2. つまづいたところ
    1. 不具合内容
    2. 原因
    3. 解決策
  3. やってみた感想
  4. その他参考記事

やったこと

  • 特定のセルの値を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() がある

コメント

タイトルとURLをコピーしました