回答編集履歴
6
一部語句追加
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
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
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
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
test
CHANGED
@@ -44,9 +44,9 @@
|
|
44
44
|
```
|
45
45
|
|
46
46
|
また、33行目以降で、 ループごとにマージシートの最終行(OutMaxRow1)を取得しているにもかかわらず
|
47
|
-
ループカウンタ r を用いてさらに行を加算して
|
47
|
+
ループカウンタ r を用いてさらに行を加算しているので
|
48
|
-
このままだとループが回る度にマージシートの転記
|
48
|
+
このままだとループが回る度にマージシートの転記先の前に空白行ができてしまいます。
|
49
|
-
したがって、下記のように、マージシートに転記する
|
49
|
+
したがって、下記のように、マージシートに転記する部分では、r の加算は不要です。
|
50
50
|
|
51
51
|
(31行目以降)
|
52
52
|
```diff
|
1
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 の加算は不要です。
|