回答編集履歴
6
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
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
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
追記
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
修正
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,
|
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
修正
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
|
|