質問編集履歴

2

説明を補足しました。自分なりにコードを解析して、怪しいと思われるところを記載しました。すみませんが、どうぞよろしくお願いいたします。

2022/06/21 04:32

投稿

jasmintea
jasmintea

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,5 @@
1
1
  下記記事をもとに、やってみたのですが、
2
2
  出力がおかしいので、見ていただけたらと思います。
3
-
4
3
  https://www.shanaidx.com/calendar_akijikan/
5
4
 
6
5
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-20/3b806c6e-62c9-40fd-a480-aea4d9bc2b79.png)
@@ -9,33 +8,12 @@
9
8
  ②隙間時間のみ抽出なのに、出力データがおかしい
10
9
  例:6/21(火)の13:00-17:00が空いていると出力されているが、実際はその時間内にCさんは予定ありとなっています。
11
10
 
11
+ 以下、怪しいところを記載いたします。
12
+ すみませんが、どなたか見ていただけたら幸いです。
12
13
 
14
+ ①空き時間を選出するところで、うまくいっていないように見えます。。
13
15
  ```GAS
14
- function main() {
15
- clear()//初期化
16
- // シート情報取得
17
- const sheet = SpreadsheetApp.getActiveSpreadsheet()
18
- const list = sheet.getSheetByName("入力")
19
- const list_data = list.getDataRange().getValues()
20
- const list2 = sheet.getSheetByName("結果")
21
- const list3 = sheet.getSheetByName("名簿")
22
- const list3_data = list3.getDataRange().getValues()
23
- const start_day = Utilities.formatDate(list_data[2][2] , "Asia/Tokyo", "yyyy/MM/dd 00:00:00"); // 対象開始日
24
- const end_day = Utilities.formatDate(list_data[2][3] , "Asia/Tokyo", "yyyy/MM/dd 00:00:00"); // 対象終了日
25
- const holiday = list_data[9][8] // 祝日
26
- const minAssuringMinutes = sheet.getRange("G3").getValue() //確保したい時間(分)
27
- const travelTime1 = sheet.getRange("J3").getValue() //移動時間(前)
28
- const travelTime2 = sheet.getRange("K3").getValue() //移動時間(後)
29
- var wantTimes = minAssuringMinutes + travelTime1 + travelTime2 //必要な時間(分)
30
- var ok_time = []; // 空き時間
31
- var add = []; // 対象アドレス
32
- for (var i=2, j=0; i<list_data.length; i++, j++){
33
- if(list_data[i][1] == 1 ){
34
- add.push(list3_data[j][2])
35
- }
36
- }
37
-
38
- /* 全員共通の空き時間出力 */
16
+ /* 全員共通の空き時間出力 */
39
17
  const startdate = new Date(start_day); // 指定開始日
40
18
  const enddate = new Date(end_day); // 指定終了日
41
19
  var day_count = (enddate - startdate) / (1000 * 60 * 60 * 24); // 指定日数
@@ -107,14 +85,13 @@
107
85
  list2.getRange(j,1).setValue(ok_time[k])
108
86
  }
109
87
  }
88
+ ```
110
89
 
111
- /* 個人の空き時間出力 */
90
+ 個人の出力もおかしい
112
- // 一人ずつの予定
113
- for(var i=0; i<add.length; i++){
114
- var cal = CalendarApp.getCalendarById(add[i]);
115
- var address = add[i] //出力のに使用
91
+ 1日ずつ空き間を計算となっているが、2人目以降は最終日×日数分を繰り返している
116
92
 
93
+ ```gas
117
- // 一日ずつ空き時間を計算
94
+ // 一日ずつ空き時間を計算
118
95
  for(var c=0;c<=day_count;c++){
119
96
  var events = cal.getEventsForDay(date)
120
97
  var cal_starttime = []; // 個人の予定開始時間
@@ -133,149 +110,6 @@
133
110
  }
134
111
  }
135
112
  }
136
- // 指定開始・終了時間を設定
137
- cal_endtime.unshift(opening);
138
- cal_endtime.push(date.setHours(23, 59, 59, 999)); //一日の終了時間
139
- cal_endtime.sort();
140
-
141
- cal_starttime.push(closing);
142
- cal_starttime.unshift(date.setHours(0, 0, 0, 0)); //一日の開始時間
143
- cal_starttime.sort();
144
-
145
- // 開始時間と終了時間を比較して空き時間を選出
146
- for (var l=0;l<cal_starttime.length-1;l++) {
147
- var dateString = convert2String(cal_starttime[l+1], false);
148
- var week1 = new Date(cal_starttime[l+1])
149
- var week_add = weekAdd(week1)
150
- var weekNum = week1.getDay();
151
- setFlag = weekFlag(weekNum,list_data)//曜日の指定と実際の曜日を判定してフラグを設定する
152
-
153
- if(setFlag == true){ 
154
- if(cal_starttime[l+1] - cal_endtime[l] >= wantTimes * 60 * 1000 && cal_starttime[l+1] != cal_endtime[l]){
155
- var startTime = cal_endtime[l] + travelTime1 * 60 * 1000
156
- var endTime = cal_starttime[l+1] - travelTime2 * 60 * 1000
157
- var startTimeString = convert2String(startTime)
158
- var endTimeString = convert2String(endTime)
159
- ok_time.push([dateString+'(' + week_add + ')' + Utilities.formatString("%s-%s", startTimeString, endTimeString)])
160
- }
161
- }
162
- }
163
- }
164
- //個人の出力処理
165
- var empty = [];
166
- var name = nameAdd(address)
167
- ok_time.unshift(name) //アドレスを追加
168
- for (var n=2,p=i+2,q=0;q<ok_time.length;n++,q++){
169
- list2.getRange(n,p).setValue(ok_time[q])
170
- }
171
- ok_time = empty //配列を空にする
172
- }
173
- }
174
- /*
175
- * 共通処理
176
- */
177
- //形式を変換する
178
- function convert2String(date, withTime) {
179
- if (typeof withTime === "undefined") withTime = true; //withTimeが初期値の場合、trueを入れる
180
-  var dateTime = new Date(date); //日付取得
181
-  if (!withTime) { //withTimeに何も入ってなかったら
182
- var month = dateTime.getMonth()+1; //月 + 1
183
- var day = dateTime.getDate(); //日
184
-
185
- return Utilities.formatString("%d/%d", month, day);  //形式を(月/日)に
186
- } else {
187
- var hours = dateTime.getHours();  //時
188
- var minutes = padding(dateTime.getMinutes()); //分
189
- return Utilities.formatString("%d:%s", hours, minutes); //形式を(時:分)に
190
- }
191
- }
192
-
193
- //時間の形式を00:00とする
194
- function padding(num) {
195
- return ('00' + num).slice(-2)
196
- }
197
-
198
- //曜日の表示を配列に入れる
199
- function weekAdd(week1) {
200
- const week_list = new Array('日', '月', '火', '水', '木', '金', '土');//曜日の配列
201
- const weekNum = week1.getDay(); // 曜日を表す数値
202
- const week = week_list[weekNum];// 曜日取得
203
- return(week)
204
- }
205
-
206
- //曜日の指定と実際の曜日を判定してフラグを設定する
207
- function weekFlag(weekNum,list_data) {
208
- var setFlag = true
209
- for(i=1,j=0;i<9,j<7;i++,j++)
210
- if(list_data[i][8] == 0 && weekNum == j){
211
- setFlag = false
212
- break
213
- }
214
- return setFlag
215
- }
216
-
217
- //祝日を判定してフラグを設定する
218
- function holiFlag(date,holiday){
219
- var setFlag = true
220
- var calendarholi = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
221
- var holiEvents = calendarholi.getEventsForDay(date);
222
- if(holiday == 0 && holiEvents.length > 0){
223
- setFlag = false //フラグをfalseにする
224
- }
225
- return setFlag
226
- }
227
-
228
- //名簿から名前を取得
229
- function nameAdd(address) {
230
- const sheet = SpreadsheetApp.getActiveSpreadsheet();
231
- const list3 = sheet.getSheetByName("名簿");
232
- let list3_data = list3.getDataRange().getValues();
233
-
234
- for (a in list3_data) {
235
- if(address == list3_data[a][2]) {
236
-     var fullname = (list3_data[a][0]+' '+list3_data[a][1])
237
- }
238
- }
239
-
240
- if(fullname == ''){
241
- fullname = address
242
- }
243
- return fullname;
244
- }
245
-
246
- /*
247
- * クリア
248
- */
249
- //結果出力欄のクリア
250
- function clear() {
251
- const sheet = SpreadsheetApp.getActiveSpreadsheet();
252
- const list3 = sheet.getSheetByName("結果");
253
-
254
- var range = list3.getRange("A2:Z50");
255
- range.clearContent();
256
-
257
- }
258
-
259
- //入力チェック欄のクリア
260
- function clear_check() {
261
- const sheet = SpreadsheetApp.getActiveSpreadsheet();
262
- const list = sheet.getSheetByName("入力");
263
-
264
- var range = list.getRange("B3:B25");
265
- range.clearContent();
266
-
267
- }
268
- /*
269
- * バーの追加
270
- */
271
- function onOpen(event) {
272
- var ui = SpreadsheetApp.getUi()
273
- var menu = ui.createMenu('空き時間の算出')
274
-
275
- menu.addItem('空き時間の算出', 'main') // 空き時間算出処理
276
- menu.addItem('結果のクリア', 'clear') // 空き時間算出処理
277
-
278
- menu.addToUi()
279
- }
280
113
  ```
281
114
 
115
+

1

誤字

2022/06/21 00:20

投稿

jasmintea
jasmintea

スコア0

test CHANGED
@@ -1 +1 @@
1
- Google カレンダーから隙間時間のみを抽出する
1
+ Google カレンダーから複数人の共通の空き時間のみを抽出する
test CHANGED
File without changes