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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2598閲覧

GAS 10営業日後の設定

HARUNA3

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/09/26 08:00

実現したい事

 土日、祝日を抜いて営業日で10日後を指定したい。

困っている事

 googleカレンダーを用いて、今日の日付から12日後(必ず土日が1回入るので12日後までを指定)までの間のイベント数を数えたいが、
下記のコードではイベント数ではなく単なる日にちが計算されてしまい、console.log(eventsNumber.length)の実行結果が「13」になってしまいます。

解決したい事

 まずは console.log(eventsNumber.length);の所で祝日のイベントのみカウントし「2」 (9月19日以降の祝日2回をカウント)と表示されるようにしたいです。

function date (saveSheet) { const date = new Date(2021, 8, 19); const week_list = new Array('(日)', '(月)', '(火)', '(水)', '(木)', '(金)', '(土)'); const weekNum = date.getDay(); const week = week_list[weekNum]; const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); let eventsNumber = []; for (i=0; i <= 12; i++) { date.setDate(date.getDate()+ 1); if (cal.getEventsForDay(date) !== null ){ eventsNumber.push('i'); } } console.log(eventsNumber.length); let afterDate = null; if ( weekNum == 0 ) { let afterDate = date.setDate(date.getDate() + 12 + eventsNumber) } else if ( weekNum == 6 ) { let afterDate = date.setDate(date.getDate() + 13 + eventsNumber) } else { let afterDate = date.setDate(date.getDate() + 11 + eventsNumber); } console.log(afterDate); // let afterDate = date.setdate(date.getDate() + eventsNumber) let setDate = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd'); // console.log(setDate); let service = `※ ${setDate}${week}17:00までのご発注(最小ロットを除く)に限り、①②③④のうちお好みのオプション1つを無料サービス `; console.log(service); saveSheet.getRange(24, 2, 1, 1).setValue(service); return { service : service } }
イベント数が無事カウント出来るようになったら、それ以降のコードもきちんと書く予定です。後半も、土曜日だった場合と日曜日だった場合、そうでない場合に分けてプラス祝日の数を足して、営業日10日後を出す予定で書いておりますが、うまく機能しておりませんのでもし良かったら下段についてもアドバイス頂けますと嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

イベント数が無事カウント出来るようになったら ...
土曜日だった場合と日曜日だった場合、
そうでない場合に分けてプラス祝日の数を足して、営業日10日後を出す予定

この部分だけを実現する関数を作っておけばいいのではないでしょうか。

GAS

1/* 2 引数1の日付から 引数2で指定された日数分の平日を加算したDateオブジェクトを返す 3 4 引数1: 任意の日付 5 引数2: N日後(前)の数値 6 引数3: 会社独自の休日を格納した配列(省略可) 7*/ 8function haruna_weekday(targetdate, weekdays = 0, myholidays = []) { 9 if (weekdays === 0) return new Date(targetdate); 10 const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); 11 const inc = (weekdays > 0) ? 1: -1; 12 const org = myholidays.flat().filter(f => f).map(d => new Date(d)); 13 14 let count = 0; 15 let date = new Date(targetdate); 16 while (count !== weekdays) { 17 date.setDate(date.getDate() + inc); 18 if (~[0, 6].indexOf(date.getDay())) continue; // 土日判定 19 if (cal.getEventsForDay(date).length) continue; // 祝日判定 20 if (org.some( d => d.getTime() === date.getTime())) continue; // 独自休日判定 21 count += inc; 22 } 23 return date; 24}

以下、実際に関数を呼び出した例です

GAS

1 // 2021年9月21日(火)の 2営業日前は 2021年9月16日(木) 2 console.log(haruna_weekday(new Date(2021, 9 - 1, 21), -2)); 3 4 // 2021年9月16日(木)の 4営業日後は 2021年9月24日(金) 5 console.log(haruna_weekday('2021-09-16', 4)); 6 7 // 2021年9月16日(木)の 5営業日後は 2021年9月27日(月) 8 console.log(haruna_weekday('2021-09-16', 5)); 9 10 // 2021年10月1日(金)の 10営業日後は 2021年10月15日(金) 11 console.log(haruna_weekday(new Date('2021/10/1'), 10)); 12 13 // 2021年10月1日(金)の 10営業日後(会社の独自休日2日含む)は 2021年10月19日(火) 14 console.log(haruna_weekday('2021/10/1', 10, ['2021/10/6','2021/10/12']));
  • Utilities.formatDate
  • saveSheet.getRange
  • week_list[weekNum]

このあたりの処理は、[ 営業日N日後の日付 ]を
ユーザ定義関数で求めた後に、別途実施すればいいと思います。

投稿2021/09/27 11:13

編集2021/09/27 13:37
mayu-

総合スコア335

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

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

HARUNA3

2021/09/28 01:16

mayu- 様 ありがとうございます!!全く違うアプローチ?で書いて下さって理解するのに少し時間がかかりますので、しっかり読んで理解して反映させたいと思います! イベント数をきちんとカウントするように修正も出来ましたので、そちらも別途メモとして残そうと思います。 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問