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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

Q&A

0回答

1589閲覧

Google カレンダーから複数人の共通の空き時間のみを抽出する

jasmintea

総合スコア0

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

1グッド

1クリップ

投稿2022/06/20 07:08

編集2022/06/21 04:32

下記記事をもとに、やってみたのですが、
出力がおかしいので、見ていただけたらと思います。
https://www.shanaidx.com/calendar_akijikan/

イメージ説明

①予定が繰り返されてしまう
②隙間時間のみ抽出なのに、出力データがおかしい
例:6/21(火)の13:00-17:00が空いていると出力されているが、実際はその時間内にCさんは予定ありとなっています。

以下、怪しいところを記載いたします。
すみませんが、どなたか見ていただけたら幸いです。

①空き時間を選出するところで、うまくいっていないように見えます。。

GAS

1 /* 全員共通の空き時間出力 */ 2 const startdate = new Date(start_day); // 指定開始日 3 const enddate = new Date(end_day); // 指定終了日 4 var day_count = (enddate - startdate) / (1000 * 60 * 60 * 24); // 指定日数 5 6 // 一日ずつ空き時間を計算 7 for(var c=0;c<=day_count;c++){ 8 var start_time = Utilities.formatDate(list_data[2][4] , "Asia/Tokyo", "HH:mm") // 指定開始時間 9 var end_time = Utilities.formatDate(list_data[2][5] , "Asia/Tokyo", "HH:mm") // 指定終了時間 10 var cal_starttime = []; // 予定開始時間 11 var cal_endtime = []; // 予定終了時間 12 13 // 一人ずつ予定を抽出 14 for(var i=0; i<add.length; i++){ 15 var date = new Date(Date.parse(start_day) + (c * 60 * 60 * 24 * 1000)); 16 var cal = CalendarApp.getCalendarById(add[i]); 17 var events = cal.getEventsForDay(date) 18 var setFlag = setFlag = holiFlag(date,holiday)//祝日の判定 19 if(events.length > 0 ){ 20 if(setFlag == true){ //祝日ではないor祝日チェックなし 21 for(var e=0; e<events.length; e++){// 取得した予定を配列に入力 22 if (events[e].isAllDayEvent() == false) { //終日予定は避ける 23 var start1 = events[e].getStartTime()// 予定開始時間 24 var end1 = events[e].getEndTime() // 予定終了時間 25 cal_starttime.push(start1.getTime()) // 個人の予定開始時間を配列に追加 26 cal_endtime.push(end1.getTime()) // 個人の予定終了時間を配列に追加 27 } 28 } 29 } 30 } 31 32 // 指定開始・終了時間を設定 33 var start_time_con = start_time.substr(0,2)// 1日の指定開始時間 34 var opening = date.setHours(start_time_con, 0, 0, 0) 35 var opening = date.setMinutes(start_time.substr(3,2)); 36 var end_time_con = end_time.substr(0,2) // 1日の指定終了時間 37 var closing = date.setHours(end_time_con, 0, 0, 0); 38 var closing = date.setMinutes(end_time.substr(3,2)); 39 40 cal_endtime.push(date.setHours(23, 59, 59, 999)); // 1日の終了時間 41 cal_endtime.unshift(opening); 42 cal_endtime.sort(); 43 44 cal_starttime.push(closing); 45 cal_starttime.unshift(date.setHours(0, 0, 0, 0)); //1日の開始時間 46 cal_starttime.sort(); 47 48 49 // 開始時間と終了時間を比較して空き時間を選出  50 for (var i=0;i<cal_starttime.length-1;i++) { 51 var dateString = convert2String(cal_starttime[i+1], false); 52 var week1 = new Date(cal_starttime[i+1]) 53 var week_add = weekAdd(week1) 54 var weekNum = week1.getDay(); 55 setFlag = weekFlag(weekNum,list_data) //曜日の指定と実際の曜日を判定してフラグを設定する 56 57 if(setFlag == true){  58 if(cal_starttime[i+1] - cal_endtime[i] >= wantTimes * 60 * 1000 && cal_starttime[i+1] != cal_endtime[i]){ 59 var startTime = cal_endtime[i] + travelTime1 * 60 * 1000 60 var endTime = cal_starttime[i+1] - travelTime2 * 60 * 1000 61 var startTimeString = convert2String(startTime) 62 var endTimeString = convert2String(endTime) 63 ok_time.push([dateString+'(' + week_add + ')' + Utilities.formatString("%s-%s", startTimeString, endTimeString)]) 64 } 65 } 66 } 67 } 68 //全員共通の空き時間を出力 69 for (var j=3, k=0 ;k<ok_time.length;j++,k++) { 70 list2.getRange(j,1).setValue(ok_time[k]) 71 } 72 }

②個人の出力もおかしい
1日ずつ空き時間を計算となっているが、2人目以降は最終日×日数分を繰り返している

gas

1 // 一日ずつ空き時間を計算 2 for(var c=0;c<=day_count;c++){ 3 var events = cal.getEventsForDay(date) 4 var cal_starttime = []; // 個人の予定開始時間 5 var cal_endtime = []; // 個人の予定終了時間 6 var setFlag = holiFlag(date,holiday)//祝日の判定 7 if(events.length > 0 ){ 8 if(setFlag == true){ 9 // 取得した予定を配列に入力 10 for(var e=0; e<events.length; e++){ 11 if (events[e].isAllDayEvent() == false) { //終日予定は避ける 12 var start1 = events[e].getStartTime()// 予定開始時間 13 var end1 = events[e].getEndTime() // 予定終了時間 14 cal_starttime.push(start1.getTime()) // 個人の予定開始時間を配列に追加 15 cal_endtime.push(end1.getTime()) // 個人の予定終了時間を配列に追加 16 } 17 } 18 } 19 }
a22r1345👍を押しています

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

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

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

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

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

kikukiku

2022/06/21 00:43

ソースが長すぎで、回答者への負担が大きすぎると思います。 自分自身でどこまでの動作は正常で、 どこからおかしくなるのかを調査することが必要と思います。 その努力した結果をここに質問すれば回答がスムーズに得られるのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問