回答編集履歴
12
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
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 まで」の
|
73
|
+
「iは 0 から **7 まで**」の8行分、ループを回すことになります。
|
74
74
|
|
75
75
|
よって、ループの最後 i=7 のとき、
|
76
76
|
`myEvent[7]`にアクセスすることになりますが
|
10
test
CHANGED
@@ -51,9 +51,10 @@
|
|
51
51
|
↓
|
52
52
|
eventRange = mySheet.getRange(4, 3, 7, 3);
|
53
53
|
となるので
|
54
|
-
eventRangeの行範囲は
|
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
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
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行目から、
|
54
|
+
eventRangeの行範囲は 4行目から、**7行分** です。
|
48
55
|
|
49
56
|
したがってmyEventは、7行×3列の2次元配列になります。
|
50
57
|
myEventのデータが7行ということは
|
7
test
CHANGED
@@ -30,7 +30,9 @@
|
|
30
30
|
```
|
31
31
|
---
|
32
32
|
**・エラーの原因について**
|
33
|
+
76行目はfor文の部分だと思いますが、その行より前をさかのぼって
|
33
|
-
|
34
|
+
eventRange と myEvent を定義している部分について見てみましょう。
|
35
|
+
|
34
36
|
```
|
35
37
|
//getRange(行目,列目,●行分,●列分)
|
36
38
|
//起点はセルC4(行4,列3)~L列まで
|
6
修正
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
const myEvent = eventRange.getValues();
|
43
43
|
```
|
44
44
|
ここで、仮にシートの10行目までデータが入っていて、maxRow2=10だと仮定します。
|
45
|
-
eventRangeの行範囲は
|
45
|
+
eventRangeの行範囲は 4行目から、10-4+1=**7行分** です。
|
46
46
|
|
47
47
|
したがってmyEventは、7行×3列の2次元配列になります。
|
48
48
|
myEventのデータが7行ということは
|
5
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
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
|
-
|
99
|
+
もっとも、カレンダーからカレンダーへ直接コピーする場合も、API制限と処理時間にひっかかる可能性はあります。
|
99
100
|
|
3
test
CHANGED
@@ -89,7 +89,7 @@
|
|
89
89
|
また最初からやり直すとすでに完了した部分は重複して記録されてしまいます。
|
90
90
|
|
91
91
|
スプレッドシートに、転記元のスケジュールデータとコピー先へのコピー状況を記録することで、このような事態に対応しやすくなります。
|
92
|
-
(きちんと対応するには、スクリプト内
|
92
|
+
(きちんと対応するには、スクリプト内容を見直さないといけないかもしれませんが)
|
93
93
|
|
94
94
|
**デメリット:**
|
95
95
|
スプレッドシートへの記録する処理の分だけ、時間がかかります。
|
2
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
修正
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(
|
28
|
+
+ mySheet.getRange( i + 4, 6, 1, 1).setValue("登録済");
|
29
29
|
}
|
30
30
|
```
|
31
31
|
---
|