teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足説明と補足コードを追加

2021/02/06 13:04

投稿

sawa
sawa

スコア3002

answer CHANGED
@@ -21,4 +21,71 @@
21
21
  const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+1));
22
22
  console.log(show_values);
23
23
  }
24
- ```
24
+ ```
25
+
26
+ ↓もう少し汎用性のある書き方に修正
27
+
28
+ ```
29
+ function teratail_320127b(){
30
+ const sheet = SpreadsheetApp.getActiveSheet();
31
+ const startrow = 1; //取得を開始する行
32
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
33
+ const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+startrow));
34
+ console.log(show_values);
35
+ }
36
+ ```
37
+
38
+ ↓アロー関数使わない場合。あんま変わらないです。
39
+
40
+ ```
41
+ function teratail_320127c(){
42
+ const sheet = SpreadsheetApp.getActiveSheet();
43
+ const startrow = 1; //取得を開始する行
44
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
45
+ const show_values = values.filter(function(row,i){
46
+ retun !sheet.isRowHiddenByUser(i+startrow);
47
+ });
48
+ console.log(show_values);
49
+ }
50
+ ```
51
+
52
+ ↓filterを使わず forループでやる場合。これが一番しっくりくるなら、それでもOK
53
+
54
+ ```
55
+ function teratail_320127_d(){
56
+ const sheet = SpreadsheetApp.getActiveSheet();
57
+ const startrow = 1; //取得を開始する行
58
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
59
+
60
+ let show_values =[];
61
+ for(i=0; i<values.length; i++){
62
+ if(!sheet.isRowHiddenByUser(i+startrow)){
63
+ show_values.push(values[i])
64
+ }
65
+ };
66
+ console.log(show_values);
67
+ }
68
+ ```
69
+
70
+
71
+ > 引用テキスト①iは0からvalues.length-1までインクリメントされる
72
+ > また、アロー式の引数である(row,i)のrowは何を指しているのでしょうか?
73
+
74
+ iは、その理解でOKです。valuesという配列の個々の要素が row で i がindex(ざっくり言えば順番)です。
75
+ いきなり宣言してない rowなんてのが出てくるんで、私も最初の頃は ??ってなりましたが、
76
+ これは別に適当にvaluesって配列の個々の要素を row っておいただけで、別に value でも、vでもなんでもよいのです。スプレッドシートで取得した二次元配列は行成分を指すので、個人的にはrowって置くことが多いです。
77
+
78
+ > 引用テキスト②!sheet.isRowHiddenByUserの値がtrueであればshow_values.push(values[i])のような操作がされるという理解でよいのでしょうか?
79
+ for ループのコードも書きましたが、その理解で大丈夫と思います。
80
+
81
+ 慣れないうちは 普通にforでループさせる書き方でよいと思います。
82
+
83
+ だんだんカッコよく書きたい、もっと短いコードで書きたいってなってきたら、今回使った filterやmap,
84
+ reduceなんかを使うようになって、徐々に理解もしていきます。
85
+
86
+ 配列の要素を一つずつ関数に入れていくイメージで、結局やってることはforと一緒ですから。
87
+
88
+ 参考
89
+ [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
90
+
91
+ 珍しくコードを多く書く回答してしまった。。

1

コードの記載ミスを修正

2021/02/06 13:04

投稿

sawa
sawa

スコア3002

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  function teratail_320127(){
19
19
  const sheet = SpreadsheetApp.getActiveSheet();
20
20
  const values = sheet.getRange(1,1,10,2).getValues();
21
- const show_values = values.filter((row,i) => (!sheet.isRowHiddenByUser(i+1)));
21
+ const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+1));
22
22
  console.log(show_values);
23
23
  }
24
24
  ```