回答編集履歴
2
test
CHANGED
@@ -1,401 +1,201 @@
|
|
1
1
|
> 予定①~④のいずれかが単体でブランクの時にもL列に「対象外」フラグが
|
2
|
-
|
3
|
-
立ってしまいます。
|
2
|
+
> 立ってしまいます。
|
4
|
-
|
5
|
-
|
6
3
|
|
7
4
|
これの原因ですが、15行目あたり(下記の色付きで強調した行)の「col < 8 + 1」が原因です。
|
8
|
-
|
9
|
-
```diff
|
5
|
+
```diff
|
10
|
-
|
11
|
-
for (let Row = 16; Row < endRow + 1; Row++) {
|
6
|
+
for (let Row = 16; Row < endRow + 1; Row++) {
|
12
|
-
|
13
7
|
+ for (let col = 4; col < 8 + 1; col++) {
|
14
|
-
|
15
|
-
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
8
|
+
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
16
|
-
|
17
9
|
const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
```
|
11
|
+
```
|
22
|
-
|
23
12
|
for (let col = 4; col < 8 + 1; col++)
|
24
|
-
|
25
13
|
とすると、colは4から8まで、すなわち D列目から**H列まで**の「5列分」を処理することになります。
|
26
14
|
|
27
|
-
|
28
|
-
|
29
15
|
colが8のとき、myRange1はH列を指しているので、その後の
|
30
|
-
|
31
|
-
```
|
16
|
+
```
|
32
|
-
|
33
17
|
//▼予定①~④がブランクの時のフラグ立て
|
34
|
-
|
35
|
-
if (myRange1.isBlank()) {
|
18
|
+
if (myRange1.isBlank()) {
|
36
|
-
|
37
|
-
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
19
|
+
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
38
|
-
|
39
|
-
}
|
20
|
+
}
|
40
|
-
|
41
|
-
```
|
21
|
+
```
|
42
|
-
|
43
22
|
の部分で、myRange1(H列)が空欄の場合、col+4 = 8+4 = 12 = L列に「対象外」が入力されることになります。
|
44
|
-
|
45
23
|
D列(すなわちタスク①の列)に何らかの文字が入力されている場合、
|
46
|
-
|
47
24
|
H列には「対象外」という値が入力されないため、H列は空欄となります。
|
48
|
-
|
49
25
|
結果、L列に「対象外」が入力されてしまいます。
|
50
26
|
|
51
|
-
|
52
|
-
|
53
27
|
ここは
|
54
|
-
|
55
28
|
col < 8 + 1
|
56
|
-
|
57
29
|
ではなく
|
58
|
-
|
59
30
|
col < 8
|
60
|
-
|
61
31
|
として、D列から**G列まで**の「4列分」を処理するようにするべきです。
|
62
32
|
|
63
|
-
|
64
|
-
|
65
|
-
```diff
|
33
|
+
```diff
|
66
|
-
|
67
|
-
for (let Row = 16; Row < endRow + 1; Row++) {
|
34
|
+
for (let Row = 16; Row < endRow + 1; Row++) {
|
68
|
-
|
69
35
|
- for (let col = 4; col < 8 + 1; col++) { // D列からH列まで見てしまっている
|
70
|
-
|
71
36
|
+ for (let col = 4; col < 8; col++) { // D列からG列までの「4列分」を処理する
|
72
|
-
|
73
|
-
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
37
|
+
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
74
|
-
|
75
38
|
const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
76
39
|
|
77
|
-
|
78
|
-
|
79
|
-
```
|
40
|
+
```
|
80
|
-
|
81
|
-
|
82
|
-
|
41
|
+
|
83
|
-
そうすれば
|
42
|
+
そうすれば、D列にタスクが記入されていればL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
|
84
|
-
|
85
|
-
|
86
43
|
|
87
44
|
> 又、以下の処理も行われずGAS処理が終了となってしまいます。
|
88
|
-
|
89
|
-
・カレンダーへの予定登録処理
|
45
|
+
> ・カレンダーへの予定登録処理
|
90
|
-
|
91
|
-
・スプレッドシート列H(登録処理①)~列K(登録処理④)への「登録済」追記
|
46
|
+
> ・スプレッドシート列H(登録処理①)~列K(登録処理④)への「登録済」追記
|
92
|
-
|
47
|
+
>
|
93
|
-
|
94
|
-
|
95
48
|
> 33行目以降の処理が行われていない原因は
|
96
|
-
|
97
|
-
括弧のくくり方(閉じ括弧の位置)が間違えているからですか?
|
49
|
+
> 括弧のくくり方(閉じ括弧の位置)が間違えているからですか?
|
98
|
-
|
99
|
-
列方向のループ処理を追加する位置が違うからですか?
|
50
|
+
> 列方向のループ処理を追加する位置が違うからですか?
|
100
|
-
|
101
|
-
|
102
51
|
|
103
52
|
修正前のコードで33行目以降の処理が行われなかった原因は、
|
104
|
-
|
105
|
-
col < 8** + 1**となっていたために、
|
53
|
+
col < 8** + 1**となっていたために、H列までで良いところG列まで1列余計に調べてしまい
|
106
|
-
|
107
54
|
(D列にタスクが入力されているほぼ全部の行について)L列に「対象外」が入力され、
|
108
|
-
|
109
55
|
カレンダーへの登録処理や「登録済」追記がスキップされてしまったからです。
|
110
|
-
|
111
56
|
括弧のくくり方は問題ないと思います。
|
112
57
|
|
113
|
-
|
114
|
-
|
115
58
|
---
|
116
|
-
|
117
59
|
・L列への「対象外入力」条件をどのようにして判定するか
|
118
60
|
|
119
|
-
|
120
|
-
|
121
61
|
上記を修正(`col < 8 + 1`→`col < 8`)すれば、一応カレンダーへの登録と、登録があった列の「登録済」追記は正常に行われると思います。
|
122
62
|
|
123
|
-
|
124
|
-
|
125
63
|
しかしながらL列には何も記入されません。
|
126
64
|
|
127
|
-
|
128
|
-
|
129
65
|
コメントによると、L列へ「対象外」を記入する条件は「D列~G列の4列いずれも空白の場合」とのこと。
|
130
|
-
|
131
66
|
ここで、元の
|
132
|
-
|
133
|
-
```diff
|
67
|
+
```diff
|
134
|
-
|
135
|
-
//▼予定①~④がブランクの時のフラグ立て
|
68
|
+
//▼予定①~④がブランクの時のフラグ立て
|
136
|
-
|
137
|
-
if (myRange1.isBlank()) {
|
69
|
+
if (myRange1.isBlank()) {
|
138
|
-
|
139
|
-
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
70
|
+
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
140
|
-
|
141
|
-
}
|
71
|
+
}
|
142
|
-
|
143
|
-
|
144
72
|
|
145
73
|
+ else if (myRange2.isBlank())
|
146
|
-
|
147
74
|
mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
|
148
|
-
|
149
75
|
//getRange(行目,列目,●行分,●列分)
|
150
|
-
|
151
|
-
}
|
76
|
+
}
|
152
|
-
|
153
|
-
```
|
77
|
+
```
|
154
|
-
|
155
78
|
のelseは不要です。
|
156
79
|
|
157
|
-
|
158
|
-
|
159
80
|
正しく条件判定してL列に「対象外」を入力するには、 else を外す必要があります。
|
160
|
-
|
161
|
-
```diff
|
81
|
+
```diff
|
162
|
-
|
163
|
-
for (let Row = 16; Row < endRow + 1; Row++) {
|
82
|
+
for (let Row = 16; Row < endRow + 1; Row++) {
|
164
|
-
|
165
83
|
- for (let col = 4; col < 8 + 1; col++) {
|
166
|
-
|
167
84
|
+ for (let col = 4; col < 8; col++) {
|
168
|
-
|
169
|
-
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
85
|
+
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
170
|
-
|
171
86
|
const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
172
87
|
|
173
|
-
|
174
|
-
|
175
|
-
//▼予定①~④がブランクの時のフラグ立て
|
88
|
+
//▼予定①~④がブランクの時のフラグ立て
|
176
|
-
|
177
|
-
if (myRange1.isBlank()) {
|
89
|
+
if (myRange1.isBlank()) {
|
178
|
-
|
179
|
-
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
90
|
+
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
180
|
-
|
181
|
-
}
|
91
|
+
}
|
182
|
-
|
183
92
|
- else if (myRange2.isBlank()) // elseは不要
|
184
|
-
|
185
93
|
+ if (myRange2.isBlank())
|
186
|
-
|
187
94
|
mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
|
188
|
-
|
189
95
|
//getRange(行目,列目,●行分,●列分)
|
190
|
-
|
191
|
-
}
|
96
|
+
}
|
192
|
-
|
193
97
|
}
|
194
|
-
|
195
|
-
```
|
98
|
+
```
|
196
|
-
|
197
|
-
|
198
99
|
|
199
100
|
さらに、myRange2という同じ範囲を4回チェックしているのは無駄なので、
|
200
|
-
|
201
101
|
先にmyRange2を調べ、
|
202
|
-
|
203
102
|
4列全部空白ならばH列~L列の5列分一気に「対象外」を書き込んで
|
204
|
-
|
205
103
|
次の行に行くようにすることで、少し高速化されます。
|
206
|
-
|
207
|
-
```diff
|
104
|
+
```diff
|
208
|
-
|
209
|
-
for (let Row = 16; Row < endRow + 1; Row++) {
|
105
|
+
for (let Row = 16; Row < endRow + 1; Row++) {
|
210
|
-
|
211
106
|
+ // 先にD列~G列全部空白かどうか判定する。
|
212
|
-
|
213
107
|
+ const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
214
|
-
|
215
108
|
+ if (myRange2.isBlank()) {
|
216
|
-
|
217
109
|
+ // 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
|
218
|
-
|
219
110
|
+ mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
|
220
|
-
|
221
111
|
+ continue;
|
222
|
-
|
223
112
|
+ }
|
224
|
-
|
225
113
|
for (let col = 4; col < 8; col++) {
|
226
|
-
|
227
|
-
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
114
|
+
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
228
|
-
|
229
115
|
- const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
230
116
|
|
231
|
-
|
232
|
-
|
233
|
-
//▼予定①~④がブランクの時のフラグ立て
|
117
|
+
//▼予定①~④がブランクの時のフラグ立て
|
234
|
-
|
235
|
-
if (myRange1.isBlank()) {
|
118
|
+
if (myRange1.isBlank()) {
|
236
|
-
|
237
|
-
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
119
|
+
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
238
|
-
|
239
|
-
}
|
120
|
+
}
|
240
|
-
|
241
121
|
- else if (myRange2.isBlank())
|
242
|
-
|
243
122
|
- mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
|
244
|
-
|
245
123
|
- //getRange(行目,列目,●行分,●列分)
|
246
|
-
|
247
|
-
}
|
124
|
+
}
|
248
|
-
|
249
125
|
}
|
250
|
-
|
251
|
-
```
|
126
|
+
```
|
252
|
-
|
253
|
-
|
254
127
|
|
255
128
|
---
|
256
129
|
|
257
|
-
|
258
|
-
|
259
130
|
上記を加味した修正後の全文は下記になります。
|
260
|
-
|
261
131
|
```js
|
262
|
-
|
263
132
|
function createEvent3() {
|
264
|
-
|
265
133
|
//▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
|
266
|
-
|
267
134
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
268
|
-
|
269
135
|
const mysheet1 = ss.getSheetByName("カレンダー転記用");
|
270
|
-
|
271
136
|
const calId = mysheet1.getRange(9,3).getValue();
|
272
|
-
|
273
137
|
const cal = CalendarApp.getCalendarById(calId);
|
274
|
-
|
275
138
|
const targetRows = mysheet1.getRange('C13').getValue();
|
276
|
-
|
277
139
|
console.log("targetRows " + targetRows);
|
278
140
|
|
279
|
-
|
280
|
-
|
281
141
|
//予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
|
282
|
-
|
283
142
|
const endRow = targetRows + 15
|
284
|
-
|
285
143
|
console.log("endRow " + endRow);
|
286
144
|
|
287
|
-
|
288
|
-
|
289
|
-
for (let Row = 16; Row < endRow + 1; Row++) {
|
145
|
+
for (let Row = 16; Row < endRow + 1; Row++) {
|
290
|
-
|
291
146
|
// 先にD列~G列全部空白かどうか判定する。
|
292
|
-
|
293
147
|
const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
|
294
|
-
|
295
148
|
if (myRange2.isBlank()) {
|
296
|
-
|
297
149
|
// 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
|
298
|
-
|
299
150
|
mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
|
300
|
-
|
301
151
|
continue;
|
302
|
-
|
303
|
-
}
|
152
|
+
}
|
304
|
-
|
305
153
|
for (let col = 4; col < 8; col++) {
|
306
|
-
|
307
|
-
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
154
|
+
const myRange1 = mysheet1.getRange(Row, col, 1, 1);
|
308
|
-
|
309
155
|
|
310
|
-
|
311
|
-
//▼予定①~④がブランクの時のフラグ立て
|
156
|
+
//▼予定①~④がブランクの時のフラグ立て
|
312
|
-
|
313
|
-
if (myRange1.isBlank()) {
|
157
|
+
if (myRange1.isBlank()) {
|
314
|
-
|
315
|
-
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
158
|
+
mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
|
316
|
-
|
317
|
-
}
|
159
|
+
}
|
318
|
-
|
319
160
|
}
|
320
161
|
|
321
|
-
|
322
|
-
|
323
162
|
//▼データ取得範囲の指定
|
324
|
-
|
325
163
|
//各種予定のデータ取得範囲の指定
|
326
|
-
|
327
164
|
//getRange(行目,列目,●行分,●列分)
|
328
|
-
|
329
165
|
//予定配列>>セルB16(行16,列2)~L列まで
|
330
|
-
|
331
166
|
const eventRange = mysheet1.getRange(16, 2, targetRows, 11);
|
332
|
-
|
333
167
|
console.log("eventRange " + eventRange.getA1Notation());
|
334
168
|
|
335
|
-
|
336
|
-
|
337
169
|
//▼各予定データを配列(myEvent)として取得する
|
338
|
-
|
339
170
|
const myEvent = eventRange.getValues();
|
340
|
-
|
341
171
|
Logger.log(myEvent);
|
342
172
|
|
343
|
-
|
344
|
-
|
345
173
|
//▼各日付ごとに処理する
|
346
|
-
|
347
174
|
for (let i = 0; i < targetRows; i++) {
|
348
|
-
|
349
175
|
let myDate = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
|
350
|
-
|
351
176
|
let ngFlag = myEvent[i][10]; //「対象外フラグ」は起点B16から下にi行、右に10
|
352
|
-
|
353
177
|
// 「対象外」であればスキップして次の行へ。
|
354
|
-
|
355
178
|
if (ngFlag === "対象外") {
|
356
|
-
|
357
179
|
continue;
|
358
|
-
|
359
|
-
}
|
180
|
+
}
|
360
|
-
|
361
181
|
//▼「①~④予定」を一列ずつ処理(column:0~3までループ)
|
362
|
-
|
363
182
|
for (let column = 0; column < 4; column++) {
|
364
|
-
|
365
183
|
let flag = myEvent[i][6 + column]; //「①~④登録済フラグ」は起点B16から下にi行、右に6+column
|
366
|
-
|
367
184
|
// 「登録済」であればスキップして隣の列へ。
|
368
|
-
|
369
185
|
if (flag === "登録済" || flag === "対象外") {
|
370
|
-
|
371
186
|
continue;
|
372
|
-
|
373
|
-
}
|
187
|
+
}
|
374
|
-
|
375
188
|
//「予定名(title)」を取得
|
376
|
-
|
377
189
|
let title = myEvent[i][2 + column]; //「①~④予定名」は起点0(B16)から下にi行、右に2+column
|
378
190
|
|
379
|
-
|
380
|
-
|
381
191
|
//▼カレンダーへの予定登録
|
382
|
-
|
383
192
|
cal.createAllDayEvent(title, new Date(myDate));
|
384
|
-
|
385
193
|
|
386
|
-
|
387
194
|
//▼スプレッドシートへの「登録済」フラグ記載
|
388
|
-
|
389
195
|
mysheet1.getRange(16 + i, 8 + column, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
|
390
|
-
|
391
|
-
}
|
196
|
+
}
|
392
|
-
|
393
197
|
}
|
394
|
-
|
395
198
|
//▼ダイアログMsgの表示
|
396
|
-
|
397
199
|
Browser.msgBox("Googleカレンダーへの転記作業が完了しました。登録内容は「カレンダー転記用」シートで確認してください。", Browser.Buttons.OK)
|
398
|
-
|
399
200
|
}
|
400
|
-
|
401
|
-
```
|
201
|
+
```
|
1
test
CHANGED
@@ -80,7 +80,7 @@
|
|
80
80
|
|
81
81
|
|
82
82
|
|
83
|
-
そうすれば
|
83
|
+
そうすればH列が空欄でもL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
|
84
84
|
|
85
85
|
|
86
86
|
|
@@ -102,7 +102,7 @@
|
|
102
102
|
|
103
103
|
修正前のコードで33行目以降の処理が行われなかった原因は、
|
104
104
|
|
105
|
-
col < 8** + 1**となっていたために、H列までで良いところG列まで1列余計に調べてしまい
|
105
|
+
col < 8** + 1**となっていたために、(H列までで良いところ)G列まで1列余計に調べてしまい
|
106
106
|
|
107
107
|
(D列にタスクが入力されているほぼ全部の行について)L列に「対象外」が入力され、
|
108
108
|
|