• ベストアンサー

スプレッドシート 2つの動作をボタン1つに割り当て

宜しくお願いいたします! カテゴリを「エクセル」にしておりますが、グーグルスプレッドシート利用での質問です。 【希望】 描画で作ったボタンで、ある範囲の行をフィルターで非表示と表示できるようにしたいです。 「一回押すと非表示、もう一度押すと表示のループ」という感じです。 出来ればボタンの文字を「表示中」「非表示中」に切り替えられたりすると理想的です。 【現状】 「フィルター非表示の流れをマクロで記録して、ボタンにスクリプトを割り当てる」というのは何とか出来ました。もう一つ「表示用」のボタンを作って同様にすればいいとは思うのですが、出来れば一つのボタンで解決できるようにしたいです。 ご助言よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

以下で試してみてください。 myFunctionはマクロの記録で作成されたコードで範囲選択してフィルターをセットしてフィルターの実行までが記録されたものを指定してください(mWs.getFilter().remove();でフィルターが解除されるのでフィルター実行だけだとエラーになると思います) 以下のmyFunctionでは私がセットした範囲とフィルター実行したセルの位置が記載されています。 myFilterは追加するコードです。 myFilterの名前は適当に変更してください。 myFilterをボタンに関連付けてください。 function myFilter() { var mWs = SpreadsheetApp.getActiveSheet(); var filter = mWs.getFilter(); if( filter == null ){ myFunction(); } else { mWs.getFilter().remove(); } }; function myFunction() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('C6:K39').activate(); spreadsheet.getRange('C6:K39').createFilter(); spreadsheet.getRange('K6').activate(); var criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues(['']) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(11, criteria); };

kuribooo
質問者

お礼

3度にわたりご教授いただきありがとうございました!! お陰様で理想の形に仕上げることができました!! 本当にありがとうございました!!

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

> どこにif(~の文章を入れればよいのでしょうか?? 現状の if( filter == null ){ myFunction(); } else { mWs.getFilter().remove(); } のところを if( filter == null ){ myFunction(); mWs.getRange('C3').setValue('非表示中'); } else { mWs.getFilter().remove(); mWs.getRange('C3').setValue('表示中'); } となるようにしてください。 補足では function myFunction() { 中略 spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria); }; が2か所ありますが、実際に2か所あるのでしたらいらない方を削除するか名前を変更してください。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

> 出来ればボタンの文字を「表示中」「非表示中」に切り替えられたりすると理想的です。 GASでシートの図形を操作する方法がないみたいなので 図形の背景を透明にしてその下のセルの文字を変更する方法にするとそれっぽくなると思います。 セルC3でしたら 回答No.1のコードを利用するとしたら どちらで表示中とするのかわからないので表示中、非表示中は適当です。 if( filter == null ){ myFunction(); mWs.getRange('C3').setValue('非表示中'); } else { mWs.getFilter().remove(); mWs.getRange('C3').setValue('表示中'); }

kuribooo
質問者

補足

前回の質問から引き続き回答ありがとうございます!! 回答1の段階までは辿り着きました!!本当にありがとうございます!!! ですが、、回答2のif(~ をどこに適用すればうまく実行されるのか分かりませんでした。。 現在以下の通りです(取り急ぎ動作確認までにE3~E15にフィルターをかける流れでつくりました) どこにif(~の文章を入れればよいのでしょうか?? お手数ですがよろしくお願いいたします! function myFunction() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('E3:E14').activate(); spreadsheet.getRange('E3:E14').createFilter(); spreadsheet.getRange('E3').activate(); var criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues(['']) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria); }; function myFilter() { var mWs = SpreadsheetApp.getActiveSheet(); var filter = mWs.getFilter(); if( filter == null ){ myFunction(); } else { mWs.getFilter().remove(); } }; function myFunction() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('E3:E15').activate(); spreadsheet.getRange('E3:E15').createFilter(); spreadsheet.getRange('E3').activate(); var criteria = SpreadsheetApp.newFilterCriteria() .setHiddenValues(['']) .build(); spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);

関連するQ&A