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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

1回答

606閲覧

日付計算を行った後、日の数字がおかしい

TopingMado

総合スコア25

Google Apps Script

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

0グッド

0クリップ

投稿2020/01/22 10:51

前提・実現したいこと

期間を指定して発注シートに一括記入するコードを作成しています。
イベント期間はいつも決められた日数となりますので、期間の数字を設定することで、開催期間を計算して記入してもらう形となります。

テスト用に設定した日付

・2020/02/20
・2020/02/27
・2020/03/05
・2020/12/27

実行した結果

開始日:02/51(木)
終了日:02/57(水)
開始日:02/58(木)
終了日:03/64(水)
開始日:03/65(木)
終了日:03/71(水)
開始日:12/362(日)
終了日:01/02(日)

発生している問題・エラーメッセージ

実行後、Logにて確認した結果、日にちが31を超えています。
また、CountDay(num,StartDate)実行の後、StartDate、YobiList[StartYobi]、EndDate、YobiList[EndYobi]の変数を続けて使いたいため、returnを使って変数を渡して見ましたが、変数が存在しないとエラーがでました。

該当のソースコード

GAS

1 2function AutoOrder_MainProtest2() { 3const Book = SpreadsheetApp.getActive(); 4const InfoSheet = Book.getSheetByName("info"); //発注詳細を格納するシート 5const ClassValue = InfoSheet.getRange("A:A").getValues(); //発注の分類 6const OrderStatus = InfoSheet.getRange("H:H").getValues(); //発注の状態(未発注,発注済み) 7 8for(var num =0;num<ClassValue.length;num++){ 9if(OrderStatus[num]=="未発注"){ //未発注のみ処理を行う 10var StartDate = new Date(InfoSheet.getRange(num+1, 6).getValue()); //一括処理を行うため、F列は開始日が記入されている 11CountDay(num,StartDate); 12 13} 14function CountDay(num,StartDate){ 15const Month_TypeA=[1,3,5,7,8,10,12]; //31日の月 16const Month_TypeB=[4,6,9,11]; //30日の月 17const Month_TypeC=[2]; //2月は29日 18const YobiList= ["日", "月", "火", "水", "木", "金", "土"]; //getDay()で得た値を曜日に変換するためのリスト 19 20var StartDay = StartDate.getDate(); 21var year =StartDate.getFullYear(); 22var month =StartDate.getMonth()+1; //最初のMonthは0のため、+1 23var StartYobi=StartDate.getDay(); 24var StartDate = Utilities.formatDate(StartDate, 'Asia/Tokyo', 'MM/DD'); 25var EndDay =StartDay+6; 26 27if(Month_TypeA.indexOf(month)>=0 && EndDay>31){ 28var EndDay=EndDay-31; 29var month=month+1; 30if(month==13){ 31var year=year+1; //年越しの場合 32} 33 } 34 else if (Month_TypeB.indexOf(month)>=0 && EndDay>30){ 35var EndDay=EndDay-30; 36var month=month+1; 37 } 38 else if (Month_TypeC.indexOf(month)>=0 && EndDay>29){ 39var EndDay=EndDay-29; 40var month=month+1; 41 } 42var EndDate = new Date(year,month-1,EndDay); 43var EndYobi =EndDate.getDay(); 44var EndDate = Utilities.formatDate(EndDate, 'Asia/Tokyo', 'MM/DD'); 45 46Logger.log("開始日:"+StartDate+"(" + YobiList[StartYobi] +")"); 47Logger.log("終了日:"+EndDate+"(" + YobiList[EndYobi] +")"); 48} 49} 50}

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

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

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

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

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

guest

回答1

0

ベストアンサー

formatDate(date, timeZone, format)からリンクされる
https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.htmlにあるように DD は一年のうち何日目かを意味します。

従って、var StartDate = Utilities.formatDate(StartDate, 'Asia/Tokyo', 'MM/dd'); および var EndDate = Utilities.formatDate(EndDate, 'Asia/Tokyo', 'MM/dd'); と小文字にすれば意図した日付になりそうです。

javascript

1function AutoOrder_MainProtest2() { 2 const Book = SpreadsheetApp.getActive(); 3 const InfoSheet = Book.getSheetByName("info"); //発注詳細を格納するシート 4 const ClassValue = InfoSheet.getRange("A:A").getValues(); //発注の分類 5 const OrderStatus = InfoSheet.getRange("H:H").getValues(); //発注の状態(未発注,発注済み) 6 7 for (var num = 0; num < ClassValue.length; num++) { 8 if (OrderStatus[num] == "未発注") { //未発注のみ処理を行う 9 var StartDate = new Date(InfoSheet.getRange(num + 1, 6).getValue()); //一括処理を行うため、F列は開始日が記入されている 10 var ret = CountDay(num, StartDate); 11 StartDate = ret[0]; 12 var EndDate = ret[1]; 13 } 14 } 15} 16function CountDay(num, StartDate) { 17 const Month_TypeA = [1, 3, 5, 7, 8, 10, 12]; //31日の月 18 const Month_TypeB = [4, 6, 9, 11]; //30日の月 19 const Month_TypeC = [2]; //2月は29日 20 const YobiList = ["日", "月", "火", "水", "木", "金", "土"]; //getDay()で得た値を曜日に変換するためのリスト 21 22 var StartDay = StartDate.getDate(); 23 var year = StartDate.getFullYear(); 24 var month = StartDate.getMonth() + 1; //最初のMonthは0のため、+1 25 var StartYobi = StartDate.getDay(); 26 var StartDate = Utilities.formatDate(StartDate, 'Asia/Tokyo', 'MM/dd'); 27 var EndDay = StartDay + 6; 28 29 if (Month_TypeA.indexOf(month) >= 0 && EndDay > 31) { 30 var EndDay = EndDay - 31; 31 var month = month + 1; 32 if (month == 13) { 33 var year = year + 1; //年越しの場合 34 } 35 } else if (Month_TypeB.indexOf(month) >= 0 && EndDay > 30) { 36 var EndDay = EndDay - 30; 37 var month = month + 1; 38 } else if (Month_TypeC.indexOf(month) >= 0 && EndDay > 29) { 39 var EndDay = EndDay - 29; 40 var month = month + 1; 41 } 42 var EndDate = new Date(year, month - 1, EndDay); 43 var EndYobi = EndDate.getDay(); 44 var EndDate = Utilities.formatDate(EndDate, 'Asia/Tokyo', 'MM/dd'); 45 46 Logger.log("開始日:" + StartDate + "(" + YobiList[StartYobi] + ")"); 47 Logger.log("終了日:" + EndDate + "(" + YobiList[EndYobi] + ")"); 48 return [StartDate, EndDate]; 49}

自己満足

javascript

1function AutoOrder_MainProtest2() { 2 const infoSheetName = 'info'; 3 const colA_classify = 0; 4 const colH_state = 7; 5 const colF_startdate = 5; 6 const notYet = '未発注'; 7 const span = 6; 8 9 const dat = SpreadsheetApp.getActive().getSheetByName(infoSheetName).getDataRange().getValues().filter(function(e) { return e[colH_state] === notYet ; }); 10 dat.forEach(function (e) { 11 var startdate = e[colF_startdate]; 12 var enddate = getNdaysAfter(startdate, span); 13 var startdateAsString = "開始日:" + formatDate(startdate); 14 var enddateAsString = "終了日:" + formatDate(enddate); 15 }); 16} 17function getNdaysAfter(date, num) { 18 const ret = new Date(date.getFullYear(), date.getMonth(), date.getDate()); 19 ret.setDate(ret.getDate() + num); 20 return ret; 21} 22function formatDate(date) { 23 const formattedDate = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd'); 24 const day = ["日", "月", "火", "水", "木", "金", "土"][date.getDay()]; 25 return formattedDate + "(" + day + ")"; 26}

投稿2020/01/22 13:04

編集2020/01/24 13:47
papinianus

総合スコア12705

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

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

TopingMado

2020/01/23 01:58

ご教授いただき誠にありがとうございます。 小文字に変えたことで無事解決できました。 もう一つご教授いただきたいのですが、 function CountDay(num,StartDate)を行ったあとに、 function AutoOrder_MainProtest2()に戻った際に変数を続けて使いたいですが、 returnしても定義されていないと表示されるのはどうしてでしょうか。 【function CountDay(num,StartDate)】 var StartTime = "開始日:"+StartDate+"(" + YobiList[StartYobi] +")"; var EndTime = "終了日:"+EndDate+"(" + YobiList[EndYobi] +")"; return StartTime; return EndTime; 【function AutoOrder_MainProtest2()】 for(var num =0;num<ClassValue.length;num++){ if(OrderStatus[num]=="未発注"){ var StartDate = new Date(InfoSheet.getRange(num+1, 6).getValue()); CountDay(num,StartDate); } Logger.log(StartTime); Logger.log(EndTime); 【エラーメッセージ】 ReferenceError: 「StartTime」が定義されていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問