回答編集履歴

6

一部語句追加

2022/03/20 22:22

投稿

退会済みユーザー
test CHANGED
@@ -93,17 +93,17 @@
93
93
  理由:少しでも処理を速くするためです。
94
94
  getRange / getValue[s] / setValue[s] のようなAPIの実行には時間がかかります。
95
95
  (ここでの「API」とは、SpreadsheetApp. ~ で呼び出す関数全般と考えてもらってよいです)
96
- 一方、一度配列として読み込んだデータを加工する処理は、APIの実行に比べ、たいてい格段に短く済みます。
96
+ 一方、一度配列として読み込んだデータを加工する処理(push等を含む)は、APIの実行に比べ、たいてい格段に短く済みます。
97
97
 
98
98
  getValuesを使うときは、なるべく広い範囲をまとめて配列として読み込む
99
99
   ↓
100
- 配列データ加工
100
+ 配列データ加工(pushやmap等で新しい配列を作る等)
101
101
   ↓
102
102
  まとめてsetVauesで書き込み
103
103
 
104
104
  というようにして、API呼び出し回数をなるべく減らします。
105
105
 
106
106
  たとえば100行のデータを1行1行getValueで読み込んで、加工し、1行ずつsetValueで書き込むと、最大200回API呼び出しすることになりますが、
107
- 100行まとめてgetValuesで読み込み、配列データとして加工し、まとめてsetVauesで書き込めば、API呼び出しは2回で済みます。
107
+ 100行まとめてgetValuesで読み込み、配列データとして加工(pushやmap等で配列を作る処理含む)し、まとめてsetVauesで書き込めば、API呼び出しは2回で済みます。
108
108
 
109
109
 

5

 

2022/03/20 13:41

投稿

退会済みユーザー
test CHANGED
@@ -66,3 +66,44 @@
66
66
  - mySheet2.getRange(OutMaxRow1 + 1 + r, 4, 1, 5).setValues(values);
67
67
  + mySheet2.getRange(OutMaxRow1 + 1 , 4, 1, 5).setValues(values);
68
68
  ```
69
+
70
+ ---
71
+ # コメントの質問に対する回答
72
+ <さら問い1>
73
+ > 23行目以降でValues[0][~]となっているので、
74
+ > ループ2回目がまわる時、配列Valuesの中にはループ1回目の
75
+ > データが残っている状態かと思います。
76
+ > データが残っていても2回目のループ処理で、1回目ループの
77
+ > データは上書きされるので残っていても問題なし、という
78
+ > 理解であっていますか?
79
+
80
+ → 厳密には、valuesはローカル変数であり、(少なくとも理論的には)ループの度に生成されています。
81
+ 2回目のループにおけるvaluesは、1回目のループのvaluesとは、名前が一緒ですが別物です。
82
+ したがって2回目のループで、"valuesの中に1回目のデータが残っているが上書きされる"ということではありません。
83
+ 「前と違う、新しいvaluesという名前に、次の行の配列データが結び付けられる」と言った方が適切かもしれません。
84
+ いずれにしても1回前に取得したデータは影響しないため、問題はないという結論に変わりはありません。
85
+
86
+ <さら問い2>
87
+ > 今回ブロック内の処理をする際、
88
+ > a)5列1行ずつデータを取得し、配列を作る方法
89
+ > b)複数行分をまとめて一度で配列を作る方法
90
+ > どちらの方法がおススメでしょうか? 
91
+
92
+ b) の方がおすすめですね。
93
+ 理由:少しでも処理を速くするためです。
94
+ getRange / getValue[s] / setValue[s] のようなAPIの実行には時間がかかります。
95
+ (ここでの「API」とは、SpreadsheetApp. ~ で呼び出す関数全般と考えてもらってよいです)
96
+ 一方、一度配列として読み込んだデータを加工する処理は、APIの実行に比べ、たいてい格段に短く済みます。
97
+
98
+ getValuesを使うときは、なるべく広い範囲をまとめて配列として読み込む
99
+  ↓
100
+ 配列データ加工
101
+  ↓
102
+ まとめてsetVauesで書き込み
103
+
104
+ というようにして、API呼び出し回数をなるべく減らします。
105
+
106
+ たとえば100行のデータを1行1行getValueで読み込んで、加工し、1行ずつsetValueで書き込むと、最大200回API呼び出しすることになりますが、
107
+ 100行まとめてgetValuesで読み込み、配列データとして加工し、まとめてsetVauesで書き込めば、API呼び出しは2回で済みます。
108
+
109
+

4

 

2022/03/20 08:07

投稿

退会済みユーザー
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ・修正案
34
34
 
35
- ループごとにvaluesは1行ずつしか取得していないのですから、
35
+ ループごとにvaluesは1行ずつしか取得していないのですから、
36
36
  下記のように、values[0][~] とします。
37
37
  ```js
38
38
  //二次元配列(Values)内の項目は「部署」「件数」「開始時刻」「終了時刻」「所用時間」の5項目

3

 

2022/03/20 08:07

投稿

退会済みユーザー
test CHANGED
@@ -23,7 +23,7 @@
23
23
  let endTime = values[r][3];
24
24
  let length = values[r][4];
25
25
  ```
26
- としていますが、上述の通り、valuesは1行分しかデータがない(= values[0][] までしかデータがない)のですから、
26
+ としていますが、上述の通り、valuesはループ毎に毎回1行分しかデータが入っていない(= values[0][] までしかデータがない)のですから、
27
27
  forループが1回まわって、r が 1になったとき
28
28
  let Branch = values[1][0];
29
29
  を実行したところで、存在しないインデックス(1)にアクセスすることになり、エラーが発生しています。

2

 

2022/03/20 06:44

投稿

退会済みユーザー
test CHANGED
@@ -44,9 +44,9 @@
44
44
  ```
45
45
   
46
46
  また、33行目以降で、 ループごとにマージシートの最終行(OutMaxRow1)を取得しているにもかかわらず
47
- ループカウンタ r を用いてさらに行を加算してしまっているので
47
+ ループカウンタ r を用いてさらに行を加算しているので
48
- このままだとループが回る度にマージシートの転記に空白行ができてしまいます。
48
+ このままだとループが回る度にマージシートの転記先の前に空白行ができてしまいます。
49
- したがって、下記のように、マージシートに転記する処理では、r の加算は不要です。
49
+ したがって、下記のように、マージシートに転記する部分では、r の加算は不要です。
50
50
 
51
51
  (31行目以降)
52
52
  ```diff

1

 

2022/03/20 06:43

投稿

退会済みユーザー
test CHANGED
@@ -43,7 +43,7 @@
43
43
  let length = values[0][4];
44
44
  ```
45
45
   
46
- また、33行目以降で、 ループごとにマージシートの最行を取得しているにもかかわらず
46
+ また、33行目以降で、 ループごとにマージシートの最(OutMaxRow1)を取得しているにもかかわらず
47
47
  ループカウンタ r を用いてさらに行を加算してしまっているので
48
48
  このままだとループが回る度にマージシートの転記行に空白行ができてしまいます。
49
49
  したがって、下記のように、マージシートに転記する処理では、r の加算は不要です。