GASでスプレッドシートにフィルタを作成し
条件で絞り込む方法

毎回手でフィルタをかけ直す作業を、createFilter()(範囲にフィルタを付けるメソッド)と絞り込み条件のコード化でボタン一発に置き換える方法を解説します。

|対象: GAS / スプレッドシート / フィルタ

Table of Contents

コードでフィルタを作るメリット

スプレッドシートのフィルタ(データを条件で絞り込んで表示する機能)は、手動でかけると担当者ごとに手順がバラつき、うっかり解除されることもあります。 GASでコード化しておけば、カスタムメニューやトリガーから「いつも同じ条件」で一発絞り込みできます。

毎回同じ条件を再現

「未対応かつ高額」など決まった絞り込みを、ボタン一つで再現できる

定期実行に組み込める

トリガーで朝一に絞り込んだ状態を用意し、担当者はすぐ確認できる

抽出処理の前段に使える

絞り込んだ表示行だけをメール送信・別シート転記する処理につなげられる

操作ミスを防ぐ

手作業のフィルタ設定を無くし、条件の付け忘れ・外し忘れを防げる

フィルタを作成する基本コード

まずは範囲にフィルタ枠を付けるだけの最小コードです。フィルタは1つのシートに1つだけしか作れないため、 作成前にgetFilter()で既存フィルタを確認し、あればremove()で外してから作り直すのが安全です。

// シートのデータ範囲にフィルタを作成する
function createBasicFilter() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");

  // 既にフィルタがあれば一度外す(1シートに1つまで)
  const existing = sheet.getFilter();
  if (existing) existing.remove();

  // getDataRange() で「値が入っている範囲」全体にフィルタを付ける
  sheet.getDataRange().createFilter();
}

getDataRange()は値が入っている範囲を自動で返すため、行が増減しても範囲を指定し直す必要がありません。 この時点ではまだ条件を付けていないので、フィルタの▽ボタンが表示されるだけで全行が見えたままです。

テキストの値で絞り込む

絞り込み条件はSpreadsheetApp.newFilterCriteria()で作り、setColumnFilterCriteria(列番号, 条件)で列に割り当てます。列番号はA列=1から数える1始まりです。

// 「ステータス」列が "未対応" の行だけ表示する
function filterByStatus() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");

  // フィルタが無ければ作る、あれば使い回す
  const filter = sheet.getFilter() || sheet.getDataRange().createFilter();

  // 絞り込み条件を作る(この列の値が "未対応" と一致するものだけ表示)
  const criteria = SpreadsheetApp.newFilterCriteria()
    .whenTextEqualTo("未対応")
    .build();

  // 第1引数は列番号(A=1, B=2, ... の1始まり)。ここではC列=3列目
  filter.setColumnFilterCriteria(3, criteria);
}

完全一致のwhenTextEqualToのほか、部分一致のwhenTextContains、空でない行だけのwhenCellNotEmptyなどが用意されています。

数値・日付の条件で絞り込む

金額や日付の列は、大小比較の条件で絞り込めます。whenNumberGreaterThanOrEqualTowhenDateAfterに基準値を渡します。日付はnew Date()で作り、月が0始まり(0=1月)である点に注意してください。

// 数値・日付の条件で絞り込む
function filterByNumberAndDate() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");
  const filter = sheet.getFilter() || sheet.getDataRange().createFilter();

  // D列(=4): 金額が 100000 以上の行だけ表示
  const amountCriteria = SpreadsheetApp.newFilterCriteria()
    .whenNumberGreaterThanOrEqualTo(100000)
    .build();
  filter.setColumnFilterCriteria(4, amountCriteria);

  // E列(=5): 受注日が 2026/07/01 より後の行だけ表示
  const dateCriteria = SpreadsheetApp.newFilterCriteria()
    .whenDateAfter(new Date(2026, 6, 1)) // 月は0始まり(6 = 7月)
    .build();
  filter.setColumnFilterCriteria(5, dateCriteria);
}

数値ならwhenNumberBetween(下限, 上限)で範囲指定、日付ならwhenDateBeforeで「それより前」を指定できます。異なる列に条件を設定すれば、後述のとおりAND(すべて満たす)で絞り込まれます。

「この値を隠す」で絞り込む

画面でフィルタのチェックを外す操作に相当するのがsetHiddenValuesです。表示したい値を指定するのではなく、非表示にしたい値を配列で渡します。 「キャンセルと保留だけ隠して、それ以外は全部見せたい」といった除外指定に向いています。

// 「この値は隠す」指定で絞り込む(チェックボックス方式に相当)
function hideCancelledRows() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");
  const filter = sheet.getFilter() || sheet.getDataRange().createFilter();

  // C列(=3) の "キャンセル" と "保留" の行だけを非表示にする
  const criteria = SpreadsheetApp.newFilterCriteria()
    .setHiddenValues(["キャンセル", "保留"])
    .build();
  filter.setColumnFilterCriteria(3, criteria);
}

逆に「特定の値だけ表示」したいときは、環境によってsetVisibleValuesが使えます。使えない場合は、隠したい値を集めてsetHiddenValuesに渡すか、whenTextEqualToなどの条件で代用してください。

表示中の行だけを取得して処理する

フィルタは行を隠すだけで、getValues()は非表示行も含めて全データを返します。 絞り込んだ結果だけをメール送信や別シート転記に使いたいときは、isRowHiddenByFilter()で1行ずつ表示状態を判定します。

// フィルタで表示中の行だけを取得して処理する
function getVisibleRows() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");
  const data = sheet.getDataRange().getValues();

  const visible = [];
  data.forEach((row, i) => {
    const rowNumber = i + 1; // 1始まりの実際の行番号
    // ヘッダー行(1行目)は残し、非表示行はスキップ
    if (rowNumber === 1 || !sheet.isRowHiddenByFilter(rowNumber)) {
      visible.push(row);
    }
  });

  Logger.log("表示中の行数(ヘッダー含む): " + visible.length);
  return visible;
}

この「フィルタは見た目を変えるだけで、データ取得には影響しない」という性質は、思わぬバグの原因になりがちです。 絞り込んだつもりで全件処理してしまわないよう、表示行の判定を必ず挟むのがポイントです。

条件のリセットとフィルタの削除

条件を外す方法は2段階あります。特定の列の条件だけ外すならremoveColumnFilterCriteria(列番号)、フィルタ枠ごと消して全行を再表示するならremove()を使います。

// 条件のリセットとフィルタの削除
function resetFilter() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注一覧");
  const filter = sheet.getFilter();
  if (!filter) return;

  // 特定列(C列=3)の絞り込み条件だけ外す(フィルタ枠は残す)
  filter.removeColumnFilterCriteria(3);

  // フィルタ自体をまるごと削除して全行を再表示する
  filter.remove();
}

実務での注意点

1. フィルタは全員の画面に反映される

createFilterで作る通常フィルタは共有シートの全員に影響します。自分だけの一時的な絞り込みで済ませたい場合は画面の「フィルタ表示」を使いますが、これはApps Scriptからは操作できません。他人の作業を邪魔しない抽出をしたいなら、getValuesで読み込んで別シートに書き出す方式が安全です。

2. 複数列の条件はANDになる

異なる列にsetColumnFilterCriteriaを設定すると、すべての条件を満たす行だけが表示されます(AND条件)。「Aまたは B」のOR条件はフィルタ単体では表現できないため、その場合はデータを読み込んでJavaScript側で絞り込むほうが確実です。

3. 手動で隠した行との違いに注意

hideRowsで手動非表示にした行はisRowHiddenByFilterでは検知できません(別メソッドのisRowHiddenByUserで判定します)。フィルタによる非表示と手動非表示は別物として扱われる点を覚えておきましょう。

まとめ

GASのフィルタはcreateFilter()で枠を作り、newFilterCriteria()で作った条件を列に割り当てるだけで自動化できます。テキスト・数値・日付・除外指定を組み合わせれば、毎回の手作業をボタン一つに置き換えられます。 一方でフィルタは「見た目を変えるだけ」で全員に共有される機能でもあるため、表示行の判定と共有への影響を押さえて使うのが実務のコツです。

よくある質問

GASのcreateFilterで作るのは通常のフィルタ(ベーシックフィルタ)で、シートに1つだけ設定でき、絞り込み結果が全員に共有されます。一方、画面右上から作る「フィルタ表示」は自分だけに見える一時的なビューで、複数作れます。Apps Scriptから直接操作できるのは通常のフィルタだけです。共有シートで他人の画面に影響させたくない場合は、フィルタではなくgetValuesで読み込んで別シートに抽出する方法が向いています。

できます。フィルタは行を「非表示」にするだけで削除はしないため、getValuesやgetDataRangeは非表示行も含めて全データを返します。表示されている行だけを扱いたい場合は、isRowHiddenByFilter(row)で1行ずつ判定して除外する必要があります。

1つのシートに通常のフィルタは1つしか作れないため、既にフィルタがある状態でcreateFilterを呼ぶとエラーになります。作成前にgetFilter()で既存フィルタを確認し、あればremove()で削除してから作り直すか、既存フィルタにsetColumnFilterCriteriaで条件を追加してください。

できます。SpreadsheetApp.newFilterCriteria().setHiddenValues([...]) に非表示にしたい値の配列を渡すと、その値の行だけを隠せます。逆に「この値だけ表示」はsetVisibleValuesで指定します(Google Sheets新UIの仕様変更によりsetVisibleValuesが使えない環境ではsetHiddenValuesを使ってください)。

特定の列の条件だけを外すならremoveColumnFilterCriteria(columnPosition)を、フィルタ自体をまるごと外すならgetFilter().remove()を呼びます。remove()するとフィルタ枠ごと消え、全行が再表示されます。

GAS開発・業務Webシステムを
相談する。

フィルタでの絞り込みだけでなく、抽出結果の自動メール送信・別シート転記・帳票出力など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る