質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

5213閲覧

【GAS】指定した範囲から取得した日付の値が変換できない。(Utilities.formatDate)

710LOVER

総合スコア10

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2021/06/01 11:58

#◆実現したいこと
対象範囲の値(M/d)※を取得して"yyyy/MM/dd"の文字列に変換して出力したい。
※値は半角。表示形式は自動(ダブルクリックすると"yyyy/MM/dd"で表示されカレンダーが出る。)

##◆解決したいこと
・[Utilities.formatDate()]のコマンドを使用したが、値が複数あるのに1つしか出力されない。
・また、出力された年月日が"1970/01/01"となっており取得した値が反映されてない。

#◆実行した大まかな流れ
①値を取得する範囲を指定する。[getRange()]
②指定した範囲にある値を取得する。[getValues()]
③取得した値を"yyyy/MM/dd"の文字列に変換する。[Utilities.formatDate()]

#◆作成したコード

function dateToday() { //日付の取得に関する変数 //指定するスプレッドシート const spreadSheet = SpreadsheetApp.openByUrl('対象スプレッドシート');  //指定するシート名 const sheetName = spreadSheet.getSheetByName('対象シート'); //①取得する範囲を指定(A列) const FColumn = sheetName.getRange('A2:A4'); //②指定した範囲の値を取得する const FValues = FColumn.getValues(); //③取得した値を変換する(yyyy/mm/dd) const date = Utilities.formatDate(new Date(FValues), "JST", "yyyy/MM/dd"); //出力する Logger.log(date);

#◆出力結果
・②の出力結果
Logger.log(FValues) = [[Sat Jun 05 00:00:00 GMT+09:00 2021], [Tue Jun 01 00:00:00 GMT+09:00 2021], [Mon May 31 00:00:00 GMT+09:00 2021]]

 ・③の出力結果
Logger.log(date) = 1970/01/01

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

itagagakiさんの回答が正攻法ですが、シート側の表示をいじっていいなら別の手も。

セルの表示形式の設定で 日付の表示を 最終手に欲しい形"yyyy/MM/dd" とした上で、getDisplayValues() でそのまんま取得という方法もあります。

文字列として扱うだけならコード短くて楽なんで、ご参考までに。

https://developers.google.com/apps-script/reference/spreadsheet/range#getDisplayValues()

投稿2021/06/02 01:15

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

710LOVER

2021/06/02 03:40

ご回答ありがとうございます。 確かにスプレッドシートの表示形式を変更してgetDisplayValues()を使用したらすんなりいけました。 型変換する必要もないので他の日付と比較するときも楽ですね。
guest

0

まずDate()の引数として配列は指定できません。
指定した範囲の各セルについてループして個々のセルの値でDateformatDateするしかないと思います。

投稿2021/06/01 12:19

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

710LOVER

2021/06/02 00:58

ご回答ありがとうございます。 ループと配列を使って個々のFValuesをDateとformatDateしてみます。
guest

0

自己解決

問題解決したので記載します。

function dateToday() { //日付の取得に関する変数 //指定するスプレッドシート const spreadSheet = SpreadsheetApp.openByUrl('対象スプレッドシート');  //指定するシート名 const sheetName = spreadSheet.getSheetByName('対象シート'); //①取得する範囲を指定(A列)※終わりをA4に設定していたがA列全てに変更。 const FColumn = sheetName.getRange('A2:A'); //②指定した範囲の値を取得する const FValues = FColumn.getValues(); //③取得した値を変換する(yyyy/mm/dd) //うまくいかなかったコード //const date = Utilities.formatDate(new Date(FValues), "JST", "yyyy/MM/dd"); //itagakiさんの回答を反映してループして個々をDateとformatDateする。 //取得した値をカウントする(ループ用) var count = FValues.length; //取得した値の数をループする for(var i = 0; i < count; i++){ //FValuesの値を個別に取得 var FresultD = FValues[i]; //取得した値を"YYYY/MM/DD"形式の文字列にする var PDate = new Date(FresultD); var date = Utilities.formatDate(PDate, "JST", "YYYY/MM/dd"); //出力する Logger.log(date); } }

ループで個々を取得することで"YY/MM/DD"形式の文字列に変換できました。
これによってスプレッドシートに記載されている値の表示形式をあまり気にせず取得できるようになりました。

機能を追加して取得した値を納期日として、当日か前日か判断し、該当したら自動でメールを送信するようにしました。

function autoSendMail() { //日付の取得に関する変数 //指定するスプレッドシート const spreadSheet = SpreadsheetApp.openByUrl('対象スプレッドシート');  //指定するシート名 const sheetName = spreadSheet.getSheetByName('対象シート'); //①取得する範囲を指定(A列) const FColumn = sheetName.getRange('A2:A'); //②指定した範囲の値を取得する const FValues = FColumn.getValues(); //【追加部分1】 //今日の日付データを取得(yyyy/mm/dd) var preToday = new Date(); const today = Utilities.formatDate(preToday, "JST", "YYYY/MM/dd"); //前日判定のため今日の日付を1日プラスする(yyyy/mm/dd) var preBeforeT = new Date(); preBeforeT.setDate(preBeforeT.getDate() + 1); const beforeT = Utilities.formatDate(preBeforeT, "JST", "YYYY/MM/dd"); //③取得した値を変換する(yyyy/mm/dd) //【追加部分2】   //対象数の集計 var Dcount1 = 0;//前日 var Dcount2 = 0;//当日 //ループして個々をDateとformatDateする。 //取得した値をカウントする(ループ用) var count = FValues.length; //取得した値の数をループする for(var i = 0; i < count; i++){ //FValuesの値を個別に取得 var FresultD = FValues[i]; //取得した値を"YYYY/MM/DD"形式の文字列にする var PDate = new Date(FresultD); var date = Utilities.formatDate(PDate, "JST", "YYYY/MM/dd"); //出力する Logger.log(date); //【追加部分3】 //④取得した値が当日か前日か判断する。 //条件:今日が納期の前日であるか if(beforeT == date){ //対象数カウント Dcount1++; //対象日付をメール本文に反映 var date1 = date; //条件:今日が納期の当日であるか }else if(today == date){ //対象数カウント Dcount2++; //対象日付をメール本文に反映 var date2 = date; }else{Logger.log('該当しない');} } //【追加部分4】 //⑤メール送信に関する設定 //送信先のメールアドレス const recipient = 'メールアドレス'; //メールタイトル const subject1 = '【前日だよ】'; const subject2 = '【当日だよ】'; //送信者名 const options = {name: '送信者'}; //受信者名 const recipientName = '受信者'; //前日メール本文 var body1 = `${recipientName}様\n\nお疲れ様です。\n納期日の前日となります。\n納期日:${date1}\n対象件数:${Dcount1}\n\nご対応よろしくお願いします。`; //当日メール本文 var body2 = `${recipientName}様\n\nお疲れ様です。\n納期日の当日となります。\n納期日:${date2}\n対象件数:${Dcount2}\n\nご対応よろしくお願いします。`; //対象件数があるときメールを送信する if(Dcount1 > 0){ //前日メールを送る GmailApp.sendEmail(recipient, subject1, body1, options); } if(Dcount2 > 0){ //当日メールを送る GmailApp.sendEmail(recipient, subject2, body2, options); } }

改めてご回答頂き感謝します。

投稿2021/06/07 08:48

710LOVER

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問