質問: values.filter((row,i) => !sheet.isRowHiddenByUser(i+15)); console.log(show_values); } ``` isRowHiddenByUserの引数を「i」から[i+15」に変えることで やりたかったことが実現できました。 もう少々お聞きしてもよろしいでしょうか? filterメソッドの引数(row,i)とisRowHiddenByUserとの関係をご教示いただけますでしょうか。 アロー式にまだ慣れていないので、functionだとどういう書き方となるのか 教えていただけると今の私でも理解できるかもしれません。 大変恐縮ではございますが、せっかくなのできちんと理解しておきたいと思うのです。 宜しくお願いいたします。
回答: GASの質問なので、`Google Apps Script` のタグを付けた方が回答が得られます。 ご質問の件ですが、isRowHiddenByUser を使うと非表示判定ができるので、 これとfilterを組み合わせれば出来ます。 ByUserってあると手動のみっぽいですがGASで非表示にした行でも大丈夫です。 フィルタ機能以外で非表示にしている行なら true を返すので、 表示されている == 非表示ではない ってことですから !をつけてあげるのと、 配列は0スタートなので、行は +1 で取得する点だけ気を付ければ良いかと。 サンプルコード ``` function teratail_320127(){ const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getRange(1,1,10,2).getValues(); const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+1)); console.log(show_values); } ``` ↓もう少し汎用性のある書き方に修正 ``` function teratail_320127b(){ const sheet = SpreadsheetApp.getActiveSheet(); const startrow = 1; //取得を開始する行 const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues(); const show_values = values.filter((row,i) => !sheet.isRowHiddenByUser(i+startrow)); console.log(show_values); } ``` ↓アロー関数使わない場合。あんま変わらないです。 ``` function teratail_320127c(){ const sheet = SpreadsheetApp.getActiveSheet(); const startrow = 1; //取得を開始する行 const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues(); const show_values = values.filter(function(row,i){ retun !sheet.isRowHiddenByUser(i+startrow); }); console.log(show_values); } ``` ↓filterを使わず forループでやる場合。これが一番しっくりくるなら、それでもOK ``` function teratail_320127_d(){ const sheet = SpreadsheetApp.getActiveSheet(); const startrow = 1; //取得を開始する行 const values = sheet.getRange(startrow,1,sheet.getLastRow(),2).getValues(); let show_values =[]; for(i=0; i > 引用テキスト1iは0からvalues.length-1までインクリメントされる > > また、アロー式の引数である(row,i)のrowは何を指しているのでしょうか? > > > iは、その理解でOKです。valuesという配列の個々の要素が row で i がindex(ざっくり言えば順番)です。 いきなり宣言してない rowなんてのが出てくるんで、私も最初の頃は ??ってなりましたが、 これは別に適当にvaluesって配列の個々の要素を row っておいただけで、別に value でも、vでもなんでもよいのです。スプレッドシートで取得した二次元配列は行成分を指すので、個人的にはrowって置くことが多いです。 > > 引用テキスト2!sheet.isRowHiddenByUserの値がtrueであればshow_values.push(values[i])のような操作がされるという理解でよいのでしょうか? > > for ループのコードも書きましたが、その理解で大丈夫と思います。 > > > 慣れないうちは 普通にforでループさせる書き方でよいと思います。 だんだんカッコよく書きたい、もっと短いコードで書きたいってなってきたら、今回使った filterやmap, reduceなんかを使うようになって、徐々に理解もしていきます。 配列の要素を一つずつ関数に入れていくイメージで、結局やってることはforと一緒ですから。 参考 珍しくコードを多く書く回答してしまった。。