「あれ、さっきまで見えていたデータが消えた…?」「誰かがフィルタをかけたせいで、自分の並び替えが全部リセットされた…」こんな経験、スプレッドシートを共有で使っている方なら一度はあるのではないでしょうか。
Googleスプレッドシートはチームでリアルタイムに共同編集できる強力なツールですが、フィルタと並び替え(ソート)が競合してしまう問題は、多くのユーザーが頭を抱える悩みのタネです。自分がA列を昇順に並べ替えた瞬間、同僚の画面でもデータの順番が変わってしまったり、せっかくフィルタで絞り込んだ条件が他の人の操作で吹き飛んでしまったりと、共同作業の現場では日常的にトラブルが起きています。
この記事では、スプレッドシートでフィルタと並び替えが競合する根本的な原因をわかりやすく解明し、初心者でもすぐに実践できる5つの具体的な解決策を紹介します。さらに、SORT関数やFILTER関数を組み合わせた上級テクニックや、2026年最新のGoogleスプレッドシートの機能アップデート情報まで網羅しました。この記事を読み終える頃には、もうチームメンバーと「勝手にフィルタかけないで!」と言い合うことはなくなるはずです。
- スプレッドシートでフィルタと並び替えが競合する原因は「通常フィルタ」が全員に影響するグローバル設定であること
- 「フィルタ表示(フィルタビュー)」を使えば他のメンバーに一切影響を与えずに個別のフィルタと並び替えが可能になること
- SORT関数とFILTER関数を組み合わせれば、元データを壊さず動的にデータ抽出と並び替えを同時に実現できること
- そもそもスプレッドシートでフィルタと並び替えが競合するのはなぜ?
- 解決策その1「フィルタ表示」を使えば他の人に影響しない
- 解決策その2ID列を作成して元の並び順を保護する
- 解決策その3SORT関数とFILTER関数で元データを壊さずに操作する
- 解決策その4共同編集時のルールを整備する
- 解決策その5スマホ利用時の注意点を知っておく
- 「フィルタ」と「フィルタ表示」の違いを比較表で整理
- 上級者向けQUERY関数で抽出・並び替え・集計を一括処理する
- 情シス歴10年超のプロが教える「現場で本当に効くフィルタ競合対策」
- GASで実装する「並び替え自動復元スクリプト」
- GASで実装する「フィルタ自動解除タイマー」
- GASで実装する「並び替え操作を検知してSlack通知するスクリプト」
- GASで実装する「毎日自動バックアップスクリプト」
- 現場で頻発する「あるある問題」と具体的な解決手順
- 上級者向けGASでフィルタ表示を一括作成する自動化スクリプト
- データ量が増えたときの「重くなる問題」への具体的対処法
- 「フィルタを作成」がグレーアウトして押せない場合の対処法
- ぶっちゃけこうした方がいい!
- スプレッドシートでフィルタと並び替えが競合する問題のよくある疑問
- 今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
- まとめ
そもそもスプレッドシートでフィルタと並び替えが競合するのはなぜ?
この問題を解決するには、まず「なぜ競合が起きるのか」を正確に理解する必要があります。原因がわかれば、対処法は驚くほどシンプルです。
通常のフィルタは「全員に影響するグローバル設定」だから
Googleスプレッドシートで「データ」メニューから「フィルタを作成」を選んで設定するフィルタは、そのシートを閲覧・編集しているすべてのユーザーに同時に反映される仕組みになっています。つまり、あなたがフィルタをかけた瞬間、同僚のパソコンやスマホの画面でも同じフィルタが適用されてしまうのです。
これは並び替えについても同じです。フィルタ内の「A→Zで並び替え」や「Z→Aで並び替え」を操作すると、シート全体のデータ順序が物理的に変更されます。この変更は元に戻さない限り永続的で、他のメンバー全員の画面に即座に反映されます。
フィルタの絞り込みと並び替えが同時に走ると混乱が加速する
たとえば、営業チームの共有シートで佐藤さんが「東京都」のデータだけをフィルタで絞り込んでいるとします。そこへ田中さんが「売上金額の高い順」に並び替えを実行すると、佐藤さんの画面では絞り込まれた状態のまま順番だけが突然変わり、田中さんの画面ではフィルタがかかった状態で並び替え結果が表示されます。お互いが「なんか変だぞ?」と感じるわけです。
さらに厄介なのは、フィルタで行が非表示になっている状態で並び替えを実行すると、非表示の行も含めて全データが並び替えられてしまう点です。フィルタを解除したときに「あれ、元の順番に戻らない…」というパニックが発生するのはこのためです。
並び替えで元の順番に戻せなくなる落とし穴
スプレッドシートの並び替えは、データの物理的な配置そのものを変更する破壊的な操作です。エクセルと同様に、一度並び替えを実行してしまうと、元の行順序は自動的には記録されません。ID列や連番列をあらかじめ用意しておかないと、「最初の並び順に戻したい」と思っても戻せなくなります。これがフィルタとの競合をさらに複雑にしている要因のひとつです。
解決策その1「フィルタ表示」を使えば他の人に影響しない
スプレッドシートでフィルタと並び替えが競合する問題に対する最も効果的かつ根本的な解決策が、「フィルタ表示」(フィルタビュー)の活用です。Googleがまさにこの問題を解決するために用意した機能で、知っているかどうかで作業効率が天と地ほど変わります。
フィルタ表示とは何か?
フィルタ表示とは、自分だけに適用される個人用のフィルタ設定のことです。通常のフィルタがシートを開いている全員に影響するのに対し、フィルタ表示は設定した本人の画面にしか反映されません。つまり、あなたがフィルタ表示で「大阪府」のデータだけを絞り込んで売上順に並び替えても、隣の席の同僚の画面にはまったく影響が及ばないのです。
イメージとしては、同じ景色を見ているけれど自分だけ特別なサングラスをかけている状態です。レンズの色が変わるのは自分だけで、周りの人には何も起きません。
フィルタ表示の作成手順
- Googleスプレッドシートを開いて、上部メニューの「データ」をクリックします。
- 「フィルタ表示」にカーソルを合わせ、「新しいフィルタ表示を作成」を選択します。
- 画面の枠が黒っぽいグレーに変わったら、フィルタ表示モードに入った合図です。左上に表示される名前欄に「営業部用」「東京地区のみ」など、わかりやすい名前を付けましょう。
- 各列のヘッダーに表示されるフィルタアイコン(逆三角形の3本線マーク)をクリックして、絞り込み条件や並び替えの設定を行います。
- 設定が完了したら、右上の「×」ボタンをクリックしてフィルタ表示を閉じます。設定内容は自動的に保存されます。
フィルタ表示の3つの強み
フィルタ表示には、通常のフィルタにはない大きなメリットが3つあります。
まず、複数のフィルタ表示を保存できることです。「今月の受注分」「未出荷案件のみ」「担当者別」など、用途に応じたフィルタ設定を何種類でも作成し、名前を付けて保存できます。毎回フィルタ条件を設定し直す手間がなくなり、ワンクリックで切り替えが可能です。
次に、閲覧権限しかないユーザーでも使える点です。編集権限がなくても「一時的なフィルタ表示」が自動的に作成されるため、データを閲覧するだけのメンバーも自由にデータを絞り込んだり並び替えたりできます。
そして、フィルタ表示はURLで共有できるという点です。フィルタ表示を有効にした状態のURLにはパラメータ(
fvid=数字
)が付与されます。このURLをSlackやメールで共有すれば、相手もまったく同じフィルタ表示の状態でシートを開けます。会議で「この条件で絞り込んだ画面を見てほしい」というときに非常に便利です。
解決策その2ID列を作成して元の並び順を保護する
フィルタと並び替えが競合するトラブルの中でも特に困るのが、「元の並び順に戻せなくなる」問題です。この問題は、あらかじめID列(連番列)を作成しておくだけで確実に防げます。
なぜID列が必要なのか?
スプレッドシートの並び替え機能は、データの物理的な配置を変更する操作です。一度並び替えを実行すると、元のデータ順序に関する情報はどこにも残りません。3回、4回と異なる列で並び替えを繰り返すと、もはや最初の状態がどうだったのか誰にもわからなくなります。
そこで、シートの一番左にID列を追加し、1から順番に連番を振っておきます。こうしておけば、どんなに並び替えやフィルタを繰り返した後でも、ID列を昇順で並び替えるだけで一瞬で元の状態に復元できるのです。
ID列を効率的に作成するコツ
手動で番号を入力する必要はありません。A2セルに以下の数式を入力すれば、データがある行すべてに自動的に連番が振られます。
=ARRAYFORMULA(IF(B2:B="","",ROW(B2:B)-1))
この数式は、B列にデータが入力されている行にだけ連番を表示する仕組みです。ARRAYFORMULA関数のおかげで先頭行に1つ数式を入れるだけで、以降の行すべてに自動適用されます。行を追加してもB列にデータを入れた瞬間に連番が付与されるので、メンテナンスフリーです。
解決策その3SORT関数とFILTER関数で元データを壊さずに操作する
ここからは少し上級者向けの話になりますが、知っておくと業務効率が劇的に向上するテクニックです。メニューからの並び替えやフィルタ操作はデータに直接変更を加えますが、SORT関数とFILTER関数を使えば元データをまったく変更せずに、別のセル範囲に抽出・並び替え結果を出力できます。
FILTER関数の基本
FILTER関数は、指定した条件に合致するデータだけを動的に抽出する関数です。元データが変更されると、抽出結果も自動的に更新されます。
=FILTER(A2:E100, C2:C100="東京都")
この数式は、A2からE100の範囲のうち、C列が「東京都」と一致する行だけを抽出します。複数条件を指定したい場合は、AND条件ならカンマで区切り、OR条件ならプラス記号で結合します。
AND条件の例
=FILTER(A2:E100, C2:C100="東京都", D2:D100>10000)
OR条件の例
=FILTER(A2:E100, (C2:C100="東京都")+(C2:C100="大阪府"))
SORT関数の基本
SORT関数は、指定した範囲のデータを並び替えた結果を別のセルに出力します。元のデータ配置は一切変更されません。
=SORT(A2:E100, 4, FALSE)
この数式は、A2からE100の範囲を4列目(D列)の値で降順に並び替えた結果を出力します。第3引数の
TRUE
は昇順、
FALSE
は降順を意味します。
SORT関数とFILTER関数を組み合わせる最強テクニック
本当に強力なのは、この2つの関数を入れ子(ネスト)で組み合わせる方法です。FILTER関数の結果をSORT関数で包むことで、「条件に合致するデータだけを抽出し、さらに指定した列で並び替える」という操作を1つの数式で実現できます。
=SORT(FILTER(A2:E100, C2:C100="東京都"), 4, FALSE)
この数式は、C列が「東京都」のデータだけを抽出し、さらに4列目(D列)の値で降順に並び替えて表示します。元データには指一本触れていないので、他のメンバーの作業を一切妨げません。チームで共有するシートでは、この方法がフィルタと並び替えの競合問題に対する究極の解決策と言えます。
2026年2月に更新されたGoogleの開発者向けドキュメントでも、FILTER系の関数(FILTER、SORT、SORTN、UNIQUE)を複雑にネストする場合は、QUERY関数の使用が推奨されています。QUERY関数はSQLに似たクエリ言語を使って、データの抽出・並び替え・集計をひとつの数式で処理できる高機能な関数です。
=QUERY(A1:E100, "SELECT * WHERE C='東京都' ORDER BY D DESC")
複雑なデータ処理が必要な場面では、QUERY関数への移行も視野に入れてみてください。
解決策その4共同編集時のルールを整備する
どんなに優れた機能やテクニックを知っていても、チーム内でルールが共有されていなければ競合問題は繰り返されます。技術的な解決策と合わせて、運用ルールの整備も欠かせません。
「通常フィルタ」と「フィルタ表示」の使い分けルールを決める
通常のフィルタは、会議中にプロジェクタに映して全員で同じデータを見ながら議論するようなシーンに向いています。全員が同じ条件で絞り込まれたデータを確認する必要があるときだけ使い、個人の作業では必ずフィルタ表示を使う、というルールを徹底しましょう。
並び替えの操作権限を制限する
Googleスプレッドシートでは、「データ」メニューからの並び替え操作はシート全体のデータ順序を物理的に変更します。これは非常にリスクの高い操作なので、シートの保護機能を使って並び替えができるメンバーを限定するのが有効です。「データ」→「シートと範囲を保護」から設定できます。
変更履歴を活用してトラブルに備える
万が一、誰かの操作でデータ順序がおかしくなってしまった場合でも、Googleスプレッドシートの変更履歴機能を使えば、過去の任意の時点の状態に復元できます。「ファイル」→「変更履歴」→「変更履歴を表示」から確認でき、誰がいつどのセルを変更したかまで追跡可能です。定期的にバージョンに名前を付けて保存しておくと、いざというときに素早く復元できます。
解決策その5スマホ利用時の注意点を知っておく
意外と見落とされがちなのが、スマホやタブレットからスプレッドシートを操作するときの制限です。実はモバイル版のGoogleスプレッドシートアプリでは、フィルタ表示(フィルタビュー)を作成・使用することができません。
つまり、スマホからフィルタを操作すると、それは自動的に「通常のフィルタ」として適用され、他の全ユーザーの画面に影響を与えてしまいます。外出先でデータを確認したいときは、フィルタ操作を控えるか、PC版で事前にフィルタ表示を作成してそのURLをブックマークしておくのが安全です。
また、モバイルからの並び替え操作もシート全体に影響するグローバルな変更になるため、外出先からの操作は「閲覧のみ」にとどめるのが賢明です。どうしてもデータを絞り込みたい場合は、あらかじめFILTER関数を使った専用の閲覧シートを別タブに作成しておくことをおすすめします。
「フィルタ」と「フィルタ表示」の違いを比較表で整理
ここまでの解説を踏まえて、通常のフィルタとフィルタ表示の違いを表で整理しておきます。迷ったときはこの表を参考にしてください。
| 比較項目 | 通常のフィルタ | フィルタ表示(フィルタビュー) |
|---|---|---|
| 他のユーザーへの影響 | 全員の画面に反映される | 自分の画面だけに反映される |
| 複数の設定を保存 | できない(1つのみ) | 複数保存して名前を付けられる |
| 閲覧権限のユーザー | 使用できない | 一時的なフィルタ表示を作成できる |
| URLでの共有 | できない | フィルタ表示ごとに固有のURLで共有可能 |
| スマホアプリでの利用 | 利用可能 | 利用不可(PC版のみ対応) |
| 並び替えの影響範囲 | シート全体のデータ順序が物理的に変わる | 自分の表示だけが変わり元データは維持される |
上級者向けQUERY関数で抽出・並び替え・集計を一括処理する
SORT関数とFILTER関数のネストでも十分強力ですが、さらに複雑な処理が必要な場面ではQUERY関数が真価を発揮します。SQLに似たクエリ言語を使えるため、抽出条件の指定、複数列での並び替え、集計関数の適用などを1行の数式で完結させることが可能です。
QUERY関数でフィルタと並び替えを同時に処理する例
たとえば、「部署が営業で、売上が50万円以上のデータを、売上の高い順に並び替えて表示する」場合はこう書きます。
=QUERY(A1:F100, "SELECT * WHERE B='営業' AND D>=500000 ORDER BY D DESC")
さらに、「部署別の売上合計を降順で表示する」といった集計もQUERY関数ならワンステップです。
=QUERY(A1:F100, "SELECT B, SUM(D) WHERE B IS NOT NULL GROUP BY B ORDER BY SUM(D) DESC LABEL SUM(D) '売上合計'")
QUERY関数を使いこなせるようになると、フィルタと並び替えの競合問題とは完全に無縁の世界で作業できるようになります。元データには一切手を加えず、別のシートやセル範囲に動的な集計結果を出力できるため、複数メンバーが同時に異なる分析を行っても互いに干渉することがありません。
情シス歴10年超のプロが教える「現場で本当に効くフィルタ競合対策」
ここからは、筆者が情報システム部門で10年以上にわたりGoogleWorkspaceの運用管理に携わってきた経験をもとに、マニュアルやヘルプページには載っていない現場レベルのリアルな対策をお伝えします。公式ドキュメントやハウツー記事で語られる「フィルタ表示を使いましょう」だけでは解決しない、泥臭い現実に切り込んでいきます。
そもそも「フィルタ表示を使って」と言っても通じない現実
情シスの立場から正直に言わせてください。ユーザーの大半は「フィルタ表示」という機能の存在を知りません。社内でGoogleスプレッドシートの研修をやっても、2週間後にはフィルタ表示のことを忘れて通常フィルタをかけてしまう人が続出します。特に営業部門やバックオフィスの方々は日々の業務に追われていて、「フィルタを作成」と「フィルタ表示を作成」の違いなんて意識していないのが現実です。
この問題に対して筆者がたどり着いた結論は、「人に任せるな、仕組みで制御しろ」ということでした。つまり、ユーザーが通常フィルタを使えないようにする、あるいは使っても被害が最小限になるようにGASで自動化する、という方針です。ここからは、実際に現場で導入して効果が出た具体的な手法をGASのコード付きで紹介していきます。
GASで実装する「並び替え自動復元スクリプト」
現場で最も頻繁に起きるのが、「誰かが並び替えを実行して元の順番がわからなくなった」というトラブルです。ID列を用意しておくのは前述のとおりですが、そもそもID列で並び替え直すことすら忘れるユーザーが大半です。そこで、GAS(Google Apps Script)を使ってシートが編集されるたびに自動的にID列順に並び替え直す仕組みを作ります。
自動並び替え復元スクリプトの全コード
以下のスクリプトは、指定したシートでセルが編集されるたびに、A列(ID列)の昇順で自動的にデータを並び替え直します。「拡張機能」→「Apps Script」から貼り付けて保存するだけで動作します。
function onEdit(e) {
// 対象シート名を設定(複数シートがある場合に誤動作を防ぐ)
var TARGET_SHEET = "受注管理";
var SORT_COLUMN = 1; // A列(ID列)で並び替え
var HEADER_ROWS = 1; // ヘッダー行の数
var sheet = e.source.getActiveSheet();
if (sheet.getName() !== TARGET_SHEET) return;
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
if (lastRow <= HEADER_ROWS) return;
var range = sheet.getRange(HEADER_ROWS + 1, 1, lastRow - HEADER_ROWS, lastCol);
range.sort({ column: SORT_COLUMN, ascending: true });
}
このスクリプトを使う際の注意点
このスクリプトにはいくつか押さえておくべきポイントがあります。まず、
onEdit
はシンプルトリガーなので実行時間が30秒に制限されている点です。データが数千行を超える巨大なシートでは、並び替え処理が30秒以内に完了しない可能性があります。その場合は後述するタイマートリガー方式に切り替えてください。
次に、
onEdit
トリガーは手動編集に対してのみ発火するという仕様があります。IMPORTRANGE関数やAPIからのデータ書き込み、他のGASスクリプトからの
setValue()
による変更ではトリガーが起動しません。外部連携でデータが更新されるシートの場合は、タイマートリガー(後述)を併用する必要があります。
さらに重要なのが、range.sort()は数式をそのまま保持してくれる点です。
getValues()
→
setValues()
方式で並び替えると数式が値に置き換わってしまいますが、
range.sort()
メソッドならその心配はありません。これは意外と知られていないポイントで、数式を多用するシートでは特に重要です。
GASで実装する「フィルタ自動解除タイマー」
現場でもうひとつ多いトラブルが、「誰かがフィルタをかけたまま放置して、他のメンバーが全データを見られなくなっている」問題です。特に退勤後や週末にフィルタが残ったままになり、月曜朝に出社したら全員のシートがフィルタ状態だった…というのはよくある話です。
これを解決するのが、一定時間ごとにフィルタを自動解除するタイマースクリプトです。
フィルタ自動解除スクリプトの全コード
function removeFilterAutomatically() {
var SHEET_NAME = "受注管理";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) return;
var filter = sheet.getFilter();
if (filter) {
filter.remove();
// ログに記録(任意)
console.log("フィルタを自動解除しました: " + new Date());
}
}
タイマートリガーの設定手順
このスクリプトを定期実行するには、Apps Scriptエディターの左側メニューにある時計アイコン(トリガー)をクリックし、「トリガーを追加」から以下のように設定します。
- 「実行する関数」に
removeFilterAutomaticallyを選択します。
- 「イベントのソース」を「時間主導型」に変更します。
- 「時間ベースのトリガーのタイプ」で「時間ベースのタイマー」を選び、間隔を「1時間ごと」や「6時間ごと」など業務に合わせて設定します。
- 「保存」をクリックすれば、指定した間隔でフィルタが自動解除されるようになります。
筆者の経験上、毎朝6時に1回実行する設定がもっとも効果的でした。始業前にフィルタが解除されるため、出社時に全員がクリーンな状態でシートを使い始められます。ただし、フィルタを使って作業途中の人がいる可能性もあるので、Slackやメールで「毎朝6時にフィルタがリセットされます」と周知しておくのを忘れないでください。
GASで実装する「並び替え操作を検知してSlack通知するスクリプト」
中規模以上の組織で効果を発揮するのが、並び替え操作が行われたことをリアルタイムでSlackやメールに通知する仕組みです。「犯人探し」のためではなく、「意図しない並び替えが起きたことを素早く検知して対処する」のが目的です。
Slack通知付き監視スクリプトの全コード
以下のスクリプトは、シートのA列(ID列)の並び順が崩れていないかを定期的にチェックし、崩れていた場合にSlackのWebhookに通知を送ります。Incoming WebhookのURLは事前にSlack側で発行しておいてください。
function checkSortOrder() {
var SHEET_NAME = "受注管理";
var ID_COLUMN = 1; // A列
var HEADER_ROWS = 1;
var SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var lastRow = sheet.getLastRow();
if (lastRow <= HEADER_ROWS + 1) return;
var ids = sheet.getRange(HEADER_ROWS + 1, ID_COLUMN, lastRow - HEADER_ROWS, 1)
.getValues()
.flat()
.filter(function(v) { return v !== ""; });
// ID列が昇順になっているかチェック
var isOrdered = true;
for (var i = 1; i < ids.length; i++) {
if (Number(ids) < Number(ids)) {
isOrdered = false;
break;
}
}
if (!isOrdered) {
var message = "⚠️ 「" + SHEET_NAME + "」シートの並び順が変更されています。"
+ "意図しない並び替えが行われた可能性があります。"
+ "確認してください。\n"
+ "スプレッドシート: " + ss.getUrl();
var payload = JSON.stringify({ "text": message });
var options = {
"method": "post",
"contentType": "application/json",
"payload": payload,
"muteHttpExceptions": true
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}
}
このスクリプトもタイマートリガーで15分〜1時間間隔で実行する設定がおすすめです。なお、Slack通知にはInstallableトリガー(インストール可能なトリガー)が必要です。シンプルトリガーの
onEdit
では
UrlFetchApp
が使えないため、タイマー方式を採用しています。
GASで実装する「毎日自動バックアップスクリプト」
並び替えやフィルタの競合問題に限らず、情シスの現場で最も「あってよかった」と感謝されるのが自動バックアップの仕組みです。どんなに対策を講じても、人間が操作する以上はミスが起きます。最後の砦として、スプレッドシートのコピーを毎日自動で作成しておけば、最悪の事態でも前日の状態に戻せます。
自動バックアップスクリプトの全コード
function dailyBackup() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// バックアップ先のGoogleドライブフォルダIDを指定
var BACKUP_FOLDER_ID = "ここにフォルダIDを貼り付け";
var MAX_BACKUPS = 14; // 保持するバックアップ数(2週間分)
var folder = DriveApp.getFolderById(BACKUP_FOLDER_ID);
var timestamp = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd_HHmmss");
var backupName = ss.getName() + "_backup_" + timestamp;
// スプレッドシート全体をコピー
var file = DriveApp.getFileById(ss.getId());
file.makeCopy(backupName, folder);
// 古いバックアップを自動削除(MAX_BACKUPSを超えた分)
var files = folder.getFiles();
var fileArray = ;
while (files.hasNext()) {
var f = files.next();
if (f.getName().indexOf("_backup_") !== -1) {
fileArray.push(f);
}
}
// 作成日の古い順にソート
fileArray.sort(function(a, b) {
return a.getDateCreated() - b.getDateCreated();
});
// 上限を超えた古いファイルを削除
while (fileArray.length > MAX_BACKUPS) {
var oldFile = fileArray.shift();
oldFile.setTrashed(true);
console.log("古いバックアップを削除: " + oldFile.getName());
}
console.log("バックアップ完了: " + backupName);
}
このスクリプトも同様にタイマートリガーで毎日深夜や早朝に実行する設定にします。バックアップ先のフォルダIDは、Googleドライブのフォルダを開いたときのURLの末尾部分(
https://drive.google.com/drive/folders/
の後ろの文字列)です。
情シスとして声を大にして言いたいのは、「バックアップがない状態でスプレッドシートを運用するのは、シートベルトなしで高速道路を走るのと同じ」ということです。Googleの変更履歴機能は確かに優秀ですが、30日間・100リビジョンという保持期限があります。業務で重要なデータを扱うなら、自前のバックアップは絶対に用意しておいてください。
現場で頻発する「あるある問題」と具体的な解決手順
ここからは、10年以上の情シス経験の中で何度も遭遇した「フィルタ・並び替え関連のあるある問題」と、その場で即座に対処できる具体的な手順を紹介します。
あるある1フィルタで行が非表示のままコピペして「データが消えた!」と騒がれる
これは本当によくあります。フィルタで一部の行が非表示になっている状態で範囲を選択してコピーすると、表示されている行だけがコピーされます。これ自体は正常な動作なのですが、ユーザーは「全行コピーしたつもりなのにデータが足りない」とパニックになります。
さらに厄介なのが、フィルタが適用された状態で行を削除する場合です。見えている行だけ選択して削除したつもりでも、非表示の行は削除されないので安全ではあるのですが、ユーザーは「消したはずの行がフィルタ解除したら残っている」と混乱します。
対処法は明確です。データのコピーや削除を行う前に、必ずフィルタを一度解除してからどうぞ、というルールを徹底してください。手順は「データ」→「フィルタを削除」でフィルタを外し、操作が完了したら再度フィルタを設定し直します。
あるある2IMPORTRANGE関数で取得したデータに対してフィルタが効かない
IMPORTRANGE
関数で別のスプレッドシートからデータを引っ張ってきているシートで、そのデータにフィルタをかけようとすると、うまく動かないことがあります。特にヘッダー行の認識がずれて「すべて空白」と表示されたり、値でのフィルタリングが正しく機能しないケースがあります。
この問題の原因は、IMPORTRANGEの結果がまだ読み込み完了していない段階でフィルタが適用されるタイミングの問題です。対処法としては、IMPORTRANGE先のデータを一度「値のみ貼り付け」で静的データに変換してからフィルタを適用する方法が確実です。動的にフィルタリングしたい場合は、先述のFILTER関数とIMPORTRANGEを組み合わせた数式を使ってください。
=FILTER(IMPORTRANGE("スプレッドシートURL","シート名!A2:E100"), IMPORTRANGE("スプレッドシートURL","シート名!C2:C100")="東京都")
ただし初回はアクセス許可のダイアログが表示されるので、「アクセスを許可」をクリックする必要があります。
あるある3条件付き書式と並び替えが干渉して色がおかしくなる
条件付き書式で「ステータスが完了なら緑、未着手なら赤」のように設定しているシートで並び替えを行うと、条件付き書式の色は正しく追従しますが、手動で塗った背景色は行と一緒に移動します。この2つが混在していると、「あれ、完了なのに赤いぞ?」という混乱が生じます。
対処法は、手動の背景色と条件付き書式を絶対に混在させないことです。色による状態管理をしたいなら、すべて条件付き書式で統一してください。手動の背景色はインジケーターとしては使わず、あくまで装飾目的(ヘッダー行の色分けなど固定行のみ)に限定するのが鉄則です。
あるある4並び替えしたら数式の参照がずれてめちゃくちゃになった
これは初心者が最もハマりやすい落とし穴です。たとえばE2セルに
=C2*D2
という数式が入っているとき、メニューから並び替えを実行すると、数式は行ごと移動するため参照は正しく維持されます。つまりE2の数式は並び替え後もその行のC列×D列を参照し続けるので、通常は問題ありません。
ただし、他のシートから特定のセル番地を固定参照している場合は話が変わります。たとえば別シートに
='受注管理'!E5
と書いてある場合、受注管理シートを並び替えてもこの参照は
E5
のままです。E5にあったデータが並び替えでE10に移動しても、参照先は
E5
から変わりません。結果として、まったく関係ないデータを参照してしまいます。
対処法は2つあります。ひとつは、他シートからの参照にはVLOOKUPやINDEX/MATCHを使い、セル番地ではなくキー値で検索する方式にすることです。もうひとつは、参照元のシートでは一切並び替えを行わず、先述のSORT関数で別シートに並び替え済みビューを作る方法です。
上級者向けGASでフィルタ表示を一括作成する自動化スクリプト
チームメンバーが10人、20人と増えてくると、一人ひとりにフィルタ表示の作成方法を教えるのは非現実的です。そこで、GASを使ってフィルタ表示を一括で自動作成するアプローチが有効です。以下のスクリプトは、Sheets APIを利用してプログラム的にフィルタ表示を追加します。
フィルタ表示一括作成スクリプト
このスクリプトを使うには、Apps Scriptエディターの左側メニュー「サービス」から「Google Sheets API」を有効化する必要があります。
function createFilterViews() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("受注管理");
var sheetId = sheet.getSheetId();
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
// 部署ごとのフィルタ表示を一括作成
var departments = ;
// 部署名が入っている列番号(0始まり)
var deptColumnIndex = 7; // H列の場合
var requests = ;
departments.forEach(function(dept) {
requests.push({
"addFilterView": {
"filter": {
"title": dept + "用フィルタ",
"range": {
"sheetId": sheetId,
"startRowIndex": 0,
"endRowIndex": lastRow,
"startColumnIndex": 0,
"endColumnIndex": lastCol
},
"sortSpecs": [{
"dimensionIndex": 0,
"sortOrder": "ASCENDING"
}],
"criteria": {}
}
}
});
});
if (requests.length > 0) {
Sheets.Spreadsheets.batchUpdate({"requests": requests}, ss.getId());
console.log(departments.length + "件のフィルタ表示を作成しました");
}
}
このスクリプトを実行すると、「営業部用フィルタ」「経理部用フィルタ」「総務部用フィルタ」「開発部用フィルタ」の4つのフィルタ表示が一瞬で作成されます。あとは各メンバーに「データ」→「表示を変更」から自分の部署名のフィルタ表示を選ぶよう伝えるだけです。作成する側は1回スクリプトを実行するだけで、ユーザーは選ぶだけ。この仕組みが現場では非常に強力です。
データ量が増えたときの「重くなる問題」への具体的対処法
スプレッドシートのデータ行が5,000行、10,000行と増えてくると、フィルタや並び替えの操作自体が極端に遅くなります。ブラウザがフリーズしたり、「応答していません」という恐怖のダイアログが出現したりします。情シスへの問い合わせで「シートが重いんですけど」は間違いなくトップ3に入る頻出質問です。
重くなる主な原因
ARRAYFORMULA関数やFILTER関数が大量に入っているシートは再計算の負荷が高いのが最大の原因です。特に、FILTER関数の中にIMPORTRANGEを入れ子にしている場合や、ARRAYFORMULA内でVLOOKUPを全行に適用しているケースは致命的に重くなります。
また、条件付き書式のルールが何十個も重複して設定されている場合も動作が重くなります。ユーザーが「条件付き書式が効かない」と思って何度も新しいルールを追加した結果、同じ範囲に10個以上のルールが重なっていた…というのはよくある話です。
具体的な軽量化テクニック
まず、数式の参照範囲を「A:A」のような列全体指定から「A2:A5000」のような明示的な範囲指定に変更してください。列全体指定はGoogleが100万行以上をスキャンするため、これだけで劇的に軽くなります。
次に、過去データは定期的に別シートまたは別ファイルにアーカイブしてください。3ヶ月以上前の受注データが同じシートに残っている必要は通常ありません。四半期ごとにアーカイブする運用をすれば、常にアクティブなデータだけが残り、フィルタや並び替えの操作もサクサクになります。
そして、条件付き書式のルールを定期的に棚卸ししてください。「表示形式」→「条件付き書式」を開いて、重複しているルールや不要になったルールをすべて削除します。これだけで体感速度が大幅に改善するケースが非常に多いです。
「フィルタを作成」がグレーアウトして押せない場合の対処法
これも問い合わせが多いトラブルのひとつです。「データ」メニューの「フィルタを作成」がグレーアウトしていてクリックできない場合、主に以下の原因が考えられます。
まず、シートに結合セルが含まれているケースです。フィルタはデータが整然とした表形式であることを前提としているため、結合セルがあるとフィルタを作成できません。対処法はフィルタ対象範囲の結合セルをすべて解除することです。「表示形式」→「セルを結合」→「結合を解除」で一括解除できます。
次に、すでに別のフィルタが適用されているケースです。スプレッドシートではシートごとに1つのフィルタしか適用できないため、既存のフィルタを削除してから新しいフィルタを作成する必要があります。
そして、シートが保護されていて編集権限がないケースです。この場合は「フィルタ表示」を使うことで、閲覧権限だけでもフィルタリングが可能になります。ただしモバイルアプリからはフィルタ表示を作成できないため、PCからアクセスする必要があります。
ぶっちゃけこうした方がいい!
ここまで相当な分量の対策とスクリプトを紹介してきましたが、情シス10年超の経験をすべて凝縮して「ぶっちゃけこうした方がいい」を本音で語ります。
結論から言うと、「マスターデータのシートには絶対にフィルタも並び替えも使わせるな」がすべてです。これが核心です。
元データが入っているシート(マスターシート)は聖域です。ここにフィルタをかけたり並び替えを実行したりすること自体がリスクなんです。だから、マスターシートは編集権限を最小限のメンバーに絞って、閲覧用・分析用は別のシートタブにSORT関数やFILTER関数、QUERY関数で動的に表示する。これがぶっちゃけ一番楽だし、一番事故が少ないです。
個人的に最強だと思っている構成は、「マスターシート」+「閲覧用シート」+「自動バックアップ」の3点セットです。マスターシートにはデータ入力のみ行い、フィルタも並び替えも一切禁止。閲覧用シートにはQUERY関数やFILTER関数でマスターのデータを引っ張ってきて、ここで好きなだけフィルタや並び替えをする。そして万が一に備えてGASで毎日自動バックアップ。この構成にしてから、筆者の管理する部署ではフィルタ・並び替え関連のトラブル対応がほぼゼロになりました。
もうひとつ本音を言うと、フィルタ表示を全員にちゃんと使ってもらうのは、教育コストを考えるとかなりしんどいです。だから人に頼るのではなく、仕組みで守る。GASで自動並び替え復元をかけ、タイマーでフィルタを定期解除し、バックアップを毎日とる。ユーザーが何をしても大丈夫な環境を先に作ってしまう方が、情シスの精神衛生上もはるかに健全です。
スプレッドシートは「手軽で便利」が売りのツールですが、チームで本格運用するなら「壊されても戻せる仕組み」を先に構築してから使い始めるのが正解です。この記事で紹介したGASスクリプトは全部コピペで使えるので、まずはバックアップスクリプトだけでも今日中に設定してみてください。「保険をかけた」という安心感だけで、明日からのスプレッドシート運用に対する心持ちがまるで変わりますから。
スプレッドシートでフィルタと並び替えが競合する問題のよくある疑問
フィルタ表示を他の人に誤って削除されてしまったときはどうすればいい?
フィルタ表示の削除は残念ながら「変更履歴」に細かく記録されないため、通常のセル操作のように簡単に復元できません。ただし、削除直後であればCtrl+Z(MacCmd+Z)の「元に戻す」操作で復元できる可能性があります。時間が経つと復元が難しくなるので、重要なフィルタ表示を作成した際はフィルタ表示名と条件をメモしておくことを強くおすすめします。また、「データ」メニューから「フィルタをすべて削除」を選ぶと、自分だけでなく全員のフィルタ表示がすべて消えてしまうので、この操作は絶対に慎重に行ってください。
FILTER関数の結果を並び替えたいけどメニューの並び替えが効かないのはなぜ?
FILTER関数やSORT関数が出力する結果は動的な配列であり、メニューからの並び替え操作を直接適用することはできません。FILTER関数の結果を並び替えたい場合は、先述のように
=SORT(FILTER(...))
のネスト構造を使うか、QUERY関数で
ORDER BY
句を指定する方法を使ってください。関数が出力した結果に対してメニュー操作を行うと
#REF!
エラーが発生する場合があるので注意が必要です。
フィルタをかけた状態で行を削除すると非表示の行も消えてしまう?
いいえ、フィルタで非表示になっている行はフィルタ中の削除操作の対象にはなりません。ただし、並び替えはフィルタで非表示の行も含めて実行されるため、結果が意図しないものになることがあります。フィルタ中にデータ操作を行う際は、操作後にフィルタを一度解除して全体を確認する習慣をつけましょう。
スプレッドシートでフィルタと並び替えの競合を防ぐ一番簡単な方法は?
最も手軽で確実な方法は、個人の作業では必ず「フィルタ表示」を使い、通常のフィルタは全員が同じ画面を見る場面でのみ使用するというルールを徹底することです。これだけで競合トラブルの9割は防げます。加えて、ID列を設けておけば並び替え後の復元も万全です。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良...もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
スプレッドシートでフィルタと並び替えが競合する問題は、Googleスプレッドシートを共同利用する上で避けては通れない課題です。しかし、原因を正しく理解し、適切な機能を選択すれば、驚くほどスムーズに解決できます。
まずは今日から「フィルタ表示」を使う習慣を始めてみてください。それだけでチーム内のフィルタ・並び替えに関するストレスは大幅に減少するはずです。さらに余裕があれば、SORT関数やFILTER関数、QUERY関数を活用して、元データに触れない安全なデータ分析環境を構築しましょう。ID列の設置、モバイル操作の注意点、変更履歴の活用など、この記事で紹介した対策を組み合わせれば、もう「誰かがフィルタを変えた!」というトラブルに悩まされることはありません。チーム全員が快適に作業できるスプレッドシート環境を、ぜひ今日から実現してください。






コメント