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

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

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

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

Google

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

Q&A

解決済

1回答

882閲覧

googleカレンダーから空き時間を算出したいです

Illas

総合スコア18

JavaScript

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

Google

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

0グッド

0クリップ

投稿2019/06/14 12:52

編集2019/06/17 11:43

前提・実現したいこと

GASについてです。
googleカレンダーから2週間分の空き時間を算出したいです。
そのデータをスプレットシートを介さず、直接googleフォームの記述欄の方に出力したいと考えています。

2週間分の空き時間は、9時から18時の間で考えております。

現在予定がある時間を15分単位で取得しており、
9時から18時の時間も15分単位で取得しているところです。
indexOfやmatchを用いて空き時間を出力する作業に詰まっています。

自分の憶測でコードを書いているため無駄なコードも多いかと思いますが
よろしくお願いいたします。

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

allList_01が全てログに出てくる

該当のソースコード

JavaScript

1 2function all_event() { 3 var myCal=CalendarApp.getCalendarById('ID'); //特定のIDのカレンダーを取得 4 var dt = new Date(); //当日指定 5 var date = dt.setDate(dt.getDate() + 2); //当日から2日後からイベント日程を取得 6 var startDate = new Date(date); //取得開始日 7 var dtt = dt.setDate(dt.getDate() + 14); //2週間後の14日後まで取得 8 var endDate = new Date(dtt);//取得終了日 9 10 var myEvents=myCal.getEvents(startDate,endDate); //カレンダーのイベントを取得 11 12 13//カレンダーに入っている予定の時間を15分単位で取得する 14 15 var ngList = []; 16 for (var i in myEvents) { 17 var startTime = myEvents[i].getStartTime(); 18 var endTime = myEvents[i].getEndTime(); 19 var diffCount = (((endTime -startTime)/60)/1000)/15; 20 21 22 var startTime2 = startTime.setMinutes(startTime.getMinutes() -15); 23 var startTime3 = new Date(startTime2); 24 25 for(j=0;j < diffCount+1;j++){ 26 var ng1 = startTime3.setMinutes(startTime3.getMinutes() +15); 27 var ng2 = new Date(ng1); 28 ngList.push(ng2); 29 }; 30 }; 31 32 33 34//配列を用意して2週間分の時間を入れる。 35 36 37 var allList =[]; //この配列に入っている時間から空き時間を下記に出力したいです。 38 { 39 for (var i = 0; i < 24; i++) { 40 startDate.setDate(startDate.getDate() + 1); 41 42//9時から18時までの空き時間をフォームに出力したいので9時から18時にイベントを固定 43 var start_Time = startDate.setHours(9, 0, 0, 0); 44 var s_Time = new Date(start_Time); 45 var end_Time = startDate.setHours(18, 0, 0, 0); 46 var e_Time =new Date(end_Time); 47 48//予定と同様に15分単位にする 49 var diffCount = ((((e_Time - s_Time)/60)/1000)/15); 50 var TimeList = s_Time.setMinutes(s_Time.getMinutes() -15); 51 var TimeList1 = new Date(TimeList); 52 53 for(j=0;j < diffCount+1;j++){ 54 var gf1 = TimeList1.setMinutes(TimeList1.getMinutes() +15); 55 var gf2 = new Date(gf1); 56 allList.push(gf2); 57 }; 58 }; 59 }; 60 61 62 //配列を文字列に変える 63 64 var ngList_01 = ngList.join(','); 65 66 var allList_01 = allList.join(','); 67 68 69 70 //配列を一つにする 71 72 var shin = []; 73 74 shin[0] = ngList_01 75 shin[0] = allList_01 76 77 78 //予定時間と日程の時間が15分単位で固定されているため引く 79 80 81var result = shin.filter( function( time, index, array ) { 82 83 //インデックス番号を比較して重複データのみ排除 84 return array.indexOf(time) === index; 85 86}) 87 88Logger.log(result); 89 90//フォームへの出力はその後に書く予定です 91 92}; 93 94} 95 96 97

補足情報(FW/ツールのバージョンなど)

mac

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

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

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

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

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

y_waiwai

2019/06/14 13:39

エラーメッセージを出たそのまま、コピペして提示してください。 余計な脚色、翻訳されると内容がわかりません
papinianus

2019/06/15 03:19

失礼なことをいいます。ごめんなさい。全く無意味なコードなんで、やりたいことをもっと具体的に詳しく、どこのスプレッドシートの何のシートの何行目の何列目をどうやって、どのカレンダーの何を消すのか書いてください
yasutomi

2019/06/15 07:30

GASはコードブロックで記述するなら HTMLというよりJavaScriptなので修正をお願いします。 あと他の方と同様に質問内容が意味不明でした。
papinianus

2019/06/17 10:19

空き時間を調べたいのに削除っていうのかわかりませんが。 どういう意味であるにせよ、 > 直接googleフォームの記述欄の方に出力 は多分思ってる形では無理です。(回答者に空きを教えたい、という使い方を想定してます)
papinianus

2019/06/17 10:21

フォーム送信時に、次にフォームを回答する人のため回答項目を変更するみたいなのは(ほんとに動くかはしらないけども)見たことがあります。
Illas

2019/06/17 11:46

回答者に空き時間を知らせたいです。 情報を教えていただきありがとうございます。
papinianus

2019/06/17 22:25

トリガーできないので、その場で教えるのは不可能なのですが、他に代替案の候補はないということですか?
Illas

2019/06/29 00:08

はい、代替案の候補が無く今回質問させていただきました。 トリガーについて自分で調べ解決できています。お気遣いいただきありがとうございます。
guest

回答1

0

ベストアンサー

思ってることはできないと思うけども15分区切りで空いている時間(の開始時間)は、例えばこうやれば取得できる

javascript

1function q195012() { 2 const today = new Date(); 3 const nine = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 2, 9,0); 4 const myCal=CalendarApp.getCalendarById('ID'); //特定のIDのカレンダーを取得 5 var free = []; 6 for(var d = 0; d < 14; d++){ 7 for(var h = 9; h < 18; h++) { 8 for(var m = 0; m < 60; m += 15) { 9 var start = new Date(nine.getFullYear(), nine.getMonth(), nine.getDate() + d, h, m); 10 var myEvents=myCal.getEvents(start, new Date(nine.getFullYear(), nine.getMonth(), nine.getDate() + d, h, m+15)); //カレンダーのイベントを取得 11 if(myEvents.length === 0) { free.push(start); } 12 } 13 } 14 } 15 Logger.log(free); 16 return free; 17}

投稿2019/06/19 14:21

papinianus

総合スコア12705

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

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

Illas

2019/06/29 00:10

無事出来ました。シンプルでわかりやく大変参考になりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問