回答編集履歴
23
test
CHANGED
@@ -125,7 +125,7 @@
|
|
125
125
|
|
126
126
|
-------
|
127
127
|
# 補足
|
128
|
-
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合
|
128
|
+
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合を併合した表現」に過ぎません。
|
129
129
|
「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
|
130
130
|
(以下は「途中での交代が許容されていない」というのが前提です。途中での交代がOKならばこの限りではありません)
|
131
131
|
|
22
test
CHANGED
@@ -127,7 +127,7 @@
|
|
127
127
|
# 補足
|
128
128
|
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合のうち重なっている区間を併合した表現」に過ぎません。
|
129
129
|
「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
|
130
|
-
(以下は「途中での交代が許容されていない」というのが前提です。
|
130
|
+
(以下は「途中での交代が許容されていない」というのが前提です。途中での交代がOKならばこの限りではありません)
|
131
131
|
|
132
132
|
たとえば、
|
133
133
|
・Aさんの空き時間が 10:30~11:00
|
21
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
|
-
しかし、業務がこの
|
140
|
+
しかし、「業務がこの『10:30~11:30』の範囲内にあれば、必ず誰か1人以上が対応できる」というわけではありません。
|
140
|
-
途中
|
141
|
+
(途中交代が許容されていない場合)たとえば、「10:50~11:15」 の業務には、誰も対応できません。
|
141
142
|
|
20
test
CHANGED
@@ -125,8 +125,8 @@
|
|
125
125
|
|
126
126
|
-------
|
127
127
|
# 補足
|
128
|
-
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「
|
128
|
+
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「各人の空き時間の集合のうち重なっている区間を併合した表現」に過ぎません。
|
129
|
-
「得られた時間帯の範囲内であればいつでも誰か1人
|
129
|
+
「得られた時間帯の範囲内であればいつでも誰か1人以上対応できる」というわけではないことに注意が必要です。
|
130
130
|
|
131
131
|
たとえば、
|
132
132
|
・Aさんの空き時間が 10:30~11:00
|
19
test
CHANGED
@@ -125,7 +125,7 @@
|
|
125
125
|
|
126
126
|
-------
|
127
127
|
# 補足
|
128
|
-
なお、上記はコメントで
|
128
|
+
なお、上記はコメントでのヒヤリングに基づいていますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
|
129
129
|
「得られた時間帯の範囲内であればいつでも誰か1人が対応できる」というわけではないことに注意が必要です。
|
130
130
|
|
131
131
|
たとえば、
|
18
test
CHANGED
@@ -126,7 +126,7 @@
|
|
126
126
|
-------
|
127
127
|
# 補足
|
128
128
|
なお、上記はコメントで得られた要求定義に基づいて回答していますが、このコードで得られる時間帯は、あくまでも「誰か1人以上空き時間となっている時間帯から重なりを除外した表現」に過ぎません。
|
129
|
-
|
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
test
CHANGED
@@ -137,5 +137,5 @@
|
|
137
137
|
上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
|
138
138
|
|
139
139
|
しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
|
140
|
-
|
140
|
+
途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
|
141
141
|
|
16
test
CHANGED
@@ -131,11 +131,11 @@
|
|
131
131
|
たとえば、
|
132
132
|
・Aさんの空き時間が 10:30~11:00
|
133
133
|
・Bさんの空き時間が 11:00~11:30
|
134
|
-
・確保したい時間が
|
134
|
+
・確保したい時間が25分
|
135
135
|
・移動時間は0
|
136
136
|
と仮定した場合、
|
137
137
|
上記のプログラムでは 「誰か1人以上空いている時間帯」は「10:30~11:30」と表示されます。
|
138
138
|
|
139
139
|
しかし、業務がこの「10:30~11:30」の範囲内にあれば誰かが対応できるというわけではありません。
|
140
|
-
たとえば、途中での交代が許容されていない限り「10:
|
140
|
+
たとえば、途中での交代が許容されていない限り「10:50~11:15」 の会議には、誰も対応できません。
|
141
141
|
|
15
追記
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
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
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
|
-
// ※
|
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)
|
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
test
CHANGED
@@ -83,7 +83,9 @@
|
|
83
83
|
ok_time = empty //配列を空にする
|
84
84
|
}
|
85
85
|
|
86
|
+
// ここから追加
|
86
|
-
//
|
87
|
+
// ※1行目と最後から2行目の「list2.getLastColumn()+1」以外、
|
88
|
+
// ほぼ質問文記載のコードをそのままコピー。最適化や整理はしていない。
|
87
89
|
all_freetimes = mergeTimes(all_freetimes);
|
88
90
|
|
89
91
|
ok_time.unshift('誰か一人でも空いている時間');
|
11
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
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
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次元配列を受け取り、重なる
|
48
|
+
次のような関数を用意します。(上記のような2次元配列を受け取り、重なる区間をひとつづきにした2次元配列を返す関数)
|
49
49
|
```js- リスト
|
50
50
|
/*
|
51
51
|
* times: 2次元配列
|
52
|
-
* [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
|
52
|
+
* [[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
|
53
|
-
* 各時間は整数のタイムスタンプ
|
53
|
+
* (各時間は整数のタイムスタンプ)
|
54
|
-
* 返り値:
|
54
|
+
* 返り値:重なる区間ををマージした [[開始時間、終了時間],...]の2次元配列
|
55
55
|
*/
|
56
56
|
function mergeTimes(times) {
|
57
57
|
if (!times || times.length === 0) return [];
|
8
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
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 =
|
56
|
+
for (let i = 1; i < times.length; i++) {
|
57
|
-
if (end < times[i
|
57
|
+
if (end < times[i][0]) {
|
58
58
|
result.push([start, end]);
|
59
|
-
[start, end] = times[i
|
59
|
+
[start, end] = times[i];
|
60
60
|
continue;
|
61
61
|
}
|
62
|
-
if (end < times[i
|
62
|
+
if (end < times[i][1]) {
|
63
|
-
end = times[i
|
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
修正
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([
|
58
|
+
result.push([start, end]);
|
59
59
|
[start, end] = times[i + 1];
|
60
60
|
continue;
|
61
61
|
}
|
5
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
次のような関数を用意します。(上記のような2次元配列を受け取り、重なる部分をひとつづきにした2次元配列を返す関数)
|
49
49
|
```js- リスト
|
50
50
|
function mergeTimes(times) {
|
51
|
-
if (times
|
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
test
CHANGED
@@ -41,7 +41,7 @@
|
|
41
41
|
```
|
42
42
|
このようにすることで、 all_freetimesは、
|
43
43
|
[[開始時間、終了時間], [開始時間、終了時間], [開始時間、終了時間],...]
|
44
|
-
のように「全員分の空き時間が入った
|
44
|
+
のように「全員分の空き時間が入った2次元配列」になります。
|
45
45
|
|
46
46
|
あとはそれぞれの要素の[開始時間、終了時間]のうち、他の要素重なる部分をひとつづきにすればよい、ということになります。
|
47
47
|
|
3
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
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
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 [];
|