回答編集履歴

12

 

2022/01/23 03:15

投稿

退会済みユーザー
test CHANGED
@@ -106,8 +106,11 @@
106
106
  (きちんと対応するには、「登録済の行はスキップする」という処理を追加しないといけないかもしれませんが)
107
107
 
108
108
  **デメリット:**
109
- スプレッドシートへの記録する処理の分だけ時間がかかります。
109
+ スプレッドシート記録する処理の分だけ時間が余計にかかります。
110
- スプシへの書き込み処理のAPI消費がわずかだとしても、直接方式よりAPIを多く消費することに変わりはない為、制限がかかる可能性もあります。
110
+ また、スプシへの書き込み処理のAPI消費がわずかだとしても、直接方式よりAPIを多く消費することに変わりはない為、制限がかかる可能性もあります。
111
111
  コピー全体の処理が制限時間(無料のGoogle Workspaceならば6分)を超えそうな場合は、たとえば5分ごとに分割して処理を行う等の工夫が必要になります。
112
112
  もっとも、カレンダーからカレンダーへ直接コピーする場合も、API制限と処理時間にひっかかる可能性はあります。
113
+ 仮に直接方式でも時間制限に引っかかる場合は、どこまでコピー完了したかについて、ログまたはコピー先のカレンダーを確認しないとわかりません。
114
+ ログに表示されている内容は一時的なものですし、プログラム上で扱おうと思っても難しいです。(ログテキストを手動コピーして加工する必要あり)
115
+ 処理経過を記録できるスプレッドシート経由方式の方が、プログラムで簡単に扱えます。
113
116
 

11

  

2022/01/23 02:51

投稿

退会済みユーザー
test CHANGED
@@ -70,7 +70,7 @@
70
70
  for (let i = 0; i < maxRow2 - 2; i++) {
71
71
 
72
72
  「iは 0 から < maxRow2 - 2 = 10-2 =8未満("<"なので)」すなわち
73
- 「iは 0 から 7 まで」の**8行分**、ループを回すことになります。
73
+ 「iは 0 から **7 まで**」の8行分、ループを回すことになります。
74
74
 
75
75
  よって、ループの最後 i=7 のとき、
76
76
  `myEvent[7]`にアクセスすることになりますが

10

 

2022/01/23 02:26

投稿

退会済みユーザー
test CHANGED
@@ -51,9 +51,10 @@
51
51
 
52
52
  eventRange = mySheet.getRange(4, 3, 7, 3);
53
53
  となるので
54
- eventRangeの行範囲は 4行目から、**7行分** です。
54
+ (第3引数が「7」なので)eventRangeの行範囲は**7行分** です。
55
+ (言い方を変えると、4行目から10行目までの7行分です)
55
56
 
56
- したがってmyEventは、7行×3列の2次元配列になます。
57
+ したがってmyEventは、7行×3列の2次元配列になっています。
57
58
  myEventのデータが7行ということは
58
59
  myEventの1次元目のインデックスの最大値は「7」ではなく「6」(**0始まりで7番目**)になっています。
59
60
 

9

 

2022/01/23 02:01

投稿

退会済みユーザー
test CHANGED
@@ -65,8 +65,11 @@
65
65
  let title = myEvent[i][2];
66
66
  ```
67
67
  このコードだと
68
+
69
+ for (let i = 0; i < maxRow2 - 2; i++) {
70
+
68
- 「iは0からmaxRow2 - 2 = 10-2 =8未満」すなわち
71
+ 「iは 0 から < maxRow2 - 2 = 10-2 =8未満("<"なので)」すなわち
69
- 「iは0から7まで」の**8行分**、ループを回すことになります。
72
+ 「iは 0 から 7 まで」の**8行分**、ループを回すことになります。
70
73
 
71
74
  よって、ループの最後 i=7 のとき、
72
75
  `myEvent[7]`にアクセスすることになりますが

8

 

2022/01/23 01:59

投稿

退会済みユーザー
test CHANGED
@@ -44,7 +44,14 @@
44
44
  const myEvent = eventRange.getValues();
45
45
  ```
46
46
  ここで、仮にシートの10行目までデータが入っていて、maxRow2=10だと仮定します。
47
+  
48
+ eventRange = mySheet.getRange(4, 3, maxRow2 - 3, 3);
49
+
50
+ eventRange = mySheet.getRange(4, 3, 10 - 3, 3);
51
+
52
+ eventRange = mySheet.getRange(4, 3, 7, 3);
53
+ となるので
47
- eventRangeの行範囲は 4行目から、10-4+1=**7行分** です。
54
+ eventRangeの行範囲は 4行目から、**7行分** です。
48
55
 
49
56
  したがってmyEventは、7行×3列の2次元配列になります。
50
57
  myEventのデータが7行ということは

7

 

2022/01/23 01:57

投稿

退会済みユーザー
test CHANGED
@@ -30,7 +30,9 @@
30
30
  ```
31
31
  ---
32
32
  **・エラーの原因について**
33
+ 76行目はfor文の部分だと思いますが、その行より前をさかのぼって
33
- 76行目前後の eventRangeとmyEventを定義している部分について
34
+ eventRange myEvent を定義している部分について見てみましょう。
35
+
34
36
  ```
35
37
  //getRange(行目,列目,●行分,●列分)
36
38
  //起点はセルC4(行4,列3)~L列まで 

6

修正

2022/01/23 01:53

投稿

退会済みユーザー
test CHANGED
@@ -42,7 +42,7 @@
42
42
  const myEvent = eventRange.getValues();
43
43
  ```
44
44
  ここで、仮にシートの10行目までデータが入っていて、maxRow2=10だと仮定します。
45
- eventRangeの行範囲は 3行目から、10-3=**7行分** です。
45
+ eventRangeの行範囲は 4行目から、10-4+1=**7行分** です。
46
46
 
47
47
  したがってmyEventは、7行×3列の2次元配列になります。
48
48
  myEventのデータが7行ということは

5

 

2022/01/23 01:50

投稿

退会済みユーザー
test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
  **デメリット:**
96
96
  スプレッドシートへの記録する処理の分だけ、時間がかかります。
97
- APIをさん消費、制限がかかる可能性もあります。
97
+ スプシへの書き込み処理のAPI消費がわずかだとしても、直接方式よりAPIく消費することに変わりはない為、制限がかかる可能性もあります。
98
98
  コピー全体の処理が制限時間(無料のGoogle Workspaceならば6分)を超えそうな場合は、たとえば5分ごとに分割して処理を行う等の工夫が必要になります。
99
99
  もっとも、カレンダーからカレンダーへ直接コピーする場合も、API制限と処理時間にひっかかる可能性はあります。
100
100
 

4

 

2022/01/23 01:45

投稿

退会済みユーザー
test CHANGED
@@ -86,14 +86,15 @@
86
86
  **「スプレッドシート」経由のメリット:**
87
87
  カレンダー→カレンダーへの直接コピーの場合、仮に途中でバグやGASの実行制限時間を超えた等の理由でスクリプト止まってしまった場合
88
88
  どこまでデータをコピー完了したのかが記録されていないため、コピー先のカレンダーの内容を確認する必要が生じます。
89
+ 現状は、スプレッドシートに記載したスケジュールイベントを、全部コピー先から削除するようになっているようなので問題はないかもしれませんが
89
- 最初からやり直とすでに完了した部分は重複して記録されてしまいます。
90
+ 仮にこの処理を変更して、削除せずにコピーする方法に変え場合、すでにコピーが完了したスケジュールは重複して記録されてしまいます。
90
91
 
91
92
  スプレッドシートに、転記元のスケジュールデータとコピー先へのコピー状況を記録することで、このような事態に対応しやすくなります。
92
- (きちんと対応するには、スクリト内容見直さないといけないかもしれませんが)
93
+ (きちんと対応するには、「登録済の行はキッする」という処理追加しないといけないかもしれませんが)
93
94
 
94
95
  **デメリット:**
95
96
  スプレッドシートへの記録する処理の分だけ、時間がかかります。
96
97
  APIをたくさん消費し、制限がかかる可能性もあります。
97
98
  コピー全体の処理が制限時間(無料のGoogle Workspaceならば6分)を超えそうな場合は、たとえば5分ごとに分割して処理を行う等の工夫が必要になります。
98
- もっとも、カレンダーからカレンダーへ直接コピーする場合も、API制限と処理時間にひっかかる可能性はあります
99
+ もっとも、カレンダーからカレンダーへ直接コピーする場合も、API制限と処理時間にひっかかる可能性はあります
99
100
 

3

 

2022/01/23 01:41

投稿

退会済みユーザー
test CHANGED
@@ -89,7 +89,7 @@
89
89
  また最初からやり直すとすでに完了した部分は重複して記録されてしまいます。
90
90
 
91
91
  スプレッドシートに、転記元のスケジュールデータとコピー先へのコピー状況を記録することで、このような事態に対応しやすくなります。
92
- (きちんと対応するには、スクリプト内を見直さないといけないかもしれませんが)
92
+ (きちんと対応するには、スクリプト内を見直さないといけないかもしれませんが)
93
93
 
94
94
  **デメリット:**
95
95
  スプレッドシートへの記録する処理の分だけ、時間がかかります。

2

 

2022/01/23 01:40

投稿

退会済みユーザー
test CHANGED
@@ -10,7 +10,7 @@
10
10
  「予定取得20220122.gs の 76行目」でエラーが発生していることを示しています。
11
11
 
12
12
  **・修正案**
13
- ループの部分をmaxRow-3に修正してみてはいかがでしょうか。
13
+ ループの下記部分を`maxRow2 - 3`に修正してみてはいかがでしょうか。
14
14
  ```diff
15
15
  - for (let i = 0; i < maxRow2 - 2; i++) {
16
16
  + for (let i = 0; i < maxRow2 - 3; i++) {

1

修正

2022/01/23 01:39

投稿

退会済みユーザー
test CHANGED
@@ -18,14 +18,14 @@
18
18
  let endTime = myEvent[i][1]
19
19
  let title = myEvent[i][2];
20
20
  ```
21
- さらに、現状だと、毎回全行に「登録済」が記入されてしまうので、最後の行は下記のように修正してはいかがでしょうか。
21
+ さらに、現状だと、最初から全行に「登録済」が記入されてしまう(仮にエラー等で途中で止まっても、まだコピーされていない行まで「登録済」になってしまう)ので、最後の行は下記のように修正してはいかがでしょうか。
22
22
  ```diff
23
23
  //▼転記結果をスプシに追記する
24
24
  //getRange(行、列、▲行分、■列分)
25
25
  console.log("myEvent.length " + myEvent.length);
26
26
  console.log("myEvent[0] " + myEvent[0]);
27
27
  - mySheet.getRange(4, 6, myEvent.length ,1).setValue("登録済");
28
- + mySheet.getRange(4, 6, i + 4 ,1).setValue("登録済");
28
+ + mySheet.getRange( i + 4, 6, 1, 1).setValue("登録済");
29
29
  }
30
30
  ```
31
31
  ---