この方法は行を完全に削除します。操作は簡単で速いですが、元に戻すにはバックアップが必要です。
- 通常のデータ行に必ずデータが入っている列(日付列や勘定コード列など)を選択します。
- 「データ」→「フィルターを作成」を選択します。
- その列のフィルタードロップダウンをクリック→「条件でフィルター」→「空白」を選択します。
- 表示された空白行をすべて選択します(
Ctrl+Shift+Endで最終行まで素早く移動できます)。 - 右クリック→「行を削除」を選択します。
- フィルターを解除して完了です。
5,000行のインポートデータであれば、手作業でも2分以内に完了します。主なリスクは、フィルター対象にしなかった列(備考欄、フラグ、Z列のID番号など)にデータが入っている行まで削除してしまう点です。
削除前の確認を省かないこと: 作業前にチェック用の列を追加し、=COUNTA(A2:Z2) を全行に適用してから、値が0の行のみを削除対象にしてください。「見た目は空白だがデータがある行」を誤って消すミスは意外と起きやすく、バックアップなしには復元できません。
この方法を選ぶタイミング: 一度きりのデータクレンジング、かつ自分が管理しているデータで、すべての列が本当に空白であると確認できている場合。
方法3:Apps Scriptで空白行を削除する(定型作業向け)
毎月同じインポートデータをクリーニングしている場合--月次決算の準備、銀行口座照合のエクスポート、定期的なデータ処理など--スクリプトを用意しておくと便利です。
function deleteBlankRows() {
// '仕訳明細'シートを対象にしています。シート名は適宜変更してください
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('仕訳明細');
var data = sheet.getDataRange().getValues();
var rowsToDelete = [];
// A列が空の行を収集(判定列は必要に応じて変更してください)
for (var i = data.length - 1; i >= 0; i--) {
if (data[i][0] === '' || data[i][0] === null) {
rowsToDelete.push(i + 1); // Sheetsの行番号は1始まりなので+1
}
}
// インデックスのズレを防ぐため、後ろから順に削除する
rowsToDelete.forEach(function(row) {
sheet.deleteRow(row);
});
}
「拡張機能」→「Apps Script」→「実行」から起動します。3,200行のシートに280行の空白がある場合、処理時間は45〜90秒程度です。Apps Scriptの実行時間制限は1回あたり6分(Google公式ドキュメント「Quotas for Google Services」、2026年現在)のため、それより大規模なデータを処理する場合は削除処理をバッチに分けるか、方法1(FILTER数式)の利用を検討してください。
この方法を選ぶタイミング: 月次の定型クリーニング作業、他のメンバーがインポートを実行する共有モデルで、かつApps Scriptの基本的な操作に慣れている場合。プログラミング経験がない場合は、方法1または方法2から始めることをお勧めします。
比較:どの方法を選ぶべきか
| 方法 | データ削除 | 処理速度 | 向いている用途 |
|---|---|---|---|
| FILTER数式 | なし(非破壊) | 即時(自動更新) | 自動更新されるインポート、共有データソース |
| フィルター+削除 | あり | 5,000行で2分以内 | 一度きりのクレンジング、自己管理データ |
| Apps Script | あり | 3,200行で45〜90秒 | 月次定型作業、繰り返し処理 |
月次決算モデルに適したパターン
多くの月次決算モデルには、勘定元帳の明細、売掛金エイジング、給与データなど、何らかのシステムからの生データエクスポートタブが存在します。そしてそれらのエクスポートには、ほぼ例外なくシステム側が挿入した区切り行が含まれています。
最もシンプルで安全な構成は次の通りです。生データはロックされた専用タブに置き、FILTERでステージングタブに出力し、すべての集計数式はステージングタブを参照するというパターンです。この構成にしておけば、インポートが更新されても(あるいは新しいエクスポートで上書きされても)、モデル全体が壊れることはありません。監査対応の場面でも「生データには一切手を加えていない」と説明しやすくなるという副次的なメリットもあります。
削除前にどの行が対象になるかをあらかじめ確認したい場合--空白の定義が曖昧なケース(疎なデータで一部の列にしかデータがないなど)--はModelMonkeyの承認ワークフロー機能が参考になります。実際の削除を実行する前に、対象行をシート上でハイライト表示して確認できます。
よくある質問
Q. FILTER数式と手動削除、どちらが安全ですか?
監査対応や複数人で使う共有モデルではFILTER数式(非破壊)が安全です。元データを変更しないため、誰かがインポートを上書きしても影響を受けません。手動削除は一度きりのクレンジング作業や、完全に自分が管理しているデータに限定することをお勧めします。
Q. 空白行があるとVLOOKUPやピボットテーブルに影響しますか?
はい、影響します。IFERRORなしのVLOOKUPは空白セルを検索するとエラーを返します。ピボットテーブルは動的範囲(A:A形式)を使っている場合、空白行を境に拡張が止まることがあります。Google Sheetsの公式ヘルプ「FILTER関数」でも、FILTER数式で事前にデータを整形してからピボットテーブルに渡す使い方が紹介されています(2026年現在)。
Q. FILTER数式のスピル出力が他の数式と干渉します。どうすればよいですか?
スピル出力の横や下に数式や値を置くと、FILTERの展開先と重なってエラーになります。ステージングタブはFILTER出力専用にして、他のデータや数式を置かないよう設計してください。SUMIFSなどの集計数式はステージングタブを「読み取り専用」として参照するだけにとどめ、ステージングタブ内には何も書き込まない運用が最も安全です。
Q. FILTER範囲は固定(A2:F3200)にすべきですか?列全体(A2:F)にすべきですか?
月次決算のように行数が概ね決まっているケースでは固定範囲を推奨します。列全体参照は行数の増減に自動対応できますが、列末尾の空行を誤って取り込んでスピル範囲が膨らむリスクがあります。行数が毎月大きく変動する場合は LEN(TRIM('仕訳明細'!A2:A))>0 のような条件を判定に使うか、処理前にCOUNTAで行数を確認してから固定範囲を更新する運用がおすすめです。
Q. 「見た目は空白なのに削除できない」行があります。なぜですか?
スペース文字や改行コード(CHAR(10))が入力されている場合、セルは空白に見えますが <> "" の判定を通過しません。=LEN(TRIM(A2))=0 で判定するか、事前に =TRIM(A2:A) で余分な空白を除去してから空白判定を行うと解決できます。