【问题标题】:Delete a row in google spreadsheet base on contents of cell in row根据行中单元格的内容删除谷歌电子表格中的一行
【发布时间】:2013-07-29 17:22:39
【问题描述】:

我有这个脚本来删除某些行,如果选定列中的选定单元格有被提及的内容,但我不明白它在哪里失败

    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);
    }

提前感谢您的帮助

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    有几点需要改进:

    • 请记住,电子表格行和列的编号从 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);
    }
    

    【讨论】:

    • 非常感谢。我最终使用了 .search,因为我需要一个广泛匹配(我有一个大型电子邮件数据库来清理免费电子邮件)。循环现在效果很好,列字母也比以前好得多。
    【解决方案2】:

    您需要确保要删除的索引是正确的索引。当您删除一行时,所有波纹管行的索引都更改为-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++;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多