回答編集履歴
1
test
CHANGED
@@ -436,152 +436,144 @@
|
|
436
436
|
|
437
437
|
|
438
438
|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
439
|
+
// edgeが示す時刻<targetの終了時刻の間、通常の分割処理を行う
|
440
|
+
|
441
|
+
while (edge.getTime() < endTime.getTime()) {
|
442
|
+
|
443
|
+
// 分割した時刻の端点をresultに格納
|
444
|
+
|
445
|
+
result.push([start, edge]);
|
446
|
+
|
447
|
+
|
448
|
+
|
449
|
+
// startを現在のedgeの時刻に更新する。
|
450
|
+
|
451
|
+
start = new Date(edge);
|
452
|
+
|
453
|
+
|
454
|
+
|
455
|
+
// edgeを区切り時間分だけ進める。
|
456
|
+
|
457
|
+
edge = ruler.getNextEdge();
|
458
|
+
|
459
|
+
}
|
460
|
+
|
461
|
+
|
462
|
+
|
463
|
+
// 4.edgeが示す時刻≧targetの終了時刻になったら
|
464
|
+
|
465
|
+
// 最後のピースを格納して分割を終了
|
466
|
+
|
467
|
+
result.push([start, endTime]);
|
468
|
+
|
469
|
+
|
470
|
+
|
471
|
+
// 結果の表示
|
472
|
+
|
473
|
+
Logger.log(result.map(e =>
|
474
|
+
|
475
|
+
Utilities.formatDate(e[0],"Asia/Tokyo","MM/dd HH:mm:ss")+ "~"
|
476
|
+
|
477
|
+
+ Utilities.formatDate(e[1],"Asia/Tokyo","MM/dd HH:mm:ss")).join('\n'));
|
478
|
+
|
479
|
+
}
|
480
|
+
|
481
|
+
|
482
|
+
|
483
|
+
```
|
484
|
+
|
485
|
+
|
486
|
+
|
487
|
+
---
|
488
|
+
|
489
|
+
|
490
|
+
|
491
|
+
#【補足】
|
492
|
+
|
493
|
+
|
494
|
+
|
495
|
+
> 現在3日以上の長さのイベントが考慮されていない
|
496
|
+
|
497
|
+
|
498
|
+
|
499
|
+
御記載の通り、元質問文では、イベントの長さに対応した固定の配列を用意しておき
|
500
|
+
|
501
|
+
for文でその配列の要素を順番に呼び出して、スケジュールを分割しようとされています。
|
502
|
+
|
503
|
+
```js
|
504
|
+
|
505
|
+
const point = ['6:00', '8:00', '18:00', '22:00', '30:00', '32:00', '42:00', '46:00'];
|
506
|
+
|
507
|
+
略
|
508
|
+
|
509
|
+
// startTime以降の最初の時間を取得
|
510
|
+
|
511
|
+
for (let i of point) {
|
512
|
+
|
513
|
+
(以下略)
|
514
|
+
|
515
|
+
```
|
516
|
+
|
517
|
+
|
518
|
+
|
519
|
+
しかし、無限の長さの固定配列を用意する必要はありません。
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
区切り時刻のデータは1日分の繰り返しになっているので、24時間ごとに同じ間隔が繰り返されます。
|
524
|
+
|
525
|
+
|
526
|
+
|
527
|
+
```text
|
528
|
+
|
529
|
+
['6:00', '8:00', '18:00', '22:00']
|
530
|
+
|
531
|
+
|
532
|
+
|
533
|
+
=> 区切り時間の間隔は、「2時間、10時間、4時間、8時間・・・」の繰り返し
|
534
|
+
|
535
|
+
|
536
|
+
|
537
|
+
```
|
538
|
+
|
539
|
+
したがって、1つの区切り時刻のデータから、**順番に**時間間隔を取り出せる仕組みがあればよいということになります。
|
540
|
+
|
541
|
+
|
542
|
+
|
543
|
+
これを実現しているのが、BreakPointsRulerクラス内のgetNextEdge()関数になります。
|
544
|
+
|
545
|
+
|
546
|
+
|
547
|
+
```js
|
548
|
+
|
549
|
+
|
550
|
+
|
551
|
+
this.counter = 0;
|
552
|
+
|
553
|
+
(略)
|
554
|
+
|
555
|
+
getNextEdge() {
|
556
|
+
|
557
|
+
// edgeに区切り時間を加算
|
558
|
+
|
559
|
+
this.edge = new Date(this.edge.getTime() + this.intervals[this.counter]);
|
560
|
+
|
561
|
+
// カウンターをインクリメント。
|
562
|
+
|
563
|
+
// ただし配列長に一致した場合はゼロに戻す。
|
564
|
+
|
565
|
+
this.counter++;
|
566
|
+
|
567
|
+
if (this.counter % this.intervals.length === 0) this.counter = 0;
|
568
|
+
|
569
|
+
|
570
|
+
|
571
|
+
return new Date(this.edge.getTime());
|
474
572
|
|
475
573
|
}
|
476
574
|
|
477
|
-
|
478
|
-
|
479
|
-
// 結果の表示
|
480
|
-
|
481
|
-
Logger.log(result.map(e =>
|
482
|
-
|
483
|
-
Utilities.formatDate(e[0],"Asia/Tokyo","MM/dd HH:mm:ss")+ "~"
|
484
|
-
|
485
|
-
+ Utilities.formatDate(e[1],"Asia/Tokyo","MM/dd HH:mm:ss")).join('\n'));
|
486
|
-
|
487
|
-
}
|
488
|
-
|
489
|
-
|
490
|
-
|
491
575
|
```
|
492
576
|
|
493
|
-
|
494
|
-
|
495
|
-
---
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
#【補足】
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
> 現在3日以上の長さのイベントが考慮されていない
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
御記載の通り、元質問文では、イベントの長さに対応した固定の配列を用意しておき
|
508
|
-
|
509
|
-
for文でその配列の要素を順番に呼び出して、スケジュールを分割しようとされています。
|
510
|
-
|
511
|
-
```js
|
512
|
-
|
513
|
-
const point = ['6:00', '8:00', '18:00', '22:00', '30:00', '32:00', '42:00', '46:00'];
|
514
|
-
|
515
|
-
略
|
516
|
-
|
517
|
-
// startTime以降の最初の時間を取得
|
518
|
-
|
519
|
-
for (let i of point) {
|
520
|
-
|
521
|
-
(以下略)
|
522
|
-
|
523
|
-
```
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
しかし、無限の長さの固定配列を用意する必要はありません。
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
区切り時刻のデータは1日分の繰り返しになっているので、24時間ごとに同じ間隔が繰り返されます。
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
```text
|
536
|
-
|
537
|
-
['6:00', '8:00', '18:00', '22:00']
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
=> 区切り時間の間隔は、「2時間、10時間、4時間、8時間・・・」の繰り返し
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
```
|
546
|
-
|
547
|
-
したがって、1つの区切り時刻のデータから、**順番に**時間間隔を取り出せる仕組みがあればよいということになります。
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
これを実現しているのが、BreakPointsRulerクラス内のgetNextEdge()関数になります。
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
```js
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
this.counter = 0;
|
560
|
-
|
561
|
-
(略)
|
562
|
-
|
563
|
-
getNextEdge() {
|
564
|
-
|
565
|
-
// edgeに区切り時間を加算
|
566
|
-
|
567
|
-
this.edge = new Date(this.edge.getTime() + this.intervals[this.counter]);
|
568
|
-
|
569
|
-
// カウンターをインクリメント。
|
570
|
-
|
571
|
-
// ただし配列長に一致した場合はゼロに戻す。
|
572
|
-
|
573
|
-
this.counter++;
|
574
|
-
|
575
|
-
if (this.counter % this.intervals.length === 0) this.counter = 0;
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
return new Date(this.edge.getTime());
|
580
|
-
|
581
|
-
}
|
582
|
-
|
583
|
-
```
|
584
|
-
|
585
577
|
getIntervals関数にて、区切り時刻のデータ ['6:00', '8:00', '18:00', '22:00']を
|
586
578
|
|
587
579
|
あらかじめ、時間間隔の配列intervalsに変換して保持しておきます。
|
@@ -630,7 +622,11 @@
|
|
630
622
|
|
631
623
|
|
632
624
|
|
625
|
+
このようにすることで、たとえばintervalsの要素数が4つの場合、
|
626
|
+
|
627
|
+
counterは、0 -> 1 -> 2 -> 3 -> 0 -> 1 -> 2 -> 3...
|
628
|
+
|
633
|
-
|
629
|
+
と無限に繰り返すことになり、順番に区切り時刻の間隔を呼び出せます。
|
634
630
|
|
635
631
|
|
636
632
|
|