GASで日付のフォーマットは必要?
スプレッドシートからセルの値を取得して文章を作り、それをメールで送るスクリプトをGASで組んでいたのですが、思わぬ問題に出会いました。
セルの値の取得には、getValues関数を使っていたのですが、今回扱ったデータの中に日付のデータがあったため気付きました。
getValues関数で取得した日付のデータは、日付形式で表示するためには、Utilities.formatDate関数などが必要だと思っていたのですが、どうやらgetDisplayValues関数を使えばその限りでないようです。
getValues関数を使った場合
getValues関数で日付を含んだセルの値を取得して表示してみます。
- function myReply() {
- //フォームの回答シート
- const sheet = SpreadsheetApp.getActiveSheet();
- //回答シートの最終行列
- const lastRow = sheet.getLastRow();
- const lastCol = sheet.getLastColumn();
- //最終行の回答を配列に取得
- const answerTbl = sheet.getRange(lastRow,1,1,lastCol).getValues()[0];
- //配列を表示
- console.log(answerTbl);
- }
スプレッドシートの最終行のセルの値を取得するのにgetValues関数を使っています。
回答シートの項目の[タイムスタンプ]、[名前]、[メールアドレス]、[参加]、[予約日]の値は、配列answerTbl[0]~[4]で受け取りました。
[タイムスタンプ]の値がanswerTbl[0]へ、[名前]の値がanswerTbl[1]・・・[予約日]の値がanswerTbl[4]です。
この配列answerTblを表示するスクリプトです。
getValues関数で取得した配列answerTbl[0]とanswerTbl[4]は、数値として取得しているはずですが、なぜだか Tue Feb 23 2023 17:06:12 GMT+0900 (Japan Standard Time) と表示されています。
他の[名前]や[メールアドレス]などの文字列は文字列(シングルクォーテーションで囲まれている)として取得しています。
どうやらgetValues関数は取得する対象が数値と日付では同じ数値型であってもの書式の情報は違うようです。
スプレッドシートの表示形式を日付から数値へ変えてみます。
表示形式を数値にすると、44,615.71と表示されました。
これは、日時のシリアル値ですね。
そして実行してみます。
今度は数値としてシリアル値がより詳しく表示されました。
スプレッドシート側の表示形式を変えたら、実行ログの表示形式も変わりました。
やはり日付の書式情報は数値の情報とは異なるようですね。
シート側の書式が日付のままだと、数値型にもかかわらず、Tue Feb 23 2023 17:06:12 GMT+0900 (Japan Standard Time) のように表示されるようです。
getDisplayValues関数を使った場合
getValuesをgetDisplayValuesへ書き換えてみました。
- function myReply3() {
- //フォームの回答シート
- const sheet = SpreadsheetApp.getActiveSheet();
- //回答シートの最終行列
- const lastRow = sheet.getLastRow();
- const lastCol = sheet.getLastColumn();
- //最終行の回答を配列に取得
- const answerTbl = sheet.getRange(lastRow,1,1,lastCol).getDisplayValues()[0];
- //配列を表示
- console.log(answerTbl);
- }
正しく?日付が表示されています。
getDisplayValues関数は、セルの表示形式のままに文字列として取得するようです。
(全ての値がシングルクォーテーションで囲まれています。)
試しに、セルの表示形式を[時刻付き日付]から[時刻なし日付]へ換えてみます。
シート側の変更がそのまま反映しています。
まさにDisplayですね。
感想
今後、日付データの取得はgetValueでいくか?getDisplayValueでいくか?で悩みそうです。例えば、getDisplayValue関数をうまく使えば、Utilities.formatDate関数を使う必要がない?とか。
今回のことはとても勉強になりました。
getValues関数とgetDisplayValues関数を上手に使い分けていきたいと思います。
コメント
This is the right site for everyone who would like to understand this topic.
You know a whole lot its almost tough to argue with
you (not that I personally would want to…HaHa). You definitely put a fresh spin on a
topic which has been discussed for ages. Excellent
stuff, just great!
Thank you for visiting my blog.
Did you read it using Google Translate?