PR

【GAS】getValuesとgetDisplayValuesの日付の値を扱う際の注意点

Google Workspace
スポンサーリンク

GASで日付のフォーマットは必要?

スプレッドシートからセルの値を取得して文章を作り、それをメールで送るスクリプトをGASで組んでいたのですが、思わぬ問題に出会いました。
セルの値の取得には、getValues関数を使っていたのですが、今回扱ったデータの中に日付のデータがあったため気付きました。
getValues関数で取得した日付のデータは、日付形式で表示するためには、Utilities.formatDate関数などが必要だと思っていたのですが、どうやらgetDisplayValues関数を使えばその限りでないようです。

getValues関数を使った場合

getValues関数で日付を含んだセルの値を取得して表示してみます。

画像に alt 属性が指定されていません。ファイル名: 2023-05-23_21h17_13-1024x438.png
  1. function myReply() {
  2.     //フォームの回答シート
  3.     const sheet = SpreadsheetApp.getActiveSheet();
  4.     //回答シートの最終行列
  5.     const lastRow = sheet.getLastRow();
  6.     const lastCol = sheet.getLastColumn();
  7.     //最終行の回答を配列に取得
  8.     const answerTbl = sheet.getRange(lastRow,1,1,lastCol).getValues()[0];
  9.     //配列を表示
  10.     console.log(answerTbl);
  11. }

スプレッドシートの最終行のセルの値を取得するのにgetValues関数を使っています。
回答シートの項目の[タイムスタンプ]、[名前]、[メールアドレス]、[参加]、[予約日]の値は、配列answerTbl[0]~[4]で受け取りました。
[タイムスタンプ]の値がanswerTbl[0]へ、[名前]の値がanswerTbl[1]・・・[予約日]の値がanswerTbl[4]です。
この配列answerTblを表示するスクリプトです。

画像に alt 属性が指定されていません。ファイル名: 2023-05-24_21h17_53-1024x369.png

getValues関数で取得した配列answerTbl[0]とanswerTbl[4]は、数値として取得しているはずですが、なぜだか Tue Feb 23 2023 17:06:12 GMT+0900 (Japan Standard Time) と表示されています。
他の[名前]や[メールアドレス]などの文字列は文字列(シングルクォーテーションで囲まれている)として取得しています。
どうやらgetValues関数は取得する対象が数値と日付では同じ数値型であってもの書式の情報は違うようです。

スプレッドシートの表示形式を日付から数値へ変えてみます。

画像に alt 属性が指定されていません。ファイル名: 2023-05-24_10h47_00.png
画像に alt 属性が指定されていません。ファイル名: 2023-05-24_10h50_28-1024x352.png

表示形式を数値にすると、44,615.71と表示されました。
これは、日時のシリアル値ですね。
そして実行してみます。

画像に alt 属性が指定されていません。ファイル名: 2023-05-24_21h22_41.png

今度は数値としてシリアル値がより詳しく表示されました。
スプレッドシート側の表示形式を変えたら、実行ログの表示形式も変わりました。
やはり日付の書式情報は数値の情報とは異なるようですね。
シート側の書式が日付のままだと、数値型にもかかわらず、Tue Feb 23 2023 17:06:12 GMT+0900 (Japan Standard Time) のように表示されるようです。

getDisplayValues関数を使った場合

getValuesをgetDisplayValuesへ書き換えてみました。

画像に alt 属性が指定されていません。ファイル名: 2023-05-23_21h17_13-1024x438.png
  1. function myReply3() {
  2.     //フォームの回答シート
  3.     const sheet = SpreadsheetApp.getActiveSheet();
  4.     //回答シートの最終行列
  5.     const lastRow = sheet.getLastRow();
  6.     const lastCol = sheet.getLastColumn();
  7.     //最終行の回答を配列に取得
  8.     const answerTbl = sheet.getRange(lastRow,1,1,lastCol).getDisplayValues()[0];
  9.     //配列を表示
  10.     console.log(answerTbl);
  11. }
画像に alt 属性が指定されていません。ファイル名: 2023-05-24_21h41_10.png

正しく?日付が表示されています。
getDisplayValues関数は、セルの表示形式のままに文字列として取得するようです。
(全ての値がシングルクォーテーションで囲まれています。)

試しに、セルの表示形式を[時刻付き日付]から[時刻なし日付]へ換えてみます。

画像に alt 属性が指定されていません。ファイル名: 2023-05-24_12h34_18-1024x441.png
画像に alt 属性が指定されていません。ファイル名: 2023-05-24_21h48_23.png

シート側の変更がそのまま反映しています。
まさにDisplayですね。

感想

今後、日付データの取得はgetValueでいくか?getDisplayValueでいくか?で悩みそうです。例えば、getDisplayValue関数をうまく使えば、Utilities.formatDate関数を使う必要がない?とか。
今回のことはとても勉強になりました。
getValues関数とgetDisplayValues関数を上手に使い分けていきたいと思います。

コメント

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