前提・実現したいこと
独学で勉強を始めたばかりで、コードが読みづらかったらすみません。
GASでGoogleカレンダーの一定期間内のイベントをすべて取得し、
時間を区間別6:00~8:00
8:00~18:00
18:00~22:00
22:00~6:00
に集計させるシステムを作っています。
下記コードが、イベント一つひとつを設定時間で区切り、配列を組みなおす部分です。
main()
内startTime
endTime
は取り出した一つのイベントの開始時刻、終了時刻です。
ご質問は、
separateTime()
の簡略化getFirst()
の一般化(現在3日以上の長さのイベントが考慮されていない)- もっと簡単な集計方法 or 考え方はないか?
です。
お知恵をお貸しいただけたら幸いです。
よろしくお願いいたします。
GAS
1function main() { 2 const startTime = new Date('2021/11/19 23:00') 3 const endTime = new Date('2021/11/20 7:00') 4 5 Logger.log(separateTime(startTime, endTime)) 6 // {blocks=[[Fri Nov 19 23:00:00 GMT+09:00 2021, Sat Nov 20 06:00:00 GMT+09:00 2021], [Sat Nov 20 06:00:00 GMT+09:00 2021, Sat Nov 20 07:00:00 GMT+09:00 2021]], 7 // diff=[7.0, 1.0], 8 // index=4.0} 9}
GAS
1// sepの時間で分割する 2function separateTime(startTime, endTime) { 3 const separatePoints = getFirst(startTime); 4 const sep = separatePoints[0]; 5 const index = separatePoints[1]; 6 7 8 if (!(sep < endTime)) { 9 return { 10 blocks : [[startTime, endTime]], 11 diff : [(endTime - startTime) / 1000 / 3600], 12 index : index 13 }; 14 } 15 16 const sep2 = getFirst(sep); 17 if (!(sep2 < endTime)) { 18 return { 19 blocks : [[startTime, sep], [sep, endTime]], 20 diff : [(sep - startTime) / 1000 / 3600, (endTime - sep) / 1000 / 3600], 21 index : index 22 }; 23 } 24 25 const sep3 = getFirst(sep2); 26 if (!(sep3 < endTime)) { 27 return { 28 blocks : [[startTime, sep], [sep, sep2], [sep2, endTime]], 29 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (endTime - sep2) / 1000 / 3600], 30 index : index 31 }; 32 } 33 34 const sep4 = getFirst(sep3); 35 if (!(sep4 < endTime)) { 36 return { 37 blocks : [[startTime, sep], [sep, sep2], [sep2, sep3], [sep3, endTime]], 38 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (sep3 - sep2) / 1000 / 3600, (endTime - sep3) / 1000 / 3600], 39 index : index 40 }; 41 } 42 43 const sep5 = getFirst(sep4); 44 if (!(sep5 < endTime)) { 45 return { 46 blocks : [[startTime, sep], [sep, sep2], [sep2, sep3], [sep3, sep4], [sep4, endTime]], 47 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (sep3 - sep2) / 1000 / 3600, (sep4 - sep3) / 1000 / 3600, (endTime - sep4) / 1000 / 3600], 48 index : index 49 }; 50 } 51 52 const sep6 = getFirst(sep5); 53 if (!(sep6 < endTime)) { 54 return { 55 blocks : [[startTime, sep], [sep, sep2], [sep2, sep3], [sep3, sep4], [sep4, sep5], [sep5, endTime]], 56 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (sep3 - sep2) / 1000 / 3600, (sep4 - sep3) / 1000 / 3600, (sep5 - sep4) / 1000 / 3600, (endTime - sep5) / 1000 / 3600], 57 index : index 58 }; 59 } 60 61 const sep7 = getFirst(sep6); 62 if (!(sep7 < endTime)) { 63 return { 64 blocks : [[startTime, sep], [sep, sep2], [sep2, sep3], [sep3, sep4], [sep4, sep5], [sep5, sep6], [sep6, endTime]], 65 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (sep3 - sep2) / 1000 / 3600, (sep4 - sep3) / 1000 / 3600, (sep5 - sep4) / 1000 / 3600, (sep6 - sep5) / 1000 / 3600, (endTime - sep6) / 1000 / 3600], 66 index : index 67 }; 68 } 69 70 return { 71 blocks : [[startTime, sep], [sep, sep2], [sep2, sep3], [sep3, sep4], [sep4, sep5], [sep5, sep6], [sep6, sep7], [sep7, endTime]], 72 diff : [(sep - startTime) / 1000 / 3600, (sep2 - sep) / 1000 / 3600, (sep3 - sep2) / 1000 / 3600, (sep4 - sep3) / 1000 / 3600, (sep5 - sep4) / 1000 / 3600, (sep6 - sep5) / 1000 / 3600, (sep7 - sep6) / 1000 / 3600, (endTime - sep7) / 1000 / 3600], 73 index : index 74 }; 75}
GAS
1// startTimeに合わせて初期値を取得 2function getFirst(startTime) { 3 const point = ['6:00', '8:00', '18:00', '22:00', '30:00', '32:00', '42:00', '46:00']; 4 5 const start = new Date(startTime); 6 const d = []; 7 8 // startTime以降の最初の時間を取得 9 for (let i of point) { 10 start.setHours(i.match(/.*:/)[0].replace(':', '')); 11 start.setMinutes(i.match(/:.*/)[0].replace(':', '')); 12 d.push(Math.floor((start - startTime) / 1000 / 3600)); 13 } 14 15 const index = d.findIndex(function(element){ 16 return element > 0 && function (a, b) {return Math.min(a, b);}; 17 }); 18 19 const ret = new Date(startTime); 20 ret.setHours(point[index].match(/.*:/)[0].replace(':', '')); 21 ret.setMinutes(point[index].match(/:.*/)[0].replace(':', '')); 22 23 return [ret, index]; 24}
回答1件
あなたの回答
tips
プレビュー