回答編集履歴

23

 

2022/05/08 20:45

投稿

退会済みユーザー
test CHANGED
@@ -125,7 +125,7 @@
125
125
 
126
126
  -------
127
127
  # 補足
128
- なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合のうち重なっている区間を併合した表現」に過ぎません。
128
+ なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合を併合した表現」に過ぎません。
129
129
  「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
130
130
  (以下は「途中での交代が許容されていない」というのが前提です。途中での交代がOKならばこの限りではありません)
131
131
 

22

 

2022/05/08 09:29

投稿

退会済みユーザー
test CHANGED
@@ -127,7 +127,7 @@
127
127
  # 補足
128
128
  なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合のうち重なっている区間を併合した表現」に過ぎません。
129
129
  「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
130
- (以下は「途中での交代が許容されていない」というのが前提です。とちゅうでの交代がOKならばこの限りではありません)
130
+ (以下は「途中での交代が許容されていない」というのが前提です。途中での交代がOKならばこの限りではありません)
131
131
 
132
132
  たとえば、
133
133
  ・Aさんの空き時間が 10:30~11:00

21

 

2022/05/08 09:29

投稿

退会済みユーザー
test CHANGED
@@ -127,6 +127,7 @@
127
127
  # 補足
128
128
  なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合のうち重なっている区間を併合した表現」に過ぎません。
129
129
  「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
130
+ (以下は「途中での交代が許容されていない」というのが前提です。とちゅうでの交代がOKならばこの限りではありません)
130
131
 
131
132
  たとえば、
132
133
  ・Aさんの空き時間が 10:30~11:00
@@ -136,6 +137,6 @@
136
137
  と仮定した場合、
137
138
  上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
138
139
 
139
- しかし、業務がこの10:30~11:30の範囲内にあれば誰かが対応できるというわけではありません。
140
+ しかし、業務がこの10:30~11:30の範囲内にあれば、必ず誰か1人以上が対応できるというわけではありません。
140
- 途中での交代が許容されていない限り「10:50~11:15」 の業務には、誰も対応できません。
141
+ 途中交代が許容されていない場合)たとえば、「10:50~11:15」 の業務には、誰も対応できません。
141
142
   

20

 

2022/05/08 05:37

投稿

退会済みユーザー
test CHANGED
@@ -125,8 +125,8 @@
125
125
 
126
126
  -------
127
127
  # 補足
128
- なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「誰か1以上空き時間なっている帯から重なり除外した表現」に過ぎません。
128
+ なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「空き時間の集合のうち重なっている間を併合した表現」に過ぎません。
129
- 「得られた時間帯の範囲内であればいつでも誰か1人対応できる」というわけではないことに注意が必要です。
129
+ 「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
130
130
 
131
131
  たとえば、
132
132
  ・Aさんの空き時間が 10:30~11:00

19

 

2022/05/08 05:35

投稿

退会済みユーザー
test CHANGED
@@ -125,7 +125,7 @@
125
125
 
126
126
  -------
127
127
  # 補足
128
- なお、上記はコメントで得られた要求定義に基づいて回答していますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
128
+ なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
129
129
  「得られた時間帯の範囲内であればいつでも誰か1人が対応できる」というわけではないことに注意が必要です。
130
130
 
131
131
  たとえば、

18

  

2022/05/08 04:23

投稿

退会済みユーザー
test CHANGED
@@ -126,7 +126,7 @@
126
126
  -------
127
127
  # 補足
128
128
  なお、上記はコメントで得られた要求定義に基づいて回答していますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
129
- 与えられる追加業務の時間帯によっては、「得られた時間帯であればいつでも誰か1人が対応できる」というわけではないことに注意が必要です。
129
+ 「得られた時間帯の範囲内であればいつでも誰か1人が対応できる」というわけではないことに注意が必要です。
130
130
 
131
131
  たとえば、
132
132
  ・Aさんの空き時間が 10:30~11:00
@@ -137,5 +137,5 @@
137
137
  上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
138
138
 
139
139
  しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
140
- 途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
140
+ 途中での交代が許容されていない限り「10:50~11:15」 の業務には、誰も対応できません。
141
141
   

17

 

2022/05/08 04:21

投稿

退会済みユーザー
test CHANGED
@@ -137,5 +137,5 @@
137
137
  上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
138
138
 
139
139
  しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
140
- たとえば、途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
140
+ 途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
141
141
   

16

 

2022/05/08 04:20

投稿

退会済みユーザー
test CHANGED
@@ -131,11 +131,11 @@
131
131
  たとえば、
132
132
  ・Aさんの空き時間が 10:30~11:00
133
133
  ・Bさんの空き時間が 11:00~11:30
134
- ・確保したい時間が30
134
+ ・確保したい時間が25
135
135
  ・移動時間は0
136
136
  と仮定した場合、
137
137
  上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
138
138
 
139
139
  しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
140
- たとえば、途中での交代が許容されていない限り「10:45~11:15」 の会議には、誰も対応できません。
140
+ たとえば、途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
141
141
   

15

追記

2022/05/08 04:20

投稿

退会済みユーザー
test CHANGED
@@ -122,3 +122,20 @@
122
122
  ...
123
123
  (以下略)
124
124
  ```
125
+
126
+ -------
127
+ # 補足
128
+ なお、上記はコメントで得られた要求定義に基づいて回答していますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
129
+ 与えられる追加業務の時間帯によっては、「得られた時間帯であればいつでも誰か1人が対応できる」というわけではないことに注意が必要です。
130
+
131
+ たとえば、
132
+ ・Aさんの空き時間が 10:30~11:00
133
+ ・Bさんの空き時間が 11:00~11:30
134
+ ・確保したい時間が30分
135
+ ・移動時間は0
136
+ と仮定した場合、
137
+ 上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
138
+
139
+ しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
140
+ たとえば、途中での交代が許容されていない限り「10:45~11:15」 の会議には、誰も対応できません。
141
+  

14

 

2022/05/08 02:39

投稿

退会済みユーザー
test CHANGED
@@ -112,4 +112,13 @@
112
112
  /*------------------------------- 追加ここまで------------------------------*/
113
113
 
114
114
  } // main関数の末尾。
115
+
116
+ /*
117
+ * 共通処理
118
+ */
119
+ //形式を変換する
120
+ function convert2String(date, withTime) {
121
+ ......
122
+ ...
123
+ (以下略)
115
124
  ```

13

 

2022/05/08 02:38

投稿

退会済みユーザー
test CHANGED
@@ -26,7 +26,7 @@
26
26
  if(cal_starttime[l+1] - cal_endtime[l] >= wantTimes * 60 * 1000 && cal_starttime[l+1] != cal_endtime[l]){
27
27
  var startTime = cal_endtime[l] + travelTime1 * 60 * 1000
28
28
  var endTime = cal_starttime[l+1] - travelTime2 * 60 * 1000
29
- + all_freetimes.push([startTime, endTime]);
29
+ + all_freetimes.push([startTime, endTime]); // 追加
30
30
  var startTimeString = convert2String(startTime)
31
31
  var endTimeString = convert2String(endTime)
32
32
  ok_time.push([dateString+'(' + week_add + ')' + Utilities.formatString("%s-%s", startTimeString, endTimeString)])
@@ -46,7 +46,7 @@
46
46
  あとは各[開始時間、終了時間]の区間について、他の区間と重なる部分をひとつづきにすればよい(マージする)、ということになります。
47
47
 
48
48
  次のような関数を用意します。(上記のような2次元配列を受け取り、重なる区間をひとつづきにした2次元配列を返す関数)
49
- ```js- リスト
49
+ ```js
50
50
  /*
51
51
  * times: 2次元配列
52
52
  *  [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
@@ -83,9 +83,10 @@
83
83
  ok_time = empty //配列を空にする
84
84
  }
85
85
 
86
- // ここから追加
86
+ /*------------------------------- ここから追加------------------------------*/
87
- // ※1行目と最後から2行目の「list2.getLastColumn()+1」以外、
87
+ // ※ all_freetimes変数が絡む部分以外、
88
+ // 質問文に記載されている出力処理のコードをほぼそのまま使用。
88
- // ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
89
+ // 最適化や整理はしていない。
89
90
  all_freetimes = mergeTimes(all_freetimes);
90
91
 
91
92
  ok_time.unshift('誰か一人でも空いている時間');
@@ -93,7 +94,7 @@
93
94
  for (var l = 0; l < all_freetimes.length; l++) {
94
95
  var dateString = convert2String(all_freetimes[l][0], false);
95
96
  var week1 = new Date(all_freetimes[l][0])
96
- var week_add = weekAdd(week1) //曜日(jp)
97
+ var week_add = weekAdd(week1)
97
98
  var weekNum = week1.getDay();
98
99
  //曜日の指定と実際の曜日を判定してフラグを設定する
99
100
  setFlag = weekFlag(weekNum, nyuuryoku_data)
@@ -107,5 +108,8 @@
107
108
  for (var n = 2, p = list2.getLastColumn()+1, q = 0; q < ok_time.length; n++, q++) {
108
109
  list2.getRange(n, p).setValue(ok_time[q]);
109
110
  }
111
+
112
+ /*------------------------------- 追加ここまで------------------------------*/
113
+
110
- }
114
+ } // main関数の末尾。
111
115
  ```

12

 

2022/05/07 14:04

投稿

退会済みユーザー
test CHANGED
@@ -83,7 +83,9 @@
83
83
  ok_time = empty //配列を空にする
84
84
  }
85
85
 
86
+ // ここから追加
86
- // ここから追加 ※1行目と最後から2行目の「list2.getLastColumn()+1」以外、ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
87
+ // ※1行目と最後から2行目の「list2.getLastColumn()+1」以外、
88
+ // ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
87
89
  all_freetimes = mergeTimes(all_freetimes);
88
90
 
89
91
  ok_time.unshift('誰か一人でも空いている時間');

11

 

2022/05/07 14:03

投稿

退会済みユーザー
test CHANGED
@@ -83,7 +83,7 @@
83
83
  ok_time = empty //配列を空にする
84
84
  }
85
85
 
86
- // ここから追加 ※1行目と最後以外、ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
86
+ // ここから追加 ※1行目と最後から2行目の「list2.getLastColumn()+1」以外、ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
87
87
  all_freetimes = mergeTimes(all_freetimes);
88
88
 
89
89
  ok_time.unshift('誰か一人でも空いている時間');

10

 

2022/05/07 14:02

投稿

退会済みユーザー
test CHANGED
@@ -83,7 +83,7 @@
83
83
  ok_time = empty //配列を空にする
84
84
  }
85
85
 
86
- // ここから追加
86
+ // ここから追加 ※1行目と最後以外、ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
87
87
  all_freetimes = mergeTimes(all_freetimes);
88
88
 
89
89
  ok_time.unshift('誰か一人でも空いている時間');

9

 

2022/05/07 02:34

投稿

退会済みユーザー
test CHANGED
@@ -39,19 +39,19 @@
39
39
  ...
40
40
  (以下略)
41
41
  ```
42
- このようにすることで、 all_freetimesは
42
+ このようにすることで、 all_freetimesは最終的に
43
43
  [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
44
44
  のように「全員分の空き時間が入った2次元配列」になります。
45
45
 
46
- あとはそれぞれの要素の[開始時間、終了時間]のうち、他の要素重なる部分をひとつづきにすればよい、ということになります。
46
+ あとは[開始時間、終了時間]の区間について、他の区間と重なる部分をひとつづきにすればよい(マージする)、ということになります。
47
47
 
48
- 次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
48
+ 次のような関数を用意します。(上記のような2次元配列を受け取り、重なる区間をひとつづきにした2次元配列を返す関数)
49
49
  ```js- リスト
50
50
  /*
51
51
  * times: 2次元配列
52
- * [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
52
+ *  [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
53
- * 各時間は整数のタイムスタンプ
53
+ *   (各時間は整数のタイムスタンプ
54
- * 返り値:区間を併合した [[開始時間、終了時間],...]の2次元配列
54
+ * 返り値:重なる区間ををマージした [[開始時間、終了時間],...]の2次元配列
55
55
  */
56
56
  function mergeTimes(times) {
57
57
  if (!times || times.length === 0) return [];

8

 

2022/05/06 23:54

投稿

退会済みユーザー
test CHANGED
@@ -47,6 +47,12 @@
47
47
 
48
48
  次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
49
49
  ```js- リスト
50
+ /*
51
+ * times: 2次元配列
52
+ * [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
53
+ * 各時間は整数のタイムスタンプ
54
+ * 返り値:各区間を併合した [[開始時間、終了時間],...]の2次元配列
55
+ */
50
56
  function mergeTimes(times) {
51
57
  if (!times || times.length === 0) return [];
52
58
  times.sort((a, b) => a[0] - b[0]);

7

 

2022/05/06 23:49

投稿

退会済みユーザー
test CHANGED
@@ -51,19 +51,19 @@
51
51
  if (!times || times.length === 0) return [];
52
52
  times.sort((a, b) => a[0] - b[0]);
53
53
  const result = [];
54
- let start = times[0][0];
54
+ let start = times[0][0]
55
55
  let end = times[0][1];
56
- for (let i = 0; i < times.length - 1; i++) {
56
+ for (let i = 1; i < times.length; i++) {
57
- if (end < times[i + 1][0]) {
57
+ if (end < times[i][0]) {
58
58
  result.push([start, end]);
59
- [start, end] = times[i + 1];
59
+ [start, end] = times[i];
60
60
  continue;
61
61
  }
62
- if (end < times[i + 1][1]) {
62
+ if (end < times[i][1]) {
63
- end = times[i + 1][1];
63
+ end = times[i][1];
64
64
  }
65
65
  }
66
- result.push([start, end]);
66
+ result.push([start, end])
67
67
  return result;
68
68
  }
69
69
  ```

6

修正

2022/05/06 21:00

投稿

退会済みユーザー
test CHANGED
@@ -55,7 +55,7 @@
55
55
  let end = times[0][1];
56
56
  for (let i = 0; i < times.length - 1; i++) {
57
57
  if (end < times[i + 1][0]) {
58
- result.push([...times[i]]);
58
+ result.push([start, end]);
59
59
  [start, end] = times[i + 1];
60
60
  continue;
61
61
  }

5

 

2022/05/06 20:04

投稿

退会済みユーザー
test CHANGED
@@ -48,7 +48,7 @@
48
48
  次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
49
49
  ```js- リスト
50
50
  function mergeTimes(times) {
51
- if (times == null || times.length === 0) return [];
51
+ if (!times || times.length === 0) return [];
52
52
  times.sort((a, b) => a[0] - b[0]);
53
53
  const result = [];
54
54
  let start = times[0][0];

4

 

2022/05/06 16:14

投稿

退会済みユーザー
test CHANGED
@@ -41,7 +41,7 @@
41
41
  ```
42
42
  このようにすることで、 all_freetimesは、
43
43
  [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
44
- のように「全員分の空き時間が入った配列2次元配列」になります。
44
+ のように「全員分の空き時間が入った2次元配列」になります。
45
45
 
46
46
  あとはそれぞれの要素の[開始時間、終了時間]のうち、他の要素重なる部分をひとつづきにすればよい、ということになります。
47
47
 

3

 

2022/05/06 16:13

投稿

退会済みユーザー
test CHANGED
@@ -45,8 +45,8 @@
45
45
 
46
46
  あとはそれぞれの要素の[開始時間、終了時間]のうち、他の要素重なる部分をひとつづきにすればよい、ということになります。
47
47
 
48
- 次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
48
+ 次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
49
- ```js
49
+ ```js- リスト
50
50
  function mergeTimes(times) {
51
51
  if (times == null || times.length === 0) return [];
52
52
  times.sort((a, b) => a[0] - b[0]);

2

 

2022/05/06 16:12

投稿

退会済みユーザー
test CHANGED
@@ -63,7 +63,7 @@
63
63
  end = times[i + 1][1];
64
64
  }
65
65
  }
66
- result.push([start, end])
66
+ result.push([start, end]);
67
67
  return result;
68
68
  }
69
69
  ```
@@ -78,7 +78,7 @@
78
78
  }
79
79
 
80
80
  // ここから追加
81
- all_freetimes = mergeTimes(all_freetimes)
81
+ all_freetimes = mergeTimes(all_freetimes);
82
82
 
83
83
  ok_time.unshift('誰か一人でも空いている時間');
84
84
 
@@ -97,7 +97,7 @@
97
97
  }
98
98
  // 結果シートに書き込む。
99
99
  for (var n = 2, p = list2.getLastColumn()+1, q = 0; q < ok_time.length; n++, q++) {
100
- list2.getRange(n, p).setValue(ok_time[q])
100
+ list2.getRange(n, p).setValue(ok_time[q]);
101
101
  }
102
102
  }
103
103
  ```

1

 

2022/05/06 16:10

投稿

退会済みユーザー
test CHANGED
@@ -45,7 +45,7 @@
45
45
 
46
46
  あとはそれぞれの要素の[開始時間、終了時間]のうち、他の要素重なる部分をひとつづきにすればよい、ということになります。
47
47
 
48
- 次のような関数を用意します。(上の2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
48
+ 次のような関数を用意します。(上ような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
49
49
  ```js
50
50
  function mergeTimes(times) {
51
51
  if (times == null || times.length === 0) return [];