回答編集履歴

2

2022/01/16 01:20

投稿

退会済みユーザー
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
- そうすればH列が空欄でもL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
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**となっていたために、(H列までで良いところ)G列まで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

2022/01/10 23:30

投稿

退会済みユーザー
test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- そうすれば、Dにタスク記入されていればL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
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