質問: ### 前提・実現したいこと Googleスプレッドシート上に表示された行を、 GASを用いてフィルタで非表示にされた行を除く値を取得する方法を探しています。 この場合の「フィルタ」とは スプレッドシートの上部メニューに存在するフィルタを指します。 例) | 番号▽ | 名前▽ | 種類▽ | | --- | --- | --- | | 1 | バナナ | くだもの | | 2 | かぼちゃ | 野菜 | | 3 | りんご | くだもの | | 4 | いちご | くだもの | | 5 | ニンジン | 野菜 | | 6 | ぶどう | くだもの | ↓↓↓ | 番号▽ | 名前▽ | 種類▼ | | --- | --- | --- | | 1 | バナナ | くだもの | | 3 | りんご | くだもの | | 4 | いちご | くだもの | | 6 | ぶどう | くだもの | このようにくだものだけが表示されたスプレッドシートの値を GASを用いて `sheet.getDataRange().getValues()` などで取得しようとした際に、 すべてのデータが取得されてしまいます。 ### 試したこと `isRowHiddenByFilter`というクラスが存在するようなので、 コチラを利用してみようかと思ったのですが、 行ごとにフィルタがかかっているかを判定しようとすると APIを毎行ごとに取得する必要があり、 かなり時間がかかってしまいそうなので断念しています。 参考: 何か良い方法はありますでしょうか? ご回答のほど、お待ちしております。
回答: **別の方法を検証してみましたので、追記します.** 過去にテラテイルで同様の質問を見つけました。 以下の1行でフィルタ後に表示されているデータを取得できるみたいです。 ``` var values = sheet.getDataRange().getValues().filter(function(_, i) {return !sheet.isRowHiddenByFilter(i + 1)}); ``` >>APIを毎行ごとに取得する必要があり、かなり時間がかかってしまいそうなので断念しています。 処理時間を心配されているようですが、上記の方法ではGetValuesで取得すべきデータを1回で取得できるので、処理時間は問題ないと思います。 得られた配列を操作する分には処理時間は圧迫しないと思いますので... 以上です。 ### 代替案 下記のサイトで紹介されているスクリプトでもフィルタされたシートのデータを取得できました。 3列:10000行のデータにて処理時間計測してみました。 フィルタリングかけずに、10000行取得するのに1秒弱くらいでした。 フィルタリングをかけて、表示データ数を減らすと、処理時間は短くなる傾向でした。 いかがでしょうか? 以下、スクリプト スプレッドシートIDとシートIDを入力していただければ動くと思います。 ``` https://docs.google.com/spreadsheets/d/【スプレッドシートID】/edit#gid=【シートID】 var spreadsheetId = "1KxT5j3DQ3WXxPNzJvtbSBheK_4Og_RSeSByUGPJVfPM"; // Please set Spreadsheet ID. var sheetId = "0"; // Please set Sheet ID. var url = "https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/gviz/tq?tqx=out:csv&gid=" + sheetId + "&access_token=" + ScriptApp.getOAuthToken(); var res = UrlFetchApp.fetch(url); var array = Utilities.parseCsv(res.getContentText()); ``` 以上です。