質問編集履歴
2
説明を補足しました。自分なりにコードを解析して、怪しいと思われるところを記載しました。すみませんが、どうぞよろしくお願いいたします。
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
|
-
|
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
誤字
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Google カレンダーから
|
1
|
+
Google カレンダーから複数人の共通の空き時間のみを抽出する
|
test
CHANGED
File without changes
|