はじめに
こんにちは。今回は非常にニッチな内容となります。
タイトルの通り、スプレッドシートのフィルタ設定をGAS(Google Apps Script)の側で保持して、再適用する方法です。
レファレンスを読めばそれ以上それ以下でもないのですが、できたよ、という報告と備忘録を兼ねて記事にします。
結論
結論から書くと、SpreadsheetApp
の、Filter
クラスの、getColumnFilterCriteria
とsetColumnFilterCriteria
を用います。
Class Filter | Apps Script | Google for Developers
サンプルコードは下の通りです。
var ss = SpreadsheetApp.getActiveSpreadsheet()
var ss1 = ss.getSheetByName("シート1")
var columnLength = 2 //列の数(ご自身のシートに合わせてください)
function removeandSetFilters(){
//更新前にフィルタ内容を格納しておく
var filter = ss1.getDataRange().getFilter()
var filterCriterias = []
if(filter){
for (var i=0;i<columnLength;i++){
filterCriterias.push(filter.getColumnFilterCriteria(i+1))
}
filter.remove() //フィルタを解除します。
}
///更新処理
updateSheet() //フィルタ解除後に、行を増やす等の任意の処理をします
///更新処理後
var newfilter = ss1.getRange(1,1, ss1.getLastRow(), columnLength).createFilter() //フィルタを新たに設定します
for (var i=0;i<columnLength;i++){
if(filterCriterias.length>0){
newfilter.setColumnFilterCriteria(i+1,filterCriterias[i])
}
}
}
function updateSheet(){
//任意の処理を記述してください。
}
コードの解説
最後に簡単な解説をしておきます。
GASでは、シートにかかっているフィルタを一括で持ってくるメソッドが見つかりませんでした。
代わりに、列ごとにかかっているフィルタは取得できるので、
filter.getColumnFilterCriteria(i+1)
でそれを取得し、配列filterCriterias
に格納しておきます。
おそらくこの記事に辿り着いた方はフィルタを解除した後処理をして、再びフィルタを設定する、というのを想定していると思います。なので、フィルタ内容を格納できたら、フィルタを解除する処理を書いています。
任意の処理の終了後、新たにフィルタを設定し、
newfilter.setColumnFilterCriteria(i+1,filterCriterias[i])
で再設定しています。
書いてみればなんとでもないのですが、これが意外と便利です。
分析用のスプレッドシートを作って、外部API等を叩いてデータを持ってきている場合、このコードを参考に実装してもらうと、最新情報に更新後、いつも使っているフィルタを適用し直すことができます。
何かの参考になれば幸いです。