回答編集履歴
6
ついき
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
|
-
- `arr
|
131
|
+
- でも`arr[0]`の値は元からbooleanなので、そんなことしなくてもその値そのものをreturnするだけですみます。
|
5
ついき
test
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
- 「チェックボックスに1つもチェックがない」というのは、言い方を
|
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()`はコールバック関数
|
121
|
+
- `.filter()`は、コールバック関数から`return`戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。
|
122
|
+
- `array.filter(コールバック関数)` ←コールバック関数から戻される条件に合致する要素のみに絞る
|
4
ついき
test
CHANGED
@@ -55,6 +55,7 @@
|
|
55
55
|
|
56
56
|
`isChecked()`関数に限らず、関数を作成する際は汎用性を持たせる(他でも使い回しやすい)ようにしています。
|
57
57
|
ですので何を引数として指定するのかはコードの作成者の好みです。
|
58
|
+
(なので、質問者様の使いやすいように引数などアレンジしていただいて大丈夫です)
|
58
59
|
使いまわさないのであれば引数は不要です。
|
59
60
|
|
60
61
|
---
|
3
追記
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
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-
|
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
修正
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
### コード例
|
11
11
|

|
12
12
|
```javascript
|
13
|
-
function
|
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
|
|