回答編集履歴

2

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

2021/02/06 13:04

投稿

sawa
sawa

スコア3002

test CHANGED
@@ -45,3 +45,137 @@
45
45
  }
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+ ↓もう少し汎用性のある書き方に修正
52
+
53
+
54
+
55
+ ```
56
+
57
+ function teratail_320127b(){
58
+
59
+ const sheet = SpreadsheetApp.getActiveSheet();
60
+
61
+ const startrow = 1; //取得を開始する行
62
+
63
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
64
+
65
+ const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+startrow));
66
+
67
+ console.log(show_values);
68
+
69
+ }
70
+
71
+ ```
72
+
73
+
74
+
75
+ ↓アロー関数使わない場合。あんま変わらないです。
76
+
77
+
78
+
79
+ ```
80
+
81
+ function teratail_320127c(){
82
+
83
+ const sheet = SpreadsheetApp.getActiveSheet();
84
+
85
+ const startrow = 1; //取得を開始する行
86
+
87
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
88
+
89
+ const show_values = values.filter(function(row,i){
90
+
91
+ retun !sheet.isRowHiddenByUser(i+startrow);
92
+
93
+ });
94
+
95
+ console.log(show_values);
96
+
97
+ }
98
+
99
+ ```
100
+
101
+
102
+
103
+ ↓filterを使わず forループでやる場合。これが一番しっくりくるなら、それでもOK
104
+
105
+
106
+
107
+ ```
108
+
109
+ function teratail_320127_d(){
110
+
111
+ const sheet = SpreadsheetApp.getActiveSheet();
112
+
113
+ const startrow = 1; //取得を開始する行
114
+
115
+ const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues();
116
+
117
+
118
+
119
+ let show_values =[];
120
+
121
+ for(i=0; i<values.length; i++){
122
+
123
+ if(!sheet.isRowHiddenByUser(i+startrow)){
124
+
125
+ show_values.push(values[i])
126
+
127
+ }
128
+
129
+ };
130
+
131
+ console.log(show_values);
132
+
133
+ }
134
+
135
+ ```
136
+
137
+
138
+
139
+
140
+
141
+ > 引用テキスト①iは0からvalues.length-1までインクリメントされる
142
+
143
+ > また、アロー式の引数である(row,i)のrowは何を指しているのでしょうか?
144
+
145
+
146
+
147
+ iは、その理解でOKです。valuesという配列の個々の要素が row で i がindex(ざっくり言えば順番)です。
148
+
149
+ いきなり宣言してない rowなんてのが出てくるんで、私も最初の頃は ??ってなりましたが、
150
+
151
+ これは別に適当にvaluesって配列の個々の要素を row っておいただけで、別に value でも、vでもなんでもよいのです。スプレッドシートで取得した二次元配列は行成分を指すので、個人的にはrowって置くことが多いです。
152
+
153
+
154
+
155
+ > 引用テキスト②!sheet.isRowHiddenByUserの値がtrueであればshow_values.push(values[i])のような操作がされるという理解でよいのでしょうか?
156
+
157
+ for ループのコードも書きましたが、その理解で大丈夫と思います。
158
+
159
+
160
+
161
+ 慣れないうちは 普通にforでループさせる書き方でよいと思います。
162
+
163
+
164
+
165
+ だんだんカッコよく書きたい、もっと短いコードで書きたいってなってきたら、今回使った filterやmap,
166
+
167
+ reduceなんかを使うようになって、徐々に理解もしていきます。
168
+
169
+
170
+
171
+ 配列の要素を一つずつ関数に入れていくイメージで、結局やってることはforと一緒ですから。
172
+
173
+
174
+
175
+ 参考
176
+
177
+ [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)
178
+
179
+
180
+
181
+ 珍しくコードを多く書く回答してしまった。。

1

コードの記載ミスを修正

2021/02/06 13:04

投稿

sawa
sawa

スコア3002

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  const values = sheet.getRange(1,1,10,2).getValues();
40
40
 
41
- const show_values = values.filter((row,i) => (!sheet.isRowHiddenByUser(i+1)));
41
+ const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+1));
42
42
 
43
43
  console.log(show_values);
44
44