質問編集履歴
2
説明を補足しました。自分なりにコードを解析して、怪しいと思われるところを記載しました。すみませんが、どうぞよろしくお願いいたします。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
下記記事をもとに、やってみたのですが、
|
|
2
2
|
出力がおかしいので、見ていただけたらと思います。
|
|
3
|
-
|
|
4
3
|
https://www.shanaidx.com/calendar_akijikan/
|
|
5
4
|
|
|
6
5
|

|
|
@@ -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,148 +110,5 @@
|
|
|
133
110
|
}
|
|
134
111
|
}
|
|
135
112
|
}
|
|
136
|
-
// 指定開始・終了時間を設定
|
|
137
|
-
cal_endtime.unshift(opening);
|
|
138
|
-
cal_endtime.push(date.setHours(23, 59, 59, 999)); //一日の終了時間
|
|
139
|
-
|
|
113
|
+
```
|
|
140
114
|
|
|
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
|
-
```
|
1
誤字
title
CHANGED
|
@@ -1,1 +1,1 @@
|
|
|
1
|
-
Google カレンダーから
|
|
1
|
+
Google カレンダーから複数人の共通の空き時間のみを抽出する
|
body
CHANGED
|
File without changes
|