質問編集履歴

5

修正案のコードを追記、エラーコード対象行の記載

2021/10/21 12:23

投稿

detch
detch

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,6 @@
1
+ コード
2
+
1
- ### 前提・実現したいこと
3
+ ```### 前提・実現したいこと
2
4
 
3
5
 
4
6
 
@@ -212,8 +214,168 @@
212
214
 
213
215
 
214
216
 
217
+ qnoir様修正案のコード
218
+
219
+ **36行目から記載**
220
+
221
+ //----------日付の取得----------//
222
+
223
+ //現在日時のDateオブジェクトを作る
224
+
225
+ var date = new Date();
226
+
227
+
228
+
229
+ //現在の「日」を取得し表示形式を整形する
230
+
231
+ var day = date.getDate();
232
+
233
+ var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/d');
234
+
235
+
236
+
237
+ //前日日付にしたいので-1する
238
+
239
+ date.setDate(day - 1);
240
+
241
+
242
+
243
+ //日付の表示形式を整形する
244
+
245
+ var yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/d');
246
+
247
+
248
+
249
+ // 追加
250
+
251
+ fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。
252
+
253
+ fbSheet.getRange('B:B').setNumberFormat('HH:mm'); // B列の表示形式を時刻形式にする。
254
+
255
+
256
+
257
+
258
+
259
+ //----------定義----------//
260
+
261
+ var okData_days = [] //発生日時の格納先
262
+
263
+ var aValues = fbSheet.getRange('A:A').getValues(); //"障害報告"の"発生日時"部分の値を全て取得
264
+
265
+ var lastRow = aValues.filter(String).length; //空白の要素を除いた長さを取得
266
+
267
+
268
+
269
+ // *******以下 修正案**********
270
+
271
+ // 管理シートのデータを二次元配列で取得
272
+
273
+ var sourceData = fbSheet.getRange(1, 1, lastRow, 7).getValues();
274
+
275
+
276
+
215
- ### 補足情報(FW/ツールバージョンなど)
277
+ // 「今日7:30」を作成
278
+
216
-
279
+ var baseDateTime = new Date();
280
+
217
-
281
+ baseDateTime.setHours(7);
282
+
218
-
283
+ baseDateTime.setMinutes(30);
284
+
285
+ baseDateTime.setSeconds(0);
286
+
287
+ baseDateTime.setMilliseconds(0);
288
+
289
+
290
+
291
+ // 書き込み用の配列
292
+
293
+ var outputValues = [];
294
+
295
+
296
+
297
+ // 配列から1行ずつ日時を取得して比較
298
+
299
+ for (var i = 0, y = 0; i < sourceData.length; i++) {
300
+
301
+ var row = sourceData[i];
302
+
303
+
304
+
305
+ // 当日の7:30との差(秒)を計算
306
+
307
+ var duration = Math.floor(baseDateTime.getTime() / 1000) -
308
+
309
+ **Math.floor(getDateTime(row[0], row[1]).getTime() / 1000);** //エラーコード80行目対象箇所
310
+
311
+
312
+
313
+ // 当日の7:30との差が、0秒より大きく24時間以下の場合は、書き込み用の配列に加える
314
+
315
+ if (duration > 0 && duration <= 60 * 60 * 24) {
316
+
317
+ outputValues.push(row);
318
+
319
+ }
320
+
321
+ }
322
+
323
+
324
+
325
+ // 日誌用シートのB列6行目以降にデータを書き込む
326
+
327
+ fS_Nissi.getRange(6, 2, outputValues.length, 7).setValues(outputValues)
328
+
329
+ }
330
+
331
+
332
+
333
+
334
+
335
+ /************************************************
336
+
337
+ * 日付と時刻のセルから、対応する日時データを返す。
338
+
339
+ *
340
+
341
+ * 引数:
342
+
343
+ * date : Date : 日付
344
+
345
+ * time : Date : 時刻
346
+
347
+ *
348
+
349
+ * 返り値:Date
350
+
351
+ *  :指定されたdate と timeに対応するDateオブジェクト
352
+
353
+ * ***********************************************/
354
+
355
+ function getDateTime(date, time) {
356
+
357
+ **var hour = time.getHours();** //エラーコード104行目対象箇所
358
+
359
+ var minute = time.getMinutes();
360
+
219
- ここにより詳細な情報を記載してください。
361
+ date.setHours(hour);
362
+
363
+ date.setMinutes(minute);
364
+
365
+ return date;
366
+
367
+ }
368
+
369
+
370
+
371
+
372
+
373
+ エラーコード
374
+
375
+ エラー
376
+
377
+ TypeError: time.getHours is not a function
378
+
379
+ getDateTime @ コード.gs:104
380
+
381
+ myFunction @ コード.gs:80

4

画像の追加

2021/10/21 12:22

投稿

detch
detch

スコア1

test CHANGED
File without changes
test CHANGED
@@ -192,6 +192,26 @@
192
192
 
193
193
  ![イメージ説明](adc3c852ef9e5a5c5624686b8091eed6.png)
194
194
 
195
+
196
+
197
+ 追記(2021/10/20/22:12)
198
+
199
+ 画像を追加いたします。
200
+
201
+
202
+
203
+ fbSheet日付部分のスクショ
204
+
205
+ ![イメージ説明](f36ec3a4d89be28e06d91ccd2f459bdb.png)
206
+
207
+
208
+
209
+ fbSheet時間部分のスクショ
210
+
211
+ ![イメージ説明](5a516ce715c62ab7a20b69d5eef8253c.png)
212
+
213
+
214
+
195
215
  ### 補足情報(FW/ツールのバージョンなど)
196
216
 
197
217
 

3

画像の追加、コメントの追記

2021/10/20 13:13

投稿

detch
detch

スコア1

test CHANGED
File without changes
test CHANGED
@@ -190,7 +190,7 @@
190
190
 
191
191
  恐らく、一行ずつ読み込んでいってる際に変数の加算がおかしくなっているのかと思われますがわからないのです。。。
192
192
 
193
-
193
+ ![イメージ説明](adc3c852ef9e5a5c5624686b8091eed6.png)
194
194
 
195
195
  ### 補足情報(FW/ツールのバージョンなど)
196
196
 

2

ペースト先のシート名の変更、画像の追加。

2021/10/18 14:43

投稿

detch
detch

スコア1

test CHANGED
File without changes
test CHANGED
@@ -32,21 +32,19 @@
32
32
 
33
33
  //----------robot管理票のシート情報(コピー元)----------//
34
34
 
35
- var url = "***マスキング***";
35
+ var url = "マスキング";
36
36
 
37
37
  var robotBook = SpreadsheetApp.openByUrl(url);
38
38
 
39
- var robotMgtSheet = robotBook.getSheetByName("A");
39
+ var robotMgtSheet = robotBook.getSheetByName("管理");
40
40
 
41
41
 
42
42
 
43
- //**----------Cの情報(ペースト先)----------**//
43
+ //**----------障害一覧の情報(ペースト先)----------**//
44
44
 
45
45
  var failureBook = SpreadsheetApp.getActiveSpreadsheet();
46
46
 
47
- var fS_Kakou = failureBook.getSheetByName("B");
48
-
49
- var fS_Nissi = failureBook.getSheetByName("C");
47
+ var fS_Nissi = failureBook.getSheetByName("日誌用");
50
48
 
51
49
 
52
50
 
@@ -58,9 +56,9 @@
58
56
 
59
57
 
60
58
 
61
- var fbSheet = failureBook.getSheetByName("Bのコピー");
59
+ var fbSheet = failureBook.getSheetByName("管理 のコピー");
62
60
 
63
- fbSheet.setName("B");
61
+ fbSheet.setName("障害管理");
64
62
 
65
63
 
66
64
 
@@ -124,18 +122,6 @@
124
122
 
125
123
 
126
124
 
127
- //**----------定義----------**/
128
-
129
- var aValues = fbSheet.getRange('A:A').getValues();  //"障害報告"の"発生日時"部分の値を全て取得
130
-
131
- var acolumnlastRow = aValues.filter(String).length;  //空白の要素を除いた長さを取得
132
-
133
-
134
-
135
- var troubleDatas = fbSheet.getRange(1,1,acolumnlastRow,7).getDisplayValues()
136
-
137
-
138
-
139
125
  //**----------定義----------**//
140
126
 
141
127
  var okData_days = [] //発生日時の格納先
@@ -146,13 +132,9 @@
146
132
 
147
133
 
148
134
 
149
- ----ここから質問者様からの要望により途中コードを追記しております----------------
150
-
151
-
152
-
153
135
  //**----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------**//
154
136
 
155
- for(var i=1,y=5; i<lastRow; i++,y++){
137
+ for(var i=1,y=1; i<lastRow; i++,y++){
156
138
 
157
139
  var fbHASSEI_Day = fbSheet.getRange(i,1,1).getDisplayValue();
158
140
 
@@ -168,7 +150,7 @@
168
150
 
169
151
  var okData = fbSheet.getRange(i,1,1,7).getDisplayValues();
170
152
 
171
- fS_Nissi.getRange(y-1,2,1,7).setValues(okData);}
153
+ fS_Nissi.getRange(y+5,2,1,7).setValues(okData);}
172
154
 
173
155
  }else if
174
156
 
@@ -176,7 +158,7 @@
176
158
 
177
159
  var okData = fbSheet.getRange(i,1,1,7).getDisplayValues();
178
160
 
179
- fS_Nissi.getRange(y-1,2,1,7).setValues(okData);
161
+ fS_Nissi.getRange(y+5,2,1,7).setValues(okData);
180
162
 
181
163
  }
182
164
 
@@ -200,6 +182,16 @@
200
182
 
201
183
 
202
184
 
185
+ 追記(2021/10/18/23:39)
186
+
187
+ //**----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------**//の処理の部分は
188
+
189
+ 判定の結果は欲しいデータになっていますが、貼り付け先(添付画像参照)のシートにこの式だと3段飛ばしてから連続してデータが入力されてしまいます。
190
+
191
+ 恐らく、一行ずつ読み込んでいってる際に変数の加算がおかしくなっているのかと思われますがわからないのです。。。
192
+
193
+
194
+
203
195
  ### 補足情報(FW/ツールのバージョンなど)
204
196
 
205
197
 

1

画像の追加、コメントの追記

2021/10/18 14:43

投稿

detch
detch

スコア1

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  GASで当日日付で07:30未満かつ前日日付07:30以上のデータが含まれる行を抽出して、別シートへ貼り付けたい。
6
6
 
7
-
7
+ ![![イメージ説明](7da6756ae204efde321ae56f8e7daab9.png)](5a3b7f2a877e5110a7ac66eb4c714f73.png)
8
8
 
9
9
  ### 発生している問題・エラーメッセージ
10
10
 
@@ -136,14 +136,70 @@
136
136
 
137
137
 
138
138
 
139
+ //**----------定義----------**//
140
+
141
+ var okData_days = [] //発生日時の格納先
142
+
143
+ var aValues = fbSheet.getRange('A:A').getValues();  //"障害報告"の"発生日時"部分の値を全て取得
144
+
145
+ var lastRow = aValues.filter(String).length;  //空白の要素を除いた長さを取得
146
+
147
+
148
+
149
+ ----ここから質問者様からの要望により途中コードを追記しております----------------
150
+
151
+
152
+
153
+ //**----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------**//
154
+
155
+ for(var i=1,y=5; i<lastRow; i++,y++){
156
+
157
+ var fbHASSEI_Day = fbSheet.getRange(i,1,1).getDisplayValue();
158
+
159
+ var fbHASSEI_Time= fbSheet.getRange(i,2,1).getDisplayValue();
160
+
161
+ var fbTime = fbHASSEI_Time.split(':');
162
+
163
+ if(yesterday == fbHASSEI_Day){
164
+
165
+ if(fbTime[0] == "07"){
166
+
167
+ if(fbTime[1] >= "30"){
168
+
169
+ var okData = fbSheet.getRange(i,1,1,7).getDisplayValues();
170
+
171
+ fS_Nissi.getRange(y-1,2,1,7).setValues(okData);}
172
+
173
+ }else if
174
+
175
+ (fbTime[0] > "07"){
176
+
177
+ var okData = fbSheet.getRange(i,1,1,7).getDisplayValues();
178
+
179
+ fS_Nissi.getRange(y-1,2,1,7).setValues(okData);
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+
188
+
139
189
  ### 試したこと
140
190
 
141
- ソースコードは、判定をかけるまえのシートの2次元配列取得まで記載しております。
142
-
143
-
144
-
145
191
  for文を利用して、当日の日付かつ発生時間が07:30未満のものを判定し別シートへ貼り付けるコードを書きましたが、何度やっても貼り付ける行がずれたりしてしまう。当日だけの処理がうまくいっても前日の日付の判定をしたあとそのデータをどうすればよいのかか悩んでいます。
146
192
 
193
+
194
+
195
+ 追記(2021/10/18 20:44)
196
+
197
+ 最初は、シートの日付を判定し対象の者を別のシートへ1行ずつ貼り付ける処理を作っていました。
198
+
199
+ ただ、日付の判定+時間の判定が一致したときのみ貼り付ける処理にしてみたら貼り付け先シートの行がずれたりします。
200
+
201
+
202
+
147
203
  ### 補足情報(FW/ツールのバージョンなど)
148
204
 
149
205