回答編集履歴

1

詳しい説明を追記

2021/04/06 16:12

投稿

Automatic9045
Automatic9045

スコア313

test CHANGED
@@ -1,10 +1,132 @@
1
1
  現時点で質問者さんが書いた処理について、1行目から最後の行まで繰り返せば良いです。
2
2
 
3
+ ですから、分かりやすくまとめると以下のようになります。
4
+
5
+
6
+
7
+ 1. 編集先のシートを取得します。ここは既に完成しています。
8
+
9
+ 2. 1行目のP列のセルの値を取得します。
10
+
11
+ 3. 手順2で取得した値が1以上の場合(質問者さんは「1より大きい」と書かれていますが、コードを見るに「1以上」の間違いではないでしょうか)、1行目のN列のセルの値を空にします。
12
+
13
+ 4. 手順2~3の処理を、1行目からシートの最終行までfor文で繰り返すようにします。
14
+
15
+
16
+
17
+ ###1. 編集先のシートを取得する
18
+
19
+ ここに関しては既に完成しています。
20
+
21
+
22
+
23
+ ```JS
24
+
25
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
26
+
27
+ var sheet = ss.getSheetByName("資機材準備");
28
+
29
+ ```
30
+
31
+
32
+
33
+ ###2. 1行目のP列のセルの値を取得する
34
+
35
+ これも質問者さんが提示されているコードを少し変えればOKなのですが、
36
+
37
+ 手順4で書き換えやすくするために、ここではgetRange関数の違う使い方を試してみましょう。
38
+
39
+
40
+
41
+ getRange関数では、`getRange("P6")`などとセル番号を直接文字列で指定する他に、
42
+
43
+ 何行目か・何列目かをそれぞれ数値で指定する方法も提供されています。
44
+
45
+
46
+
47
+ 例えば、C6のセルの値を取得したい場合は
48
+
49
+
50
+
51
+ ```JS
52
+
53
+ sheet.getRange(6, 3).getValue();
54
+
55
+ ```
56
+
57
+
58
+
59
+ となります。1つめの引数は6行目だから6、2つめの引数はA・B・Cときて3列目だから3 ということですね。
60
+
61
+
62
+
63
+ それでは、1行目のP列のセルの値を取得するにはどうすれば良いでしょう?
64
+
65
+ ご自分で書いてみて下さい。
66
+
67
+
68
+
69
+ ###3. 手順2で取得した値が1より大きい場合、1行目のN列のセルの値を空にする
70
+
71
+ 手順2は出来ましたか?
72
+
73
+ 取得した値は変数pValueに入れておいてください。
74
+
75
+
76
+
77
+ さて、次にいきましょう。
78
+
79
+ まず「手順2で取得した値が1以上」かを判別する必要がありますが、これは単なるif文による場合分けですね。
80
+
81
+
82
+
83
+ ↓答え(数字以外を入力されたら無視する機能付き)↓
84
+
85
+
86
+
87
+ ```JS
88
+
89
+ if (isNaN(pValue)) { // isNaN="is Not a Number"
90
+
91
+ // 数字以外の場合はここへ
92
+
93
+ } else if (pValue > 0) {
94
+
95
+ // 手順2で取得した値が1以上のとき、ここの処理を実行
96
+
97
+ }
98
+
99
+ ```
100
+
101
+
102
+
103
+ 次に、「1以上」の時に限って「N列のセルの値を空に」します。
104
+
105
+ 特定のセルの値を編集するのはsetValue関数です。
106
+
107
+
108
+
109
+ これについても、getRange関数は手順2で示した使い方でやってみて下さい。
110
+
111
+
112
+
113
+ さて、ここまで正しく出来ましたか?
114
+
115
+ 一旦試しに実行してみて、ちゃんと動いていることが確認出来たら手順4に進んで下さい。
116
+
117
+ 動かない原因が分からなくなってしまったら質問して下さい。
118
+
119
+
120
+
121
+ ###4. 手順2~3の処理を、1行目からシートの最終行までfor文で繰り返すようにする
122
+
123
+ for文で行数分繰り返すことになるのですが、まずはその「シートの最終行」が何行目なのかを知る必要がありますね。
124
+
3
125
  シート内の何か入力されている最終行が何行目なのかは、
4
126
 
5
127
 
6
128
 
7
- ```GoogleAppsScript
129
+ ```JS
8
130
 
9
131
  var maxRow = sheet.getMaxRows();
10
132
 
@@ -12,14 +134,100 @@
12
134
 
13
135
 
14
136
 
15
- とするで取得できます。
137
+ で取得できます。
16
-
138
+
139
+
140
+
17
- これで1行目ら`maxRows`行目まについて、for文を使ってそれぞれ処理していけばOKです
141
+ さて繰り返しの始まりと終わり、どちらも明らになったのでfor文で繰り返し処理を書きまょう
142
+
143
+ for文の書き方は大丈夫ですか?一応答えを載せておきます↓
144
+
145
+
146
+
147
+ ```JS
148
+
149
+ for (var i = 1; i <= maxRow; i++) {
150
+
151
+ // この中の処理を繰り返す
152
+
153
+ }
154
+
155
+ ```
156
+
157
+
158
+
159
+ ここまで出来たら、手順2~3で書いたコードを上の答えの`// この中の処理を繰り返す`の部分に写します。
160
+
161
+ そして、手順2~3では「1行目」で固定していましたが、ここで「`i`行目」に書き換えます。
162
+
163
+ もし質問者さんがfor文にまだ慣れていないようであればここが難解かもしれません。頑張って下さい。
164
+
165
+
166
+
167
+ さあ、これでおしまいです。お疲れ様でした。
18
168
 
19
169
 
20
170
 
21
171
  ## 発展編…本当はこうやった方が良いです
22
172
 
173
+ 必要なセルの値をはじめに全て取得した方が処理がはやくなりますが、2次元配列を使用することになり複雑なため、今回の回答では省略します。
174
+
23
- はじめに必要な全てのセルの値を取得して配列型の変数に格納した方が処理がはやくなります
175
+ **ただ「必要なセルの値をはじめに全て取得した方が処理がはやくなる」ということだけは覚えておいて下さい**
176
+
24
-
177
+ 少ない行数ではそこまで気になるほどにはなりませんが、**getRangeやgetValueなどは使った回数だけどんどん遅くなっていきます。**
178
+
179
+
180
+
181
+ ## その他
182
+
183
+ 文末にセミコロンを付けている箇所と付けていない箇所が混在しています。どちらかに統一するとコードが綺麗になります。
184
+
185
+
186
+
187
+ 余談ですが、JavaScript・GAS界隈ではセミコロンを付ける派と付けない派があったりします。因みに私は付ける派です。
188
+
189
+
190
+
191
+ ## 付録:完全な答え
192
+
193
+ どうしても分からない時のために、最後に完全な答えも掲載しておきます。
194
+
25
- もしく知りた場合はコメント欄教えて下さい。
195
+ 写経して力はほとんどつかないので丸写だけはいで下さい。
196
+
197
+
198
+
199
+ この答えを読んでみたものの内容が理解出来なかった場合は、是非質問して下さい。
200
+
201
+
202
+
203
+ ```JS
204
+
205
+ function test(){
206
+
207
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
208
+
209
+ var sheet = ss.getSheetByName("資機材準備");
210
+
211
+
212
+
213
+ var maxRow = sheet.getMaxRows();
214
+
215
+ for (var i = 1; i <= maxRow; i++) {
216
+
217
+ var pValue = sheet.getRange(i, 16).getValue();
218
+
219
+ if (isNaN(pValue)) {
220
+
221
+ // 数字以外の場合はここへ
222
+
223
+ } else if (pValue > 0) {
224
+
225
+ sheet.getRange(i, 14).setValue("");
226
+
227
+ }
228
+
229
+ }
230
+
231
+ }
232
+
233
+ ```