スプレッドシート内のすべてのフィルターを 1 日 1 回削除するスクリプトを作成したいと考えています。
Google Apps Script でフィルタリングを処理する方法に関する適切なドキュメントを見つけることができませんでした。
可能であれば、Python API を使用してこれを行うことにもオープンです。
スプレッドシート内のすべてのフィルターを 1 日 1 回削除するスクリプトを作成したいと考えています。
Google Apps Script でフィルタリングを処理する方法に関する適切なドキュメントを見つけることができませんでした。
可能であれば、Python API を使用してこれを行うことにもオープンです。
記録マクロ機能を使用して発見した新しい非常に簡単な可能性があります。
spreadsheet.getActiveSheet().getFilter().remove();
注意: moveTo もフィルターを移動するようになったため、前述の「簡単な方法」は機能しなくなりました。
少しの「不正行為」で可能です:)
(更新された回答: それを可能にする新しい Google サービスがあります。番号 2 を参照してください)
1 - 簡単な方法
さて、私はこの方法でそれを行うことができました:
var row = 1 //the row with filter
var rowBefore = row
//insert a row before the filters
Sheet.insertRowBefore(row);
row++;
//move the filter row to the new row (this will move only content)
var Line = Sheet.getRange(row + ":" + row);
Line.moveTo(Sheet.getRange(rowBefore + ":" + rowBefore));
//delete the old row, which contains the filters - this clears the filters
Sheet.deleteRow(row);
//if the row was frozen before deletion, freeze the new row
Sheet.setFrozenRows(rowBefore);
2 - スプレッドシート サービスの使用:
( https://issuetracker.google.com/issues/36753410、コメント #172からコピー)
function clearFilter() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssId = ss.getId();
var sheetId = ss.getActiveSheet().getSheetId();
var requests = [{
"clearBasicFilter": {
"sheetId": sheetId
}
}];
Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}
(以下の@AndreLungのコメントからコピー)
Resources、次に「Advanced Google Services」に移動し、「Google Sheets API」を見つけて有効にします。また、console.cloud.google.com /apis/dashboard に移動して「Sheets API」を有効にします
3 - 難しい方法: (もう少し考える前に書いたので、ここに残しておきます)
1 - 最初の行 (またはフィルター ボタンがある行) を削除します。
Sheet.deleteRow(1);
2 - もう一度挿入します:)
Sheet.insertRowBefore(1);
3 - ヘッダーを設定する
Sheet.getRange("A1").setValue("Hi there");
Sheet.getRange("B1").setValue("Here I am Again with no filter");
//alternatively
var LineVals = Sheet.getRange("1:1").getValues();
LineVals[0][0] = "Hi there";
LineVals[0][1] = "Here I am again";
LineVals[0][2] = "With no filters";
Sheet.getRange("1:1").setValues(LineVals);
//getValues is meant to keep the array exactly the size of the row
4 - 線の色を再度設定します。
//Cell color
Sheet.getRange("1:1").setBackground('#ff3300');
5 - フォント スタイルを設定します。
//I didn't test these ones....
Sheet.getRange("1:1").setFontColor....
Sheet.getRange("1:1").setFontFamily....
Sheet.getRange("1:1").setFontSize....
//Actually there are a lot of font options available....
6 - 以前にフリーズした場合は、再度フリーズします。
Sheet.setFrozenRows(1);
7 - そして最後に、彼らが持っていた場合NamedRanges
は、単一のセルではなく列全体に名前を付けることを検討してください。これにより、名前が損なわれません。
編集: 2014年にこの回答を書いて以来、リンクで追跡されている問題は、フィルターを操作する新しい方法で解決されました。私の答えは時代遅れになりましたが、私はそれに反対票を投じ続けています....ありがとう。私は知っていますが、後世のために最初の答えを残しています。
プログラムで Google スプレッドシートのフィルターを操作できるとは思えません。これに関する未解決の問題は、こちらで見つけることができます。あなたの興味を登録するためにスターを付けてください。
ダニエル、どうもありがとうございました:-)
これは私の実装です:
function delFVws_test(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
delFVws(sh, 1);
}
function delFVws(sh, row){
var rowp = row;
sh.insertRowBefore(row++);
sh.getRange(row + ':' + row).copyTo(sh.getRange(rowp + ':' + rowp));
sh.deleteRow(row);
}
フリーズされた行を保持し、moveTo の代わりに copyTo を使用すると、フィルターが行から行へと移動しないことが保証されます。
私はそれが古いスレッドであることを知っていますが、答えをグーグルで検索しているときにこれに遭遇した人のために、次のコードはすべてのフィルターを削除します
SpreadsheetApp.getActiveSheet().getFilter().remove();
または、シートにフィルターがあるかどうかを確認するには
if (!SpreadsheetApp.getActiveSheet().getFilter()) { //returns null if fitler does not exist
<what to do if there is no filter>
}
else {
<what to do if there is a filter>
}
これがダニエルのコードを実装した方法です
moveTo を copyTo に変更し、オプション - コンテンツのみを使用しました。また、凍結された行があれば削除し、コードが実行された後に shtRows.setFrozenRows(1) を追加しました。
var shtRows = mySS.getSheetByName("Rows");
var row = 1 //the row with filter
var rowBefore = row;
shtRows.setFrozenRows(0); // remove frozen
shtRows.insertRowBefore(row); //inserts a line before the filter
row++;
var Line = shtRows.getRange(row + ":" + row); //gets the filter line
Line.copyTo(shtRows.getRange(rowBefore + ":" + rowBefore), {contentsOnly:true}); //move to new line
shtRows.deleteRow(row); //deletes the filter line - this clears the filter
// a lot of code executing... and then ...
shtRows.setFrozenRows(rowBefore); //if row was frozen before, freeze it again
これはコードを使用してフィルターを追加しますが、メニューで追加するフィルターとは異なります。独自のフィルター メニューを追加して、制御できるようにすることができます。Google App Script / スプレッドシート - フィルター条件を取得するには?
@HDCerberus が言うように、「メニューベースのフィルター」を削除する方法はないようです。
Python API はきめが細かいですが、機能がほとんどないため、ハンドル フィルターを気にせずに行を非表示にする方法さえありません。
<!-- language: lang-js -->
// 4. Clear any filters currently applied to this first sheet
// https://developers.google.com/apps-script/reference/spreadsheet/sheet#getFilter()
// https://developers.google.com/apps-script/reference/spreadsheet/filter#remove()
var currentFilter = sheet.getFilter();
if ( currentFilter !== null ) {
console.log( 'a filter currently exists, clearing...' );
sheet.getFilter().remove();
}