回答編集履歴

6

2021/12/19 03:19

投稿

退会済みユーザー
test CHANGED
@@ -559,3 +559,9 @@
559
559
  (「Asia/Tokyo」になっていない場合は、「Asia/Tokyo」に直して保存)
560
560
 
561
561
  ![イメージ説明](4d65f0709bc8d82373da3e929823dac3.png)
562
+
563
+
564
+
565
+ ---
566
+
567
+ 参考に、配列から要素を除外する方法(splice関数)について書こうとしましたが、書くと文字数制限を超えるためここでは割愛します。必要があればコメントに記載します。

5

2021/12/19 03:19

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
- まずは、回答から。質問文コードの差異を下記に記載しました。(色付き行のち、先頭が「+」とってい行は追加、「-」となっている行は削除)
1
+ 直すすれば下記のなるでしょうか
2
2
 
3
3
  ```diff
4
4
 
@@ -366,8 +366,6 @@
366
366
 
367
367
 
368
368
 
369
-
370
-
371
369
  # 改善案
372
370
 
373
371
  元々のコードですが、同じ処理について列を変えて繰り返すコードを追加する過程で

4

2021/12/19 03:16

投稿

退会済みユーザー
test CHANGED
@@ -320,7 +320,7 @@
320
320
 
321
321
  ごく簡単に言えば、if文で「A || B」という形で使うと、AまたはBのどちらかが正の場合、文が実行されます。
322
322
 
323
- 参照:[||(論理和)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)
323
+ 参照:[MDN:||(論理和)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)
324
324
 
325
325
   
326
326
 
@@ -346,7 +346,7 @@
346
346
 
347
347
  元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
348
348
 
349
- 実際は常に16行目~最後の行まで込むようになってしまっています。
349
+ 実際は常に16行目~最後の行まで書き込むようになってしまっています。
350
350
 
351
351
  ここは、カレンダーを登録した行だけに書き込むようにする必要があります(下記)
352
352
 

3

追記

2021/12/19 02:52

投稿

退会済みユーザー
test CHANGED
@@ -366,6 +366,178 @@
366
366
 
367
367
 
368
368
 
369
+
370
+
371
+ # 改善案
372
+
373
+ 元々のコードですが、同じ処理について列を変えて繰り返すコードを追加する過程で
374
+
375
+ 列の指定を誤って修正してしまっていると思われる部分がところどころにあります。
376
+
377
+ 注意深くデバッグして正しく動けば問題ないのですが、現状のアプローチでは下記のような問題があります。
378
+
379
+
380
+
381
+ ・仮に登録処理の列が増えたり減ったりした場合に、4つのブロックそれぞれを変更しなければならなくなる。
382
+
383
+ ・その際にチェックが不足していると、同じような列指定ミスが発生する可能性が高くなる。
384
+
385
+
386
+
387
+ 2つ前の御質問と同様に、規則性を見出してまとめられるところはまとめた方が、変更に強く、バグを出しにくいコードになります。
388
+
389
+
390
+
391
+ たとえば今回で言えば、「各日付の4つの処理件名列と、登録済フラグを書き込む列はそれぞれ4列ずつ離れている」という規則性があります。
392
+
393
+ ![イメージ説明](2f15bc29bae1d4534e8f5568db68e4a3.png)
394
+
395
+  
396
+
397
+ そこで、「件名の取得とカレンダーへの登録、及び登録済フラグの書き込み」を1つの処理としてまとめ、
398
+
399
+ 列を1つずつ移動させればすっきりしたコードになります。
400
+
401
+
402
+
403
+ 下記では、もともとのforループ(targetRowを動かすループ)の中に、もう1つforループを加えています。
404
+
405
+ この追加したforループの中で、column という変数を0~3までループさせています。
406
+
407
+ 各処理対象に対して column 変数が示す値を加算することで、1列ずつ移動して処理を行っています。
408
+
409
+
410
+
411
+ ```js
412
+
413
+ // 4列分の処理をまとめたコード
414
+
415
+
416
+
417
+
418
+
419
+ function createEvent2() {
420
+
421
+ //▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
422
+
423
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
424
+
425
+ const mysheet1 = ss.getSheetByName("カレンダー転記用");
426
+
427
+ const calId = mysheet1.getRange(9, 3).getValue();
428
+
429
+ const cal = CalendarApp.getCalendarById(calId);
430
+
431
+ const targetRows = mysheet1.getRange('C13').getValue();
432
+
433
+ console.log("targetRows " + targetRows);
434
+
435
+
436
+
437
+ //予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
438
+
439
+ const endRow = targetRows + 15
440
+
441
+ console.log("endRow " + endRow);
442
+
443
+
444
+
445
+ for (let i = 16; i < endRow + 1; i++) {
446
+
447
+ const myRange = mysheet1.getRange(i, 4, 1, 4);
448
+
449
+ if (myRange.isBlank()) {
450
+
451
+ mysheet1.getRange(i, 12, 1, 1).setValue("対象外");
452
+
453
+ //getRange(行目,列目,●行分,●列分)
454
+
455
+ }
456
+
457
+ }
458
+
459
+
460
+
461
+ //▼データ取得範囲の指定
462
+
463
+ //各種予定のデータ取得範囲の指定 
464
+
465
+ //getRange(行目,列目,●行分,●列分)
466
+
467
+ //予定配列>>セルB16(行16,列2)~L列まで 
468
+
469
+ const eventRange = mysheet1.getRange(16, 2, targetRows, 11);
470
+
471
+ console.log("eventRange " + eventRange.getA1Notation());
472
+
473
+
474
+
475
+ //▼各予定データを配列(myEvent)として取得する
476
+
477
+ const myEvent = eventRange.getValues();
478
+
479
+ Logger.log(myEvent);
480
+
481
+
482
+
483
+ //▼各日付ごとに処理する
484
+
485
+ for (let i = 0; i < targetRows; i++) {
486
+
487
+ let myDate = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
488
+
489
+ let ngFlag = myEvent[i][10]; //「対象外フラグ」は起点B16から下にi行、右に10 
490
+
491
+ // 「対象外」であればスキップして次の行へ。
492
+
493
+ if (ngFlag === "対象外") {
494
+
495
+ continue;
496
+
497
+ }
498
+
499
+ //▼「①~④予定」を一列ずつ処理(column:0~3までループ)
500
+
501
+ for (let column = 0; column < 4; column++) {
502
+
503
+ let flag = myEvent[i][6 + column]; //「①~④登録済フラグ」は起点B16から下にi行、右に6+column
504
+
505
+ // 「登録済」であればスキップして隣の列へ。
506
+
507
+ if (flag === "登録済") {
508
+
509
+ continue;
510
+
511
+ }
512
+
513
+ //「予定名(title)」を取得
514
+
515
+ let title = myEvent[i][2 + column]; //「①~④予定名」は起点0(B16)から下にi行、右に2+column
516
+
517
+
518
+
519
+ //▼カレンダーへの予定登録
520
+
521
+ cal.createAllDayEvent(title, new Date(myDate));
522
+
523
+ //▼スプレッドシートへの「登録済」フラグ記載
524
+
525
+ mysheet1.getRange(16 + i, 8 + column, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
526
+
527
+ }
528
+
529
+ }
530
+
531
+ //▼ダイアログMsgの表示
532
+
533
+ Browser.msgBox("Googleカレンダーへの転記作業が完了しました。\n登録内容はカレンダー転記シートで確認してください。", Browser.Buttons.OK);
534
+
535
+ }
536
+
537
+ ```
538
+
539
+
540
+
369
541
  # その他
370
542
 
371
543
 

2

修正

2021/12/19 02:45

投稿

退会済みユーザー
test CHANGED
@@ -206,7 +206,7 @@
206
206
 
207
207
  - mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
208
208
 
209
- + mysheet1.getRange(16 + i, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
209
+ + mysheet1.getRange(16 + i, 10, 1, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
210
210
 
211
211
  }
212
212
 
@@ -346,21 +346,25 @@
346
346
 
347
347
  元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
348
348
 
349
- 実際は常に16行目に書き込むようになってしまっています。
349
+ 実際は常に16行目~最後の行まで込むようになってしまっています。
350
-
350
+
351
- ここは、カレンダーを登録した行に書き込むようにする必要があります(下記)
351
+ ここは、カレンダーを登録した行だけに書き込むようにする必要があります(下記)
352
+
353
+
354
+
355
+ ```diff
356
+
357
+ //▼スプレッドシートへの「登録済」フラグ記載
358
+
359
+ //getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
360
+
361
+ - //mysheet1.getRange(16, 8, targetRows, 1).setValue("登録済"); //スプシH列に「登録済」と追記
362
+
363
+ + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
352
364
 
353
365
  ```
354
366
 
355
- //▼スプレッドシートへの「登録済」フラグ記載
367
+
356
-
357
- //getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
358
-
359
- - //mysheet1.getRange(16, 8, targetRows, 1).setValue("登録済"); //スプシH列に「登録済」と追記
360
-
361
- + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
362
-
363
- ```
364
368
 
365
369
  # その他
366
370
 

1

修正

2021/12/19 02:01

投稿

退会済みユーザー
test CHANGED
@@ -206,7 +206,7 @@
206
206
 
207
207
  - mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
208
208
 
209
- + mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
209
+ + mysheet1.getRange(16 + i, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
210
210
 
211
211
  }
212
212
 
@@ -342,7 +342,25 @@
342
342
 
343
343
 
344
344
 
345
-
345
+ (3)「登録済」フラグの書き込み
346
+
347
+ 元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
348
+
349
+ 実際は常に16行目に書き込むようになってしまっています。
350
+
351
+ ここは、カレンダーを登録した行に書き込むようにする必要があります(下記)
352
+
353
+ ```
354
+
355
+ //▼スプレッドシートへの「登録済」フラグ記載
356
+
357
+ //getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
358
+
359
+ - //mysheet1.getRange(16, 8, targetRows, 1).setValue("登録済"); //スプシH列に「登録済」と追記
360
+
361
+ + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
362
+
363
+ ```
346
364
 
347
365
  # その他
348
366