回答編集履歴

2

コメント欄への回答

2023/02/13 08:55

投稿

Cocode
Cocode

スコア2316

test CHANGED
@@ -44,3 +44,65 @@
44
44
  sheetA.getRange(2, 3, jobsToWrite.length, 1).setValues(jobsToWrite);
45
45
  }
46
46
  ```
47
+
48
+ ---
49
+
50
+ (コメント欄のご質問への回答)
51
+
52
+ > ③8行目のarrや19行目のnameは宣言不要で使えるものでしょうか?
53
+
54
+ そちらはアロー関数の引数ですので宣言しません。
55
+ 宣言するのは変数や定数ですよね。
56
+ アロー関数に関しては先人等が分かりやすい説明をたくさん残してくださっていますので、ぜひ検索してみてください。
57
+
58
+ ```javascript
59
+ // アロー関数
60
+ const namesA = sheetA.getRange('A2:A').getValues().flatMap(arr => arr[0] || []);
61
+
62
+ // 普通の関数
63
+ const namesA = sheetA.getRange('A2:A').getValues().flatMap(function(arr) {return arr[0] || []});
64
+ ```
65
+
66
+ ---
67
+
68
+ > ①8行目「シートAのA列(名前)だけ取得し、1次元配列化する」の箇所の以下のコードですが、flatをmapメソッドで配列全体に実行しているものと推察しますが、flatMapの後の()内で何をしているのかが良くわかりません。=>や||はどういった意味を持つのでしょうか。 =>は「~より大きい」のような比較演算子ではないですよね?
69
+ > 追記:もしかしてこれがアロー関数ってやつですかね…?
70
+ > const namesA = sheetA.getRange('A2:A').getValues().flatMap(arr => arr[0] || []);
71
+
72
+ 回りくどいこのやり方じゃない方が分かりやすかったなぁ…と後悔しておりますすみません…。
73
+ おっしゃる通りアロー関数です。
74
+
75
+ > =>や||はどういった意味を持つのでしょうか。
76
+
77
+ `=>`は、アロー関数の記号です。等号・不等号`<=`ではありません。
78
+
79
+ `||`は、論理和です。
80
+ if文でいずれかに該当するかどうかtrue/falseを判定したいときによく使われると思いますが、
81
+ 左辺がtrueっぽい値なら左辺の値を、左辺がfalseっぽい値で右辺がtrueっぽい値なら右辺の値を、どちらもfalseっぽい値ならfalseを戻すのにも使えます。
82
+
83
+ ```javascript
84
+ const a = '';
85
+ const b = 'bbb';
86
+
87
+ console.log(a || b); // 'bbb'
88
+ ```
89
+
90
+ 私のコードの8行目では、A列の値を.getValues()で取得しています。
91
+ `[ ['田中'], ['佐藤'], ['岡田'], [''], [''], [''], [''], [''], [''], [''], [''], [''] ]`
92
+ 取得できる値は2次元配列配列で、↑という状態なので、`['']`を削除しつつ、`['田中']`たちを1次元配列化しています。
93
+
94
+ `.flatMap()`メソッド自体については、ご存知でなければ一度お調べになってください。
95
+
96
+ ---
97
+
98
+ > ②30行目 returnの後の ? [valuesB[index][1]] : ['']; の?と: ['']はどういった意味を持つのでしょうか。 ※記号(?)で検索を掛けても記事が見つからず…
99
+
100
+ `?`と`:`記号は、三項演算子という、if文を1行でかける記法です。
101
+ 詳細は三項演算子について一度お調べください。
102
+
103
+ ```javascript
104
+ 条件 ? trueの時の処理や値 : falseの時の処理や値;
105
+ ```
106
+
107
+ `['']`については、シートBに該当する名前がないので職業欄になにも入力しないので、空文字`''`を配列の中にいれています。
108
+

1

誤字修正

2023/02/09 16:50

投稿

Cocode
Cocode

スコア2316

test CHANGED
@@ -1,5 +1,6 @@
1
1
  こちらでいかがでしょう?
2
+
2
- 説明はコードないのコメントに記載させていただきましたが、わかりにくい部分があればおっしゃってくださいませ。
3
+ 説明はコードのコメントに記載させていただきましたが、わかりにくい部分があればおっしゃってくださいませ。
3
4
  補足説明いたします。
4
5
 
5
6
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-09/7b47af8e-7214-44cb-91ef-0351b4eae1cf.png)
@@ -12,8 +13,8 @@
12
13
  const sheetA = ss.getSheetByName('SheetA');
13
14
  const sheetB = ss.getSheetByName('SheetB');
14
15
 
15
- // シートAのA列(名前)だけ取得し、1配列化する
16
+ // シートAのA列(名前)だけ取得し、1次元配列化する
16
- const valuesA = sheetA.getRange('A2:A').getValues().flatMap(arr => arr[0] || []);
17
+ const namesA = sheetA.getRange('A2:A').getValues().flatMap(arr => arr[0] || []);
17
18
  // [ '田中', '佐藤', '岡田' ]
18
19
 
19
20
  // シートBの値を全て取得する(1行目は項目名なので除く)
@@ -28,7 +29,7 @@
28
29
  // [ '鈴木', '田中', '山田', '岡田' ]
29
30
 
30
31
  // 職業名の2次元配列を新しく生成する
31
- const jobsToWrite = valuesA.map(name => {
32
+ const jobsToWrite = namesA.map(name => {
32
33
  // シートAの名前がBの名前リストの何番目にあるかインデックスを取得
33
34
  // 配列.indexOf(値)メソッドは、値が配列に存在する場合はインデックス番号を、ない場合は-1を戻す
34
35
  const index = namesB.indexOf(name);