この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのOffice Scripts Table APIとスクリプト入力パラメーター仕様を確認し、既存データを誤って変更しにくい形へサンプルを見直しています。検証ステータス:📘 公式仕様確認済み・サンプル実装済み・対象Microsoft 365環境での実機確認は未実施
Excelの空白行をまとめて消す ― Office Scriptsで対象テーブルだけ安全に整理する
Excelの空白行を自動削除するなら、ワークシート全体ではなく対象のExcelテーブルだけを処理すると事故を減らせます。さらに、テーブルが複数あるブックでは「最初のテーブル」を勝手に選ばず、対象名を指定させる方が安全です。
今回削除する「空白行」
このサンプルでは、テーブルの1行について、すべてのセルを文字列として見たときに空文字または空白だけなら削除します。
数値
0は削除しません文字列が1つでもあれば削除しません
数式の結果が空文字
""なら、この判定では空白として扱われます
数式そのものが入っている行を絶対に残したい場合は、値ではなく数式の有無も確認する別ルールに変える必要があります。
対象テーブルを勝手に決めない
Office Scriptsは main 関数に追加パラメーターを定義できます。今回は tableName?: string を受け取り、ブックに複数のテーブルがある場合は対象名の指定を必須にします。
/**
* @param tableName 対象テーブル名。テーブルが1つだけなら省略できます。
*/
function main(workbook: ExcelScript.Workbook, tableName?: string) {
const tables = workbook.getTables();
if (tables.length === 0) {
throw new Error("ブック内にExcelテーブルがありません。");
}
let table: ExcelScript.Table;
if (tableName && tableName.trim() !== "") {
const found = workbook.getTable(tableName);
if (!found) {
throw new Error(`指定したテーブル「${tableName}」が見つかりません。`);
}
table = found;
} else {
if (tables.length > 1) {
throw new Error("テーブルが複数あります。tableNameを指定してください。");
}
table = tables[0];
}
const values = table.getRangeBetweenHeaderAndTotal().getValues();
for (let row = values.length - 1; row >= 0; row--) {
const isBlank = values[row].every(value => String(value).trim() === "");
if (isBlank) {
table.deleteRowsAt(row, 1);
}
}
}
なぜ下から削除するのか
上から行を削除すると、その瞬間に後続行の位置が詰まります。まだ確認していない行番号が変わるため、ループ処理では行を飛ばす原因になります。最後の行から0行目へ逆向きに進めば、未処理の行番号は変わりません。
flowchart TD
A[対象テーブルを決定] --> B[データ行を取得]
B --> C[最後の行から確認]
C --> D{全セルが空白?}
D -- はい --> E[そのテーブル行だけ削除]
D -- いいえ --> F[残す]
E --> G[1つ上の行へ]
F --> G
G --> C
「安全」とは削除しないことではない
このコードは実際にテーブル行を削除します。安全側にしているのは、変更範囲をテーブル内部へ限定し、対象が曖昧なら停止する点です。実行前のバックアップや、重要ブックならコピーで試す運用は別途必要です。
また、Office Scriptsの deleteRowsAt はテーブルのデータ行を削除するAPIです。ワークシート全体の行削除とは分けて考えます。
