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

回答編集履歴

6

2021/12/19 03:19

投稿

退会済みユーザー
answer CHANGED
@@ -278,4 +278,7 @@
278
278
 
279
279
  2.コードエディタ画面に戻ると、「appsscriptjson」というファイルが表示されているはずなので、そこをクリックし、timeZoneが「Asia/Tokyo」になっているか確認します。
280
280
  (「Asia/Tokyo」になっていない場合は、「Asia/Tokyo」に直して保存)
281
- ![イメージ説明](4d65f0709bc8d82373da3e929823dac3.png)
281
+ ![イメージ説明](4d65f0709bc8d82373da3e929823dac3.png)
282
+
283
+ ---
284
+ 参考に、配列から要素を除外する方法(splice関数)について書こうとしましたが、書くと文字数制限を超えるためここでは割愛します。必要があればコメントに記載します。

5

2021/12/19 03:19

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,4 @@
1
- まずは、回答から。質問文コードの差異を下記に記載しました。(色付き行のち、先頭が「+」とってい行は追加、「-」となっている行は削除)
1
+ 直すすれば下記のなるでしょうか
2
2
  ```diff
3
3
  function createEvent() {
4
4
  //▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
@@ -182,7 +182,6 @@
182
182
  + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
183
183
  ```
184
184
 
185
-
186
185
  # 改善案
187
186
  元々のコードですが、同じ処理について列を変えて繰り返すコードを追加する過程で
188
187
  列の指定を誤って修正してしまっていると思われる部分がところどころにあります。

4

2021/12/19 03:16

投稿

退会済みユーザー
answer CHANGED
@@ -159,7 +159,7 @@
159
159
 
160
160
  「||」は難しい言葉で「論理和演算子」と呼ばれるものです。
161
161
  ごく簡単に言えば、if文で「A || B」という形で使うと、AまたはBのどちらかが正の場合、文が実行されます。
162
- 参照:[||(論理和)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)
162
+ 参照:[MDN:||(論理和)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)
163
163
   
164
164
   
165
165
  (2)IF文とfOR文どちらを先に書けばよいのか
@@ -172,7 +172,7 @@
172
172
 
173
173
  (3)「登録済」フラグの書き込み
174
174
  元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
175
- 実際は常に16行目~最後の行まで込むようになってしまっています。
175
+ 実際は常に16行目~最後の行まで書き込むようになってしまっています。
176
176
  ここは、カレンダーを登録した行だけに書き込むようにする必要があります(下記)
177
177
 
178
178
  ```diff

3

追記

2021/12/19 02:52

投稿

退会済みユーザー
answer CHANGED
@@ -182,6 +182,92 @@
182
182
  + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
183
183
  ```
184
184
 
185
+
186
+ # 改善案
187
+ 元々のコードですが、同じ処理について列を変えて繰り返すコードを追加する過程で
188
+ 列の指定を誤って修正してしまっていると思われる部分がところどころにあります。
189
+ 注意深くデバッグして正しく動けば問題ないのですが、現状のアプローチでは下記のような問題があります。
190
+
191
+ ・仮に登録処理の列が増えたり減ったりした場合に、4つのブロックそれぞれを変更しなければならなくなる。
192
+ ・その際にチェックが不足していると、同じような列指定ミスが発生する可能性が高くなる。
193
+
194
+ 2つ前の御質問と同様に、規則性を見出してまとめられるところはまとめた方が、変更に強く、バグを出しにくいコードになります。
195
+
196
+ たとえば今回で言えば、「各日付の4つの処理件名列と、登録済フラグを書き込む列はそれぞれ4列ずつ離れている」という規則性があります。
197
+ ![イメージ説明](2f15bc29bae1d4534e8f5568db68e4a3.png)
198
+  
199
+ そこで、「件名の取得とカレンダーへの登録、及び登録済フラグの書き込み」を1つの処理としてまとめ、
200
+ 列を1つずつ移動させればすっきりしたコードになります。
201
+
202
+ 下記では、もともとのforループ(targetRowを動かすループ)の中に、もう1つforループを加えています。
203
+ この追加したforループの中で、column という変数を0~3までループさせています。
204
+ 各処理対象に対して column 変数が示す値を加算することで、1列ずつ移動して処理を行っています。
205
+
206
+ ```js
207
+ // 4列分の処理をまとめたコード
208
+
209
+
210
+ function createEvent2() {
211
+ //▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
212
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
213
+ const mysheet1 = ss.getSheetByName("カレンダー転記用");
214
+ const calId = mysheet1.getRange(9, 3).getValue();
215
+ const cal = CalendarApp.getCalendarById(calId);
216
+ const targetRows = mysheet1.getRange('C13').getValue();
217
+ console.log("targetRows " + targetRows);
218
+
219
+ //予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
220
+ const endRow = targetRows + 15
221
+ console.log("endRow " + endRow);
222
+
223
+ for (let i = 16; i < endRow + 1; i++) {
224
+ const myRange = mysheet1.getRange(i, 4, 1, 4);
225
+ if (myRange.isBlank()) {
226
+ mysheet1.getRange(i, 12, 1, 1).setValue("対象外");
227
+ //getRange(行目,列目,●行分,●列分)
228
+ }
229
+ }
230
+
231
+ //▼データ取得範囲の指定
232
+ //各種予定のデータ取得範囲の指定 
233
+ //getRange(行目,列目,●行分,●列分)
234
+ //予定配列>>セルB16(行16,列2)~L列まで 
235
+ const eventRange = mysheet1.getRange(16, 2, targetRows, 11);
236
+ console.log("eventRange " + eventRange.getA1Notation());
237
+
238
+ //▼各予定データを配列(myEvent)として取得する
239
+ const myEvent = eventRange.getValues();
240
+ Logger.log(myEvent);
241
+
242
+ //▼各日付ごとに処理する
243
+ for (let i = 0; i < targetRows; i++) {
244
+ let myDate = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
245
+ let ngFlag = myEvent[i][10]; //「対象外フラグ」は起点B16から下にi行、右に10 
246
+ // 「対象外」であればスキップして次の行へ。
247
+ if (ngFlag === "対象外") {
248
+ continue;
249
+ }
250
+ //▼「①~④予定」を一列ずつ処理(column:0~3までループ)
251
+ for (let column = 0; column < 4; column++) {
252
+ let flag = myEvent[i][6 + column]; //「①~④登録済フラグ」は起点B16から下にi行、右に6+column
253
+ // 「登録済」であればスキップして隣の列へ。
254
+ if (flag === "登録済") {
255
+ continue;
256
+ }
257
+ //「予定名(title)」を取得
258
+ let title = myEvent[i][2 + column]; //「①~④予定名」は起点0(B16)から下にi行、右に2+column
259
+
260
+ //▼カレンダーへの予定登録
261
+ cal.createAllDayEvent(title, new Date(myDate));
262
+ //▼スプレッドシートへの「登録済」フラグ記載
263
+ mysheet1.getRange(16 + i, 8 + column, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
264
+ }
265
+ }
266
+ //▼ダイアログMsgの表示
267
+ Browser.msgBox("Googleカレンダーへの転記作業が完了しました。\n登録内容はカレンダー転記シートで確認してください。", Browser.Buttons.OK);
268
+ }
269
+ ```
270
+
185
271
  # その他
186
272
 
187
273
  本件の質問とは直接関係ありませんが、スクリプトのタイムゾーン設定が日本時間になっていない場合、日時がずれてGoogleカレンダーに登録されることがあります。

2

修正

2021/12/19 02:45

投稿

退会済みユーザー
answer CHANGED
@@ -102,7 +102,7 @@
102
102
  //▼スプレッドシートへの「登録済」フラグ記載
103
103
  //getRange(行目,列目,●行分,●列分) >>セルJ16以降に転記
104
104
  - mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
105
- + mysheet1.getRange(16 + i, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
105
+ + mysheet1.getRange(16 + i, 10, 1, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
106
106
  }
107
107
 
108
108
  //▼「④予定」の取得
@@ -172,14 +172,16 @@
172
172
 
173
173
  (3)「登録済」フラグの書き込み
174
174
  元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
175
- 実際は常に16行目に書き込むようになってしまっています。
175
+ 実際は常に16行目~最後の行まで込むようになってしまっています。
176
- ここは、カレンダーを登録した行に書き込むようにする必要があります(下記)
176
+ ここは、カレンダーを登録した行だけに書き込むようにする必要があります(下記)
177
+
177
- ```
178
+ ```diff
178
179
  //▼スプレッドシートへの「登録済」フラグ記載
179
180
  //getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
180
181
  - //mysheet1.getRange(16, 8, targetRows, 1).setValue("登録済"); //スプシH列に「登録済」と追記
181
182
  + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
182
183
  ```
184
+
183
185
  # その他
184
186
 
185
187
  本件の質問とは直接関係ありませんが、スクリプトのタイムゾーン設定が日本時間になっていない場合、日時がずれてGoogleカレンダーに登録されることがあります。

1

修正

2021/12/19 02:01

投稿

退会済みユーザー
answer CHANGED
@@ -102,7 +102,7 @@
102
102
  //▼スプレッドシートへの「登録済」フラグ記載
103
103
  //getRange(行目,列目,●行分,●列分) >>セルJ16以降に転記
104
104
  - mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
105
- + mysheet1.getRange(16, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
105
+ + mysheet1.getRange(16 + i, 10, targetRows, 1).setValue("登録済"); //スプシJ列に「登録済」と追記
106
106
  }
107
107
 
108
108
  //▼「④予定」の取得
@@ -170,7 +170,16 @@
170
170
 
171
171
  今回の場合はforループの中で1行ずつ条件判定しているので、for文が先で正解です。
172
172
 
173
-
173
+ (3)「登録済」フラグの書き込み
174
+ 元の質問文では、カレンダーに登録した行についてH列~K列に「登録済」という値を設定しようとされていますが、
175
+ 実際は常に16行目に書き込むようになってしまっています。
176
+ ここは、カレンダーを登録した行に書き込むようにする必要があります(下記)
177
+ ```
178
+ //▼スプレッドシートへの「登録済」フラグ記載
179
+ //getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
180
+ - //mysheet1.getRange(16, 8, targetRows, 1).setValue("登録済"); //スプシH列に「登録済」と追記
181
+ + mysheet1.getRange(16 + i, 8, 1, 1).setValue("登録済"); //スプシH列に「登録済」と追記
182
+ ```
174
183
  # その他
175
184
 
176
185
  本件の質問とは直接関係ありませんが、スクリプトのタイムゾーン設定が日本時間になっていない場合、日時がずれてGoogleカレンダーに登録されることがあります。