getValuesでスプレッドシートの値を取得しようとした際に、
・値が取得できない
・取得した値が想定していたものと違う
という状況に遭遇した場合について、このページでは記載しています。
※このページの内容は、GASの利用 ~Webアプリでスプレッドシートの値を表示する~の続きで書いているので、どのような処理をしているのか詳細は、こちらのページで確認してください。
Googleスプレッドシートの値を取得する際に、GASでは、getValuesとgetDisplayValuesという2種類の方法がありますが、それぞれで取得できる値が変化します。
どのように変化するか、以下のようなファイルを読み込ませた結果を記載します。
※ここではA3セルには“=A1”という値を、B3セルには“=B2”という値を入れています
※A7とA8には“true”,“false”とそれぞれ書きましたが、自動で大文字変換と中央配置の処理がされています。
この状態でgetValuesで実行すると、処理は正常に動作しても、クライアント側にはnullが渡されてしまいます。
しかし、GAS側のreturnの内容をログに書き出すようにしてみると、
ここで、注目したいのは、A5セル、B5セルの値がどのように処理されているかです。
本来であれば、そのままの日付と時刻のような感じで表示されるはずが、“日付型の値”として処理されてしまっています。
この日付の処理が問題となります。
※他にも問題となるケースがあるかもしれませんが、ここでは触れません。
ちなみに、日付の入った5行目の値を消してみると、次のように正常に処理されて、表示されていることが分かります。
これまで、getValuesで書いていた部分を、getDisplayValuesに変えるだけで、挙動が変化します。
//このようにgetDisplayValuesに変更するだけです
sheet.getRange(1, 1, last_row, last_col).getDisplayValues();
結果は、次のようになります。
DisplayValuesの名前の通り、画面で表示されているのと同じ値を返してくれて、想定していた通りの表示となっていることが分かります。
但し、ここで注意したいのは、先ほどのgetValuesではtrueやfalseと表示されていたセルもTRUEやFALSEと変化してしまっていることです。
もしこの状態で、クライアント側でif文などでの比較を行うと、やはり想定外の挙動となることが考えられます。
ですので、”実際の値”を利用したいのか、”表示されている値”を利用したいのかによって使い分けを行う必要があります。
getValuesとgetDisplayValuesで処理速度に違いがあるのか、for文で3000回実行するロジックをそれぞれ10回実行してみました。
3000回実行した結果
getValuesの場合:最短 9.209sec、最長 19.560sec、平均 12.480sec
getDisplayValuesの場合:最短 10.061sec、最長 19.194sec、平均 14.409sec
平均を見る限りgetValuesのほうが早いようですね。
ただ、その時のサーバーの状況に左右されるので、上記結果のように最長時間だけ比較するとgetValuesのほうが長いので、必ずしもそうではないことを留意しておく必要もありますね。
ありがとうございます。
助かりました。