回答編集履歴

1

2021/11/20 10:00

投稿

退会済みユーザー
test CHANGED
@@ -436,152 +436,144 @@
436
436
 
437
437
 
438
438
 
439
- while (true) {
440
-
441
- // edgeが示す時刻<targetの終了時刻の間は、通常の分割処理を行う
442
-
443
- if (edge.getTime() < endTime.getTime()) {
444
-
445
- // 分割した時刻の端点をresultに格納
446
-
447
- result.push([start, edge]);
448
-
449
-
450
-
451
- // startを現在のedgeの時刻に更新する。
452
-
453
- start = new Date(edge);
454
-
455
-
456
-
457
- // edgeを区切り時間分だけ進める。
458
-
459
- edge = ruler.getNextEdge();
460
-
461
-
462
-
463
- } else {
464
-
465
- // 4.edgeが示す時刻≧targetの終了時刻になったら
466
-
467
- // 最後のピースを格納して分割を終了
468
-
469
- result.push([start, endTime]);
470
-
471
- break;
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