GASの質問なので、Google Apps Script
のタグを付けた方が回答が得られます。
ご質問の件ですが、isRowHiddenByUser を使うと非表示判定ができるので、
これとfilterを組み合わせれば出来ます。
https://developers.google.com/apps-script/reference/spreadsheet/sheet?hl=ja#isrowhiddenbyuserrowposition
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<values.length; i++){
if(!sheet.isRowHiddenByUser(i+startrow)){
show_values.push(values[i])
}
};
console.log(show_values);
}
引用テキスト①iは0からvalues.length-1までインクリメントされる
また、アロー式の引数である(row,i)のrowは何を指しているのでしょうか?
iは、その理解でOKです。valuesという配列の個々の要素が row で i がindex(ざっくり言えば順番)です。
いきなり宣言してない rowなんてのが出てくるんで、私も最初の頃は ??ってなりましたが、
これは別に適当にvaluesって配列の個々の要素を row っておいただけで、別に value でも、vでもなんでもよいのです。スプレッドシートで取得した二次元配列は行成分を指すので、個人的にはrowって置くことが多いです。
引用テキスト②!sheet.isRowHiddenByUserの値がtrueであればshow_values.push(values[i])のような操作がされるという理解でよいのでしょうか?
for ループのコードも書きましたが、その理解で大丈夫と思います。
慣れないうちは 普通にforでループさせる書き方でよいと思います。
だんだんカッコよく書きたい、もっと短いコードで書きたいってなってきたら、今回使った filterやmap,
reduceなんかを使うようになって、徐々に理解もしていきます。
配列の要素を一つずつ関数に入れていくイメージで、結局やってることはforと一緒ですから。
参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
珍しくコードを多く書く回答してしまった。。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/04 14:09
2021/02/05 00:38
2021/02/05 13:48
2021/02/06 13:09 編集
2021/02/06 13:52