回答編集履歴

4

2つ目のコードをリファクタリング

2022/10/11 08:29

投稿

Cocode
Cocode

スコア2316

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"なら、resultにAの値をいれる。違うなら空文字をいれる
47
+ // E="D"かつF="C"ならAの値を違うなら空文字をいれてresultという配列をつく
49
- data.forEach(([A,_,__,___,E,F]) => (E=='D' && F=='C') ? result.push([A]) : result.push(['']));
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つの目のコードを軽く

2022/10/11 08:20

投稿

Cocode
Cocode

スコア2316

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
- const Evalue = sheet.getRange(i,5).getValue();
48
+ // E="D"かつF="C"なら、resultにAの値をいれる。違うなら、空文字をいれる
48
- const Fvalue = sheet.getRange(i,6).getValue();
49
-
50
- if (Evalue == 'D' && Fvalue == 'C') { // E="D"かつF="C"なら
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, 7, lastRow-1, 1).setValues(result);
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

コードパターン追加

2022/10/11 07:59

投稿

Cocode
Cocode

スコア2316

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

追記

2022/10/11 07:43

投稿

Cocode
Cocode

スコア2316

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
+