回答編集履歴

6

ついき

2022/11/26 18:25

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -118,5 +118,14 @@
118
118
  - `allValues`は、2次元配列。
119
119
  - 引数の`arr`は、その各要素(1次元配列)を表現。
120
120
  - `arr[0]`は、各要素(1次元配列)の0番目の要素を指定して、(省略しているけど)`return`で値を戻しており、その値は`true` or `false`です。
121
+
122
+ ##### .filter()について
123
+
124
+ ```javascript
125
+ 配列.filter(コールバック関数)
126
+ ```
121
127
  - `.filter()`は、コールバック関数から`return`戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。
128
+ - 「条件」なので`true`か`false`をreturnする(戻す)ことになります。
129
+ - 今回の場合「`arr[0]`の値が`true`だった場合`true`、そうじゃない場合は`false`」を戻すわけですから、
130
+ - 丁寧に書くと`return arr[0] === true`が条件式になるわけです。
122
- - `array.filter(コールバック関数)` ←コールバック関数から戻され条件に合致る要素のに絞る
131
+ - でも`arr[0]`の値は元からbooleanなので、そんなことしなくてもその値そのものをreturnすだけですみます。

5

ついき

2022/11/26 18:17

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -1,10 +1,10 @@
1
- - 「チェックボックスに1つもチェックがない」というのは、言い方をると「`true`が0こ」です。
1
+ - 「チェックボックスに1つもチェックがない」というのは、言い方を変えると「`true`が0こ」です。
2
2
  - 取得してきた2次元配列を`.fliter()`で`true`をもつものだけに絞り、
3
3
  - 絞った2次元配列の長さが0なら → 1つもチェックされていない。
4
4
  - 長さが1以上なら → 1つまたはそれ以上がチェックされている。という考え方です。
5
5
  - 質問者様のコードをじっくりとは見ていないのですが、どうやら、チェックが1つもなかった場合にしなくてもいい処理も最初に全部しているような気がします。
6
6
  - しなくてもいい処理は、チェックボックスの判定した後にするようにしましょう。
7
- - 1つの関数のなかにたくさんの処理をかくことは、コードの可読性の観点から、また実行時間の観点からもあまりよくありません。
7
+ - 1つの関数のなかにたくさんの処理をかくことは、コードの可読性の観点からあまりよくありません。
8
8
  - 長すぎる場合&汎用性のある処理は、なるべく別関数にしましょう。
9
9
 
10
10
  ### コード例
@@ -118,4 +118,5 @@
118
118
  - `allValues`は、2次元配列。
119
119
  - 引数の`arr`は、その各要素(1次元配列)を表現。
120
120
  - `arr[0]`は、各要素(1次元配列)の0番目の要素を指定して、(省略しているけど)`return`で値を戻しており、その値は`true` or `false`です。
121
- - `.filter()`はコールバック関数`return`戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。
121
+ - `.filter()`はコールバック関数から`return`戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。
122
+ - `array.filter(コールバック関数)` ←コールバック関数から戻される条件に合致する要素のみに絞る

4

ついき

2022/11/26 16:46

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -55,6 +55,7 @@
55
55
 
56
56
  `isChecked()`関数に限らず、関数を作成する際は汎用性を持たせる(他でも使い回しやすい)ようにしています。
57
57
  ですので何を引数として指定するのかはコードの作成者の好みです。
58
+ (なので、質問者様の使いやすいように引数などアレンジしていただいて大丈夫です)
58
59
  使いまわさないのであれば引数は不要です。
59
60
 
60
61
  ---

3

追記

2022/11/26 16:44

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -47,3 +47,74 @@
47
47
  return trueValues.length > 0; // 例 true
48
48
  }
49
49
  ```
50
+
51
+ ---
52
+
53
+ ### ご質問への回答
54
+ > ①isCheckedの後ろの(sheet, startRow, lastRow, col)は、isChecked関数に渡す値(引数)かと。引数指定の要否、何を引数として指定するかはどのように判断すればよいのですか?
55
+
56
+ `isChecked()`関数に限らず、関数を作成する際は汎用性を持たせる(他でも使い回しやすい)ようにしています。
57
+ ですので何を引数として指定するのかはコードの作成者の好みです。
58
+ 使いまわさないのであれば引数は不要です。
59
+
60
+ ---
61
+
62
+ > ②filter()は、配列の要素1つずつに対して、条件に合致するか見ていき、合致したもの  だけを集めて、新たな配列trueValuesを作る、であっていますか?
63
+
64
+ あっています💮
65
+
66
+ > すべてfalseの時、  trueを混ぜた時ともに  console.log(trueValues )、console.log(trueValues.length)、で確認できませんでした。
67
+
68
+ 私のエディタでは問題なく`console.log(trueValues)`も`console.log(trueValues.length)`も確認できているので、質問者様の方でできない理由は不明です。
69
+ 正しく理解はできていますが、試したコードかスプレッドシート側かもしくは確認方法が間違っている可能性があります。
70
+ もしよかったら詳細を教えてくださいませ。
71
+
72
+ ---
73
+
74
+ > ③filter(arr => arr[0])の部分がよくわかりません。arr => arr[0]は、arr[0]は配列の要素0のことで、arrにarr[0]の値を代入すると  いうことを指示している??
75
+
76
+ 違います。
77
+ 質問者様はアロー関数について理解する必要があります。
78
+
79
+ ##### アロー関数について
80
+ ES6から登場した新しい関数の記法です。
81
+ 従来の`function`キーワードによる関数より簡略した書き方をすることができます。
82
+ 他に機能的な違いもありますが今回は関係ないので説明を割愛します。
83
+
84
+ ```javascript
85
+ // 従来の関数
86
+ function oldFunc(number) {
87
+ return number * 10;
88
+ }
89
+ console.log( oldFunc(5) ); // 50
90
+
91
+ // アロー関数
92
+ const newFunc = (number) => {
93
+ return number * 10;
94
+ }
95
+ console.log( newFunc(6) ); // 60
96
+ ```
97
+
98
+ - アロー関数は引数が1つだけの場合`()`を省略可能です。
99
+ - 処理が1行だけの場合、`return`を省略可能です。
100
+
101
+ よって、より簡潔に↑のアロー関数を書くと以下のようになります。
102
+ ```javascript
103
+ const newFunc = number => number * 10;
104
+ ```
105
+
106
+ してがって、こういうことです。
107
+ ```javascript
108
+ // アロー関数
109
+ const trueValues = allValues.filter(arr => arr[0]);
110
+
111
+ // 従来の書き方
112
+ var trueValues = allValues.filter( function(arr) {
113
+ return arr[0];
114
+ } );
115
+ ```
116
+
117
+ - `allValues`は、2次元配列。
118
+ - 引数の`arr`は、その各要素(1次元配列)を表現。
119
+ - `arr[0]`は、各要素(1次元配列)の0番目の要素を指定して、(省略しているけど)`return`で値を戻しており、その値は`true` or `false`です。
120
+ - `.filter()`はコールバック関数で`return`戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。

2

fix

2022/11/26 08:10

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -38,7 +38,7 @@
38
38
  * @return {boolean} trueが1つでもあれば、true。なければfalse
39
39
  */
40
40
  function isChecked(sheet, startRow, lastRow, col) {
41
- const allValues = sheet.getRange(startRow, col, lastRow-(startRow+1)).getValues();
41
+ const allValues = sheet.getRange(startRow, col, lastRow-startRow+1).getValues();
42
42
  // 例 [ [ true ], [ false ], [ true ], [ false ], [ false ] ]
43
43
 
44
44
  const trueValues = allValues.filter(arr => arr[0]);

1

修正

2022/11/26 08:04

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -10,7 +10,7 @@
10
10
  ### コード例
11
11
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-26/4ddd40c3-9cce-4290-8fd2-74f8a6ef289e.png)
12
12
  ```javascript
13
- function makeDocFromTemplate() {
13
+ function createIndvSS() {
14
14
  const ss = SpreadsheetApp.getActiveSpreadsheet();
15
15
  const sheet = ss.getActiveSheet();
16
16
  const lastRow = sheet.getLastRow();
@@ -18,6 +18,7 @@
18
18
  // 1つでもチェックされているかどうかの判定
19
19
  const flag = isChecked(sheet, 2, lastRow, 1); // 例 true
20
20
 
21
+ // flagがfalseなら(1つもチェックされていなかったら)
21
22
  if (!flag) {
22
23
  // 「処理中断のお知らせ」のメッセージボックスが表示されて、
23
24