根据行中单元格的内容删除Google电子表格中的一行

时间:2013-07-29 17:22:40

标签: google-apps-script google-sheets google-docs

我有这个脚本删除某些行,如果所选列中的选定单元格具有提到的内容,但我不知道它失败的地方

    function DeleteRowByKeyword() {

  var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row","", Browser.Buttons.OK);

  //  prendo quello attivo
  var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var FIRST_COLUMN = Browser.inputBox("Number of Column to look at (eg: for column A enter 1)","", Browser.Buttons.OK);

  ss.toast("removing duplicates...","",-1);

  var dataCopy1 = DATA_SHEET.getDataRange().getValues();
  var deleted_rows = 0;
  var rangeToCopy = '';

  if (dataCopy1.length > 0) {
    var i = 1;

    while (i < DATA_SHEET.getMaxRows() - deleted_rows) {
  if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) {

    ss.deleteRow(i);
    deleted_rows++;
  } 
  i++;
    }
  }


  ss.toast("Done! " + deleted_rows + ' rows removed',"",5);
    }

提前感谢任何帮助

2 个答案:

答案 0 :(得分:3)

有一些事情需要改进:

  • 请记住,电子表格行和列的编号从 1,适用于SpreadsheetApp中的所有方法,同时是javascript数组 从0开始编号。您需要在这些数字之间进行调整 与两者合作时的基础。

  • 此处String.search()方法可能不合适 两个原因。 .search()将匹配子串,所以 ('Testing').search('i')找到匹配项;你可能想要找到确切的 相反。此外,.search()包括对正则表达式的支持 匹配,因此用户可能会惊讶地发现他们的输入被解释 作为正则表达式; .indexOf()可能是更好的选择。

  • 要限制对包含数据的行的操作,请使用.getLastRow() 而不是.getMaxRows()

  • 删除行时,将获得电子表格dataRange的大小 小;你确实考虑到了这一点,但因为你正在循环 在最大尺寸下,代码因此要求而变得复杂。 您可以通过从最大值开始循环来简化操作。

  • 列号的输入容易出错,因此请让用户输入 信件;你可以将它转换为数字。

  • 您尚未为ss定义值(在此函数中)。

这是更新后的代码:

function DeleteRowByKeyword() {

  var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row", "", Browser.Buttons.OK);

  var matchCol = Browser.inputBox("Column Letter to look at", "", Browser.Buttons.OK);
  var FIRST_COLUMN = (matchCol.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1);  // Convert, e.g. "A" -> 1

  //  prendo quello attivo (get active sheet)
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  ss.toast("removing duplicates...", "", -1);

  var dataCopy1 = DATA_SHEET.getDataRange().getValues();
  var deleted_rows = 0;

  if (dataCopy1.length > 0) {
    var i = DATA_SHEET.getLastRow();  // start at bottom

    while (i > 0) {
      if (dataCopy1[i-1][FIRST_COLUMN-1] === value_to_check) {

        ss.deleteRow(i);
        deleted_rows++;
      }
      i--;
    }
  }

  ss.toast("Done! " + deleted_rows + ' rows removed', "", 5);
}

答案 1 :(得分:1)

您需要确保删除索引是正确的索引。删除行时,所有波纹管行的索引都会更改为-1。 所以试试这段代码:

if (dataCopy1.length > 0) {
var i = 1;

while (i < DATA_SHEET.getMaxRows() - deleted_rows) {
 if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) {

   ss.deleteRow(i - deleted_rows);
  deleted_rows++;
 } 
i++;
}
}