回答編集履歴
4
2つ目のコードをリファクタリング
test
CHANGED
@@ -43,10 +43,9 @@
|
|
43
43
|
const lastCol = 6; // データの最終列(F列)
|
44
44
|
const lastRow = sheet.getLastRow(); // データの最終行
|
45
45
|
const data = sheet.getRange(2, 1, lastRow-1, lastCol).getValues(); // データを取得
|
46
|
-
const result = []; // G列の値を格納する配列
|
47
46
|
|
48
|
-
// E="D"かつF="C"なら
|
47
|
+
// E="D"かつF="C"ならAの値を、違うなら空文字をいれてresultという配列をつくる
|
49
|
-
data.
|
48
|
+
const result = data.map(([A,_,__,___,E,F]) => (E=='D' && F=='C') ? [A] : ['']);
|
50
49
|
|
51
50
|
// resultの値をスプレッドシートG列に反映
|
52
51
|
sheet.getRange(2, lastCol+1, lastRow-1, 1).setValues(result);
|
3
2つの目のコードを軽く
test
CHANGED
@@ -40,23 +40,16 @@
|
|
40
40
|
function exampleFunc2() {
|
41
41
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
42
42
|
const sheet = ss.getActiveSheet();
|
43
|
+
const lastCol = 6; // データの最終列(F列)
|
43
44
|
const lastRow = sheet.getLastRow(); // データの最終行
|
45
|
+
const data = sheet.getRange(2, 1, lastRow-1, lastCol).getValues(); // データを取得
|
44
46
|
const result = []; // G列の値を格納する配列
|
45
47
|
|
46
|
-
for (let i=2; i<=lastRow; i++) {
|
47
|
-
|
48
|
+
// E="D"かつF="C"なら、resultにAの値をいれる。違うなら、空文字をいれる
|
48
|
-
const Fvalue = sheet.getRange(i,6).getValue();
|
49
|
-
|
50
|
-
|
49
|
+
data.forEach(([A,_,__,___,E,F]) => (E=='D' && F=='C') ? result.push([A]) : result.push(['']));
|
51
|
-
const Avalue = sheet.getRange(i,1).getValue();
|
52
|
-
result.push([Avalue]); // resultにAの値をいれる
|
53
|
-
} else { // 違うなら
|
54
|
-
result.push(['']); // 空文字をいれる
|
55
|
-
}
|
56
|
-
}
|
57
50
|
|
58
51
|
// resultの値をスプレッドシートG列に反映
|
59
|
-
sheet.getRange(2,
|
52
|
+
sheet.getRange(2, lastCol+1, lastRow-1, 1).setValues(result);
|
60
53
|
}
|
61
54
|
```
|
62
55
|
|
@@ -67,6 +60,8 @@
|
|
67
60
|
|
68
61
|
よって、判定は1行ずつ行いますが、G列の値の結果だけ別の配列`result`に格納しておき、全ての判定が終わった後にGの値を一括でスプレッドシートに書き込むようにしました。
|
69
62
|
|
70
|
-
他の方の回答の方がコードとしては綺麗なのですが、1行ずつ
|
63
|
+
他の方の回答の方がコードとしては綺麗なのですが、「1行ずつ読み込み → 1行ずつ判定 → 1行ずつ書き込み」を行なっていますので、おそらく実行時間が長くなるような気がします。
|
64
|
+
私のコードは「一括読み込み → 1行ずつ判定 → 一括書き込み」という処理です。
|
65
|
+
|
71
66
|
両方試してみてどちらも問題なさそうでしたら、お好みの方を選んでいただいたらいいと思います。
|
72
67
|
|
2
コードパターン追加
test
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|(中略)|
|
8
8
|
|4038|鹿|any|100|44|44|100|鹿|
|
9
9
|
|
10
|
-
### コード例
|
11
10
|
```javascript
|
12
11
|
function exampleFunc() {
|
13
12
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
@@ -25,6 +24,42 @@
|
|
25
24
|
}
|
26
25
|
```
|
27
26
|
|
27
|
+
---
|
28
|
+
|
29
|
+
またはこちらでしょうか…?
|
30
|
+
|
31
|
+
|行\列|A|B|C|D|E|F|G|
|
32
|
+
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|
33
|
+
|1|猫|any|any|any|D|C|猫|
|
34
|
+
|2|犬|any|any|any|D|D||
|
35
|
+
|3|牛|any|any|any|C|D||
|
36
|
+
|(中略)|
|
37
|
+
|4038|鹿|any|any|any|D|C|鹿|
|
38
|
+
|
39
|
+
```javascript
|
40
|
+
function exampleFunc2() {
|
41
|
+
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
42
|
+
const sheet = ss.getActiveSheet();
|
43
|
+
const lastRow = sheet.getLastRow(); // データの最終行
|
44
|
+
const result = []; // G列の値を格納する配列
|
45
|
+
|
46
|
+
for (let i=2; i<=lastRow; i++) {
|
47
|
+
const Evalue = sheet.getRange(i,5).getValue();
|
48
|
+
const Fvalue = sheet.getRange(i,6).getValue();
|
49
|
+
|
50
|
+
if (Evalue == 'D' && Fvalue == 'C') { // E="D"かつF="C"なら
|
51
|
+
const Avalue = sheet.getRange(i,1).getValue();
|
52
|
+
result.push([Avalue]); // resultにAの値をいれる
|
53
|
+
} else { // 違うなら
|
54
|
+
result.push(['']); // 空文字をいれる
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
// resultの値をスプレッドシートG列に反映
|
59
|
+
sheet.getRange(2, 7, lastRow-1, 1).setValues(result);
|
60
|
+
}
|
61
|
+
```
|
62
|
+
|
28
63
|
### 解説
|
29
64
|
今回頭を悩ませたのが、4038行という行数の多さです。
|
30
65
|
GASは1日にGoogleスプレッドシートに書き込める回数に制限があります(回数というか実行時間というか…)。
|
1
追記
test
CHANGED
@@ -27,7 +27,11 @@
|
|
27
27
|
|
28
28
|
### 解説
|
29
29
|
今回頭を悩ませたのが、4038行という行数の多さです。
|
30
|
-
GASは1日にGoogleスプレッドシートに書き込める回数に制限があります(
|
30
|
+
GASは1日にGoogleスプレッドシートに書き込める回数に制限があります(回数というか実行時間というか…)。
|
31
|
-
ですので、1行ずつ条件判定&書き込みを行うと、
|
31
|
+
ですので、1行ずつ条件判定&書き込みを行うと、上限をオーバーしてしまう危険性があり…。
|
32
32
|
|
33
|
-
よって、判定は1行ずつ行いますが、G列の値の結果だけ別の配列`result`に格納しておき、全ての判定が終わった後に
|
33
|
+
よって、判定は1行ずつ行いますが、G列の値の結果だけ別の配列`result`に格納しておき、全ての判定が終わった後にGの値を一括でスプレッドシートに書き込むようにしました。
|
34
|
+
|
35
|
+
他の方の回答の方がコードとしては綺麗なのですが、1行ずつ毎回書き込みを行なっていますのでおそらく実行時間が長くなるような気がします。
|
36
|
+
両方試してみてどちらも問題なさそうでしたら、お好みの方を選んでいただいたらいいと思います。
|
37
|
+
|