Google Spreadsheets脚本可以删除找到字符串的任何行

Google Spreadsheets script to delete any rows where a string is found

本文关键字:字符串 任何行 删除 Spreadsheets 脚本 Google      更新时间:2023-09-26

我需要循环遍历工作表中的所有行/列,并删除包含某些单词的行。理想情况下,我会使用正则表达式搜索表单,但只要找到一个字符串就可以帮助我移动。我在Stack Overflow上看到了很多关于查找和删除空行的帖子,但找不到任何关于搜索整个工作表和删除一行的帖子。

这就是我目前所拥有的:

/* Delete rows */
function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var deleted = 0;  // Counter (don't need if we loop backwards)
  var regExp = new RegExp('word');
  for (var row = 0; row < values.length; row++) {
    var regExpMatch = values[row][1].match(regExp);
    if (regExpMatch.length > 0) {
      sheet.deleteRow(row + 1 - deleted);
      deleted++;
    }
  }
  SpreadsheetApp.flush();
};

然而,这只搜索列B,并抛出错误"TypeError:无法从null读取属性'length'",即使"word"存在于我的电子表格的列B中。如果我做一个更简单的版本,比如:

/* Delete rows */
function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var deleted = 0;  // Counter (don't need if we loop backwards)
  for (var row = 0; row < values.length; row++) {
    if (values[row][1].search("WordThatExistsInOneRow")) {
      sheet.deleteRow(row);
      deleted++;
    }
  }
  SpreadsheetApp.flush();
};

它开始删除每一行,即使"WordThatExistInOneRow"只显示在一行中。

您没有正确编写循环逻辑,您需要先循环该行中的每一行,然后循环该行的每一列,然后分配行索引进行删除,删除必须按相反的顺序执行。试试这个:

/* Delete rows */
function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var toDelete = [];
  for (var row = 0; row < values.length; row++) {
    for(var column = 0;column<values[row].length;column++){
      if (values[row][column].indexOf("WordThatExistsInOneRow") > -1){
        toDelete.push(row);
      }
    }
  }
  for(var deleteRow = toDelete.length-1; deleteRow >= 0;deleteRow--){
    sheet.deleteRow(toDelete[deleteRow]+1);
  }
  SpreadsheetApp.flush();
};