見出し画像

スプレッドシートのフィルタビューを一括削除する - Google Apps Script

ライター: 秦

そのスプレッドシート、無法地帯になってませんか?

スプレッドシートには「フィルタビュー」と「ベーシックフィルタ」の2種類のフィルタがあります。

フィルタビュー: 共同編集者からの見え方を変えずにデータをフィルタする
ベーシックフィルタ: すべてのユーザーの画面に反映されるようにデータをフィルタする

特にフィルタビューについては、各ユーザーが自由にフィルタを作成できるため、スプレッドシート内でフィルタビューが乱立してカオスになりがちです。

乱立した状態、即ち「ルールがなく個々が思い思いに作った状態」のフィルタビューを整理すべく、Google Apps Scriptで一括削除する方法について解説します。

解いた課題

・フィルタビューの整理、一括操作

記事を書いた背景

前述の通り、フィルタビューは個々が思い思いに作成できてしまいます。また、削除のUIも一括操作がなく、ひとつひとつ削除をする必要があります。しかも、ソート順の指定ができません。

これを一括で削除できないか?というのが今回の課題でした。

ベーシックフィルタはGAS標準のサービスに用意されているAPIを使えば簡単に削除ができます。対して、フィルタビューは拡張サービスを使わなければ操作ができません

インターネット上を検索してみても、Googleの拡張サービスを使ったコードやドキュメントはあまり情報がないのが現状です。

さらに、検索してみても、Qiitaなどで探してみても、フィルタビューの操作については日本語の記事がひとつもありませんでした。(執筆時点)

StackOverflowなどで英語のQAを探してみたところ、やっと見つけたのがこの拡張サービスによる削除の方法でした。

ちなみに、Sheets APIの公式記事には、コードはPythonですがフィルタビューの操作について記載がありました。
Filters | Sheets API | Google Developers

📝 2022年9月追記
フィルタビューの一括削除はアップデートにてスプレッドシートの標準機能として実装されました。便利になりましたね。したがって本記事はこういった機能がなかった場合にどのような実装を行えば良いか、という観点でご参考いただければ幸いです。

画像5

実装

GASでの実装ですが、具体的には「Google Sheets API」を使います。
フィルタビュー、フィルタの順に記載します。

フィルタビューの削除

フィルタビューは、以下の操作で作成できるもので、編集権限があるユーザーが個別にフィルタを作成できる機能です。また、スプレッドシート単位で作成されます。

画像1

この拡張サービスをONにするには以下の手順で操作を行います。

スクリプトエディタのメニュー -> 「リソース」 -> 「Googleの拡張サービス」 -> 「Google Sheets API」をONに

画像2

次に、Google Develop ConsoleでGoogle Sheets APIを有効にします。
https://console.developers.google.com/apis/library/sheets.googleapis.com?q=Sheets

画像4

これによってSheetsのAPIが使えるようになります。コードは以下の通りです。

// アクティブなスプレッドシートのIDを取得
const ss = SpreadsheetApp.getActiveSpreadsheet()
const ssId = ss.getId()

// スプレドシートのデータフィルタを全て取得
const response = Sheets.Spreadsheets.getByDataFilter({
 dataFilters: [],
 includeGridData: false
}, ssId)
const requests = [] // 一括削除のリクエストデータを登録する配列
for (const sheet of response.sheets) {
 for (const filterView of sheet.filterViews) {
   // 一括削除に投げるフィルタIDをリクエストデータに追加
   requests.push({
     'deleteFilterView': {
       'filterId': filterView.filterViewId
     }
   })
 }
}

// 指定したデータフィルタを一括削除
if (requests.length > 0) {
  Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId)
} else {
  throw new Error('フィルタが1件もありません。処理を終了します。')
}​

特定の名前を含んだものだけを削除したければ、fiterView.titleでフィルタビューの名称を取得して必要なものだけをリクエストするように実装を加えれば実現可能です。

特定のデータフィルタのみを削除するコード(一部抜粋)

 for (const filterView of sheet.filterViews) {
   // 名前に「フィルタ」を含むもののみ削除対象とする
   if (filterView.title.indexOf('フィルタ') > -1) {
     // 一括削除に投げるフィルタIDをリクエストデータに追加
     requests.push({
       'deleteFilterView': {
         'filterId': filterView.filterViewId
       }
     })
   }
 }

ベーシックフィルタの削除

ベーシックフィルタは以下の操作で作成できるもので、すべてのユーザに共通して適用されるフィルタです。また、シート単位で作成されます。

画像3

ベーシックフィルタについてはSheet#getFliter()を使って簡単に削除ができます。

Class Sheet | Apps Script | Google Developers

const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheet = ss.getSheetByName('対象のシート')

// フィルタを削除
const filter = sheet.getFilter()
if (filter) {
  filter.remove()
}

まとめ

・ベーシックフィルタは標準サービスで削除できる
・フィルタビューは拡張サービスをONにして削除できる

そろそろ年末ですね。年末の大掃除に、スプレッドシートもフィルタ掃除をしてみてはいかがでしょうか。


株式会社シクミヤでは業務効率化・自動化など、仕組みで解決するお手伝いをさせていただいております。お仕事のご依頼はコチラ↓までお願いいたします。

note: Visionary Base編集部
Twitter: @visionary_base

この記事が気に入ったらサポートをしてみませんか?