批量删除 Excel 空白行 —— 使用 Office Scripts 安全整理指定表格

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

关于本文
本文由利用生成式 AI 的自动化生成流程创建。我们核对了 Microsoft Learn 的 Office Scripts Table API 及脚本输入参数规范,并重新调整了示例,以确保不易误修改现有数据。

验证状态:📘 已确认官方规范・已实现示例・未在目标 Microsoft 365 环境中进行实机验证

批量删除 Excel 空白行 —— 使用 Office Scripts 安全整理指定表格

若要自动删除 Excel 中的空白行,仅处理指定的 Excel 表格(而非整个工作表)可以减少事故。此外,在包含多个表格的工作簿中,不应擅自选择“第一个表格”,而是让用户指定目标名称,这样会更加安全。

本次要删除的“空白行”

在此示例中,如果表格的某一行在将所有单元格视为字符串时,其内容为空字符串或仅包含空白,则将其删除。

  • 数字 0 不会被删除

  • 只要存在哪怕一个字符串就不会被删除

  • 如果公式的结果为空字符串 "",在此判定中将被视为空白

如果您绝对想保留包含公式本身的行,则需要将其更改为同时检查是否存在公式(而非仅检查值)的其他规则。

不擅自决定目标表格

Office Scripts 可以在 main 函数中定义附加参数。本次将接收 tableName?: string,如果工作簿中存在多个表格,则必须指定目标名称。

/**

 * @param tableName 目标表名。如果只有一个表,可以省略。
 */
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。这与整个工作表的行删除概念不同,需要区分对待。

GitHub 示例

官方信息与第一手资料

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
标题和URL已复制