質問するログイン新規登録

回答編集履歴

2

2022/01/16 01:20

投稿

退会済みユーザー
answer CHANGED
@@ -1,201 +1,201 @@
1
- > 予定①~④のいずれかが単体でブランクの時にもL列に「対象外」フラグが
2
- 立ってしまいます。
3
-
4
- これの原因ですが、15行目あたり(下記の色付きで強調した行)の「col < 8 + 1」が原因です。
5
- ```diff
6
- for (let Row = 16; Row < endRow + 1; Row++) {
7
- + for (let col = 4; col < 8 + 1; col++) {
8
- const myRange1 = mysheet1.getRange(Row, col, 1, 1);
9
- const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
10
-
11
- ```
12
- for (let col = 4; col < 8 + 1; col++)
13
- とすると、colは4から8まで、すなわち D列目から**H列まで**の「5列分」を処理することになります。
14
-
15
- colが8のとき、myRange1はH列を指しているので、その後の
16
- ```
17
- //▼予定①~④がブランクの時のフラグ立て
18
- if (myRange1.isBlank()) {
19
- mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
20
- }
21
- ```
22
- の部分で、myRange1(H列)が空欄の場合、col+4 = 8+4 = 12 = L列に「対象外」が入力されることになります。
23
- D列(すなわちタスク①の列)に何らかの文字が入力されている場合、
24
- H列には「対象外」という値が入力されないため、H列は空欄となります。
25
- 結果、L列に「対象外」が入力されてしまいます。
26
-
27
- ここは
28
- col < 8 + 1
29
- ではなく
30
- col < 8
31
- として、D列から**G列まで**の「4列分」を処理するようにするべきです。
32
-
33
- ```diff
34
- for (let Row = 16; Row < endRow + 1; Row++) {
35
- - for (let col = 4; col < 8 + 1; col++) { // D列からH列まで見てしまっている
36
- + for (let col = 4; col < 8; col++) { // D列からG列までの「4列分」を処理する
37
- const myRange1 = mysheet1.getRange(Row, col, 1, 1);
38
- const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
39
-
40
- ```
41
-
42
- そうすればH列が空欄でもL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
43
-
44
- > 又、以下の処理も行われずGAS処理が終了となってしまいます。
45
- ・カレンダーへの予定登録処理
46
- ・スプレッドシート列H(登録処理①)~列K(登録処理④)への「登録済」追記
47
-
48
- > 33行目以降の処理が行われていない原因は
49
- 括弧のくくり方(閉じ括弧の位置)が間違えているからですか?
50
- 列方向のループ処理を追加する位置が違うからですか?
51
-
52
- 修正前のコードで33行目以降の処理が行われなかった原因は、
53
- col < 8** + 1**となっていたために、(H列までで良いところ)G列まで1列余計に調べてしまい
54
- (D列にタスクが入力されているほぼ全部の行について)L列に「対象外」が入力され、
55
- カレンダーへの登録処理や「登録済」追記がスキップされてしまったからです。
56
- 括弧のくくり方は問題ないと思います。
57
-
58
- ---
59
- ・L列への「対象外入力」条件をどのようにして判定するか
60
-
61
- 上記を修正(`col < 8 + 1`→`col < 8`)すれば、一応カレンダーへの登録と、登録があった列の「登録済」追記は正常に行われると思います。
62
-
63
- しかしながらL列には何も記入されません。
64
-
65
- コメントによると、L列へ「対象外」を記入する条件は「D列~G列の4列いずれも空白の場合」とのこと。
66
- ここで、元の
67
- ```diff
68
- //▼予定①~④がブランクの時のフラグ立て
69
- if (myRange1.isBlank()) {
70
- mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
71
- }
72
-
73
- + else if (myRange2.isBlank())
74
- mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
75
- //getRange(行目,列目,●行分,●列分)
76
- }
77
- ```
78
- のelseは不要です。
79
-
80
- 正しく条件判定してL列に「対象外」を入力するには、 else を外す必要があります。
81
- ```diff
82
- for (let Row = 16; Row < endRow + 1; Row++) {
83
- - for (let col = 4; col < 8 + 1; col++) {
84
- + for (let col = 4; col < 8; col++) {
85
- const myRange1 = mysheet1.getRange(Row, col, 1, 1);
86
- const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
87
-
88
- //▼予定①~④がブランクの時のフラグ立て
89
- if (myRange1.isBlank()) {
90
- mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
91
- }
92
- - else if (myRange2.isBlank()) // elseは不要
93
- + if (myRange2.isBlank())
94
- mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
95
- //getRange(行目,列目,●行分,●列分)
96
- }
97
- }
98
- ```
99
-
100
- さらに、myRange2という同じ範囲を4回チェックしているのは無駄なので、
101
- 先にmyRange2を調べ、
102
- 4列全部空白ならばH列~L列の5列分一気に「対象外」を書き込んで
103
- 次の行に行くようにすることで、少し高速化されます。
104
- ```diff
105
- for (let Row = 16; Row < endRow + 1; Row++) {
106
- + // 先にD列~G列全部空白かどうか判定する。
107
- + const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
108
- + if (myRange2.isBlank()) {
109
- + // 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
110
- + mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
111
- + continue;
112
- + }
113
- for (let col = 4; col < 8; col++) {
114
- const myRange1 = mysheet1.getRange(Row, col, 1, 1);
115
- - const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
116
-
117
- //▼予定①~④がブランクの時のフラグ立て
118
- if (myRange1.isBlank()) {
119
- mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
120
- }
121
- - else if (myRange2.isBlank())
122
- - mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
123
- - //getRange(行目,列目,●行分,●列分)
124
- }
125
- }
126
- ```
127
-
128
- ---
129
-
130
- 上記を加味した修正後の全文は下記になります。
131
- ```js
132
- function createEvent3() {
133
- //▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
134
- const ss = SpreadsheetApp.getActiveSpreadsheet();
135
- const mysheet1 = ss.getSheetByName("カレンダー転記用");
136
-  const calId = mysheet1.getRange(9,3).getValue();
137
- const cal = CalendarApp.getCalendarById(calId);
138
- const targetRows = mysheet1.getRange('C13').getValue();
139
- console.log("targetRows " + targetRows);
140
-
141
- //予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
142
- const endRow = targetRows + 15
143
- console.log("endRow " + endRow);
144
-
145
- for (let Row = 16; Row < endRow + 1; Row++) {
146
- // 先にD列~G列全部空白かどうか判定する。
147
- const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
148
- if (myRange2.isBlank()) {
149
- // 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
150
- mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
151
- continue;
152
- }
153
- for (let col = 4; col < 8; col++) {
154
- const myRange1 = mysheet1.getRange(Row, col, 1, 1);
155
-
156
- //▼予定①~④がブランクの時のフラグ立て
157
- if (myRange1.isBlank()) {
158
- mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
159
- }
160
- }
161
-
162
- //▼データ取得範囲の指定
163
- //各種予定のデータ取得範囲の指定 
164
- //getRange(行目,列目,●行分,●列分)
165
- //予定配列>>セルB16(行16,列2)~L列まで 
166
- const eventRange = mysheet1.getRange(16, 2, targetRows, 11);
167
- console.log("eventRange " + eventRange.getA1Notation());
168
-
169
- //▼各予定データを配列(myEvent)として取得する
170
- const myEvent = eventRange.getValues();
171
- Logger.log(myEvent);
172
-
173
- //▼各日付ごとに処理する
174
- for (let i = 0; i < targetRows; i++) {
175
- let myDate = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
176
- let ngFlag = myEvent[i][10]; //「対象外フラグ」は起点B16から下にi行、右に10 
177
- // 「対象外」であればスキップして次の行へ。
178
- if (ngFlag === "対象外") {
179
- continue;
180
- }
181
- //▼「①~④予定」を一列ずつ処理(column:0~3までループ)
182
- for (let column = 0; column < 4; column++) {
183
- let flag = myEvent[i][6 + column]; //「①~④登録済フラグ」は起点B16から下にi行、右に6+column
184
- // 「登録済」であればスキップして隣の列へ。
185
- if (flag === "登録済" || flag === "対象外") {
186
- continue;
187
- }
188
- //「予定名(title)」を取得
189
- let title = myEvent[i][2 + column]; //「①~④予定名」は起点0(B16)から下にi行、右に2+column
190
-
191
- //▼カレンダーへの予定登録
192
- cal.createAllDayEvent(title, new Date(myDate));
193
-
194
- //▼スプレッドシートへの「登録済」フラグ記載
195
- mysheet1.getRange(16 + i, 8 + column, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
196
- }
197
- }
198
- //▼ダイアログMsgの表示
199
- Browser.msgBox("Googleカレンダーへの転記作業が完了しました。登録内容は「カレンダー転記用」シートで確認してください。", Browser.Buttons.OK)
200
- }
1
+ > 予定①~④のいずれかが単体でブランクの時にもL列に「対象外」フラグが
2
+ > 立ってしまいます。
3
+
4
+ これの原因ですが、15行目あたり(下記の色付きで強調した行)の「col < 8 + 1」が原因です。
5
+ ```diff
6
+ for (let Row = 16; Row < endRow + 1; Row++) {
7
+ + for (let col = 4; col < 8 + 1; col++) {
8
+ const myRange1 = mysheet1.getRange(Row, col, 1, 1);
9
+ const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
10
+
11
+ ```
12
+ for (let col = 4; col < 8 + 1; col++)
13
+ とすると、colは4から8まで、すなわち D列目から**H列まで**の「5列分」を処理することになります。
14
+
15
+ colが8のとき、myRange1はH列を指しているので、その後の
16
+ ```
17
+ //▼予定①~④がブランクの時のフラグ立て
18
+ if (myRange1.isBlank()) {
19
+ mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
20
+ }
21
+ ```
22
+ の部分で、myRange1(H列)が空欄の場合、col+4 = 8+4 = 12 = L列に「対象外」が入力されることになります。
23
+ D列(すなわちタスク①の列)に何らかの文字が入力されている場合、
24
+ H列には「対象外」という値が入力されないため、H列は空欄となります。
25
+ 結果、L列に「対象外」が入力されてしまいます。
26
+
27
+ ここは
28
+ col < 8 + 1
29
+ ではなく
30
+ col < 8
31
+ として、D列から**G列まで**の「4列分」を処理するようにするべきです。
32
+
33
+ ```diff
34
+ for (let Row = 16; Row < endRow + 1; Row++) {
35
+ - for (let col = 4; col < 8 + 1; col++) { // D列からH列まで見てしまっている
36
+ + for (let col = 4; col < 8; col++) { // D列からG列までの「4列分」を処理する
37
+ const myRange1 = mysheet1.getRange(Row, col, 1, 1);
38
+ const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
39
+
40
+ ```
41
+
42
+ そうすれば、Dにタスク記入されていればL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
43
+
44
+ > 又、以下の処理も行われずGAS処理が終了となってしまいます。
45
+ > ・カレンダーへの予定登録処理
46
+ > ・スプレッドシート列H(登録処理①)~列K(登録処理④)への「登録済」追記
47
+ >
48
+ > 33行目以降の処理が行われていない原因は
49
+ > 括弧のくくり方(閉じ括弧の位置)が間違えているからですか?
50
+ > 列方向のループ処理を追加する位置が違うからですか?
51
+
52
+ 修正前のコードで33行目以降の処理が行われなかった原因は、
53
+ col < 8** + 1**となっていたために、H列までで良いところG列まで1列余計に調べてしまい
54
+ (D列にタスクが入力されているほぼ全部の行について)L列に「対象外」が入力され、
55
+ カレンダーへの登録処理や「登録済」追記がスキップされてしまったからです。
56
+ 括弧のくくり方は問題ないと思います。
57
+
58
+ ---
59
+ ・L列への「対象外入力」条件をどのようにして判定するか
60
+
61
+ 上記を修正(`col < 8 + 1`→`col < 8`)すれば、一応カレンダーへの登録と、登録があった列の「登録済」追記は正常に行われると思います。
62
+
63
+ しかしながらL列には何も記入されません。
64
+
65
+ コメントによると、L列へ「対象外」を記入する条件は「D列~G列の4列いずれも空白の場合」とのこと。
66
+ ここで、元の
67
+ ```diff
68
+ //▼予定①~④がブランクの時のフラグ立て
69
+ if (myRange1.isBlank()) {
70
+ mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
71
+ }
72
+
73
+ + else if (myRange2.isBlank())
74
+ mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
75
+ //getRange(行目,列目,●行分,●列分)
76
+ }
77
+ ```
78
+ のelseは不要です。
79
+
80
+ 正しく条件判定してL列に「対象外」を入力するには、 else を外す必要があります。
81
+ ```diff
82
+ for (let Row = 16; Row < endRow + 1; Row++) {
83
+ - for (let col = 4; col < 8 + 1; col++) {
84
+ + for (let col = 4; col < 8; col++) {
85
+ const myRange1 = mysheet1.getRange(Row, col, 1, 1);
86
+ const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
87
+
88
+ //▼予定①~④がブランクの時のフラグ立て
89
+ if (myRange1.isBlank()) {
90
+ mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
91
+ }
92
+ - else if (myRange2.isBlank()) // elseは不要
93
+ + if (myRange2.isBlank())
94
+ mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
95
+ //getRange(行目,列目,●行分,●列分)
96
+ }
97
+ }
98
+ ```
99
+
100
+ さらに、myRange2という同じ範囲を4回チェックしているのは無駄なので、
101
+ 先にmyRange2を調べ、
102
+ 4列全部空白ならばH列~L列の5列分一気に「対象外」を書き込んで
103
+ 次の行に行くようにすることで、少し高速化されます。
104
+ ```diff
105
+ for (let Row = 16; Row < endRow + 1; Row++) {
106
+ + // 先にD列~G列全部空白かどうか判定する。
107
+ + const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
108
+ + if (myRange2.isBlank()) {
109
+ + // 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
110
+ + mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
111
+ + continue;
112
+ + }
113
+ for (let col = 4; col < 8; col++) {
114
+ const myRange1 = mysheet1.getRange(Row, col, 1, 1);
115
+ - const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
116
+
117
+ //▼予定①~④がブランクの時のフラグ立て
118
+ if (myRange1.isBlank()) {
119
+ mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
120
+ }
121
+ - else if (myRange2.isBlank())
122
+ - mysheet1.getRange(Row, 12, 1, 1).setValue("対象外");
123
+ - //getRange(行目,列目,●行分,●列分)
124
+ }
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ 上記を加味した修正後の全文は下記になります。
131
+ ```js
132
+ function createEvent3() {
133
+ //▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
134
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
135
+ const mysheet1 = ss.getSheetByName("カレンダー転記用");
136
+  const calId = mysheet1.getRange(9,3).getValue();
137
+ const cal = CalendarApp.getCalendarById(calId);
138
+ const targetRows = mysheet1.getRange('C13').getValue();
139
+ console.log("targetRows " + targetRows);
140
+
141
+ //予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
142
+ const endRow = targetRows + 15
143
+ console.log("endRow " + endRow);
144
+
145
+ for (let Row = 16; Row < endRow + 1; Row++) {
146
+ // 先にD列~G列全部空白かどうか判定する。
147
+ const myRange2 = mysheet1.getRange(Row, 4, 1, 4);
148
+ if (myRange2.isBlank()) {
149
+ // 4列空白ならばH列~L列の5列に「対象外」を書き込んで次の行に行く
150
+ mysheet1.getRange(Row, 8, 1, 5).setValue("対象外");
151
+ continue;
152
+ }
153
+ for (let col = 4; col < 8; col++) {
154
+ const myRange1 = mysheet1.getRange(Row, col, 1, 1);
155
+
156
+ //▼予定①~④がブランクの時のフラグ立て
157
+ if (myRange1.isBlank()) {
158
+ mysheet1.getRange(Row, col + 4, 1, 1).setValue("対象外");
159
+ }
160
+ }
161
+
162
+ //▼データ取得範囲の指定
163
+ //各種予定のデータ取得範囲の指定 
164
+ //getRange(行目,列目,●行分,●列分)
165
+ //予定配列>>セルB16(行16,列2)~L列まで 
166
+ const eventRange = mysheet1.getRange(16, 2, targetRows, 11);
167
+ console.log("eventRange " + eventRange.getA1Notation());
168
+
169
+ //▼各予定データを配列(myEvent)として取得する
170
+ const myEvent = eventRange.getValues();
171
+ Logger.log(myEvent);
172
+
173
+ //▼各日付ごとに処理する
174
+ for (let i = 0; i < targetRows; i++) {
175
+ let myDate = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
176
+ let ngFlag = myEvent[i][10]; //「対象外フラグ」は起点B16から下にi行、右に10 
177
+ // 「対象外」であればスキップして次の行へ。
178
+ if (ngFlag === "対象外") {
179
+ continue;
180
+ }
181
+ //▼「①~④予定」を一列ずつ処理(column:0~3までループ)
182
+ for (let column = 0; column < 4; column++) {
183
+ let flag = myEvent[i][6 + column]; //「①~④登録済フラグ」は起点B16から下にi行、右に6+column
184
+ // 「登録済」であればスキップして隣の列へ。
185
+ if (flag === "登録済" || flag === "対象外") {
186
+ continue;
187
+ }
188
+ //「予定名(title)」を取得
189
+ let title = myEvent[i][2 + column]; //「①~④予定名」は起点0(B16)から下にi行、右に2+column
190
+
191
+ //▼カレンダーへの予定登録
192
+ cal.createAllDayEvent(title, new Date(myDate));
193
+
194
+ //▼スプレッドシートへの「登録済」フラグ記載
195
+ mysheet1.getRange(16 + i, 8 + column, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
196
+ }
197
+ }
198
+ //▼ダイアログMsgの表示
199
+ Browser.msgBox("Googleカレンダーへの転記作業が完了しました。登録内容は「カレンダー転記用」シートで確認してください。", Browser.Buttons.OK)
200
+ }
201
201
  ```

1

2022/01/10 23:30

投稿

退会済みユーザー
answer CHANGED
@@ -39,7 +39,7 @@
39
39
 
40
40
  ```
41
41
 
42
- そうすれば、Dにタスク記入されていればL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
42
+ そうすればH列が空欄でもL列に「対象外」が入力されることはなくなり、カレンダー処理もスキップされません。
43
43
 
44
44
  > 又、以下の処理も行われずGAS処理が終了となってしまいます。
45
45
  ・カレンダーへの予定登録処理
@@ -50,7 +50,7 @@
50
50
  列方向のループ処理を追加する位置が違うからですか?
51
51
 
52
52
  修正前のコードで33行目以降の処理が行われなかった原因は、
53
- col < 8** + 1**となっていたために、H列までで良いところG列まで1列余計に調べてしまい
53
+ col < 8** + 1**となっていたために、(H列までで良いところ)G列まで1列余計に調べてしまい
54
54
  (D列にタスクが入力されているほぼ全部の行について)L列に「対象外」が入力され、
55
55
  カレンダーへの登録処理や「登録済」追記がスキップされてしまったからです。
56
56
  括弧のくくり方は問題ないと思います。