【问题标题】:How to remove all rows matching a criteria in Google Sheets with Google Apps Script?如何使用 Google Apps 脚本删除与 Google 表格中的条件匹配的所有行?
【发布时间】:2017-07-20 16:37:02
【问题描述】:

我正在使用 Google 表格、表单和 Apps 脚本开发一个简单的电子邮件管理系统,但我是 Javascript/Google Apps 脚本的新手,我已经被这个问题困扰了很长时间。

所以,我有一个包含联系人的电子表格,列出了他们的姓名、电子邮件和群组,如下所示:

| Name  | Email             | Group  |
|-------|-------------------|--------|
| John  | john@example.com  | A      |
| Bill  | bill@example.com  | A      |
| Janet | janet@example.com | B      |
| Mary  | mary@example.com  | B      |
| Mary  | mary@example.com  | Delete |
| Bill  | bill@example.com  | Delete |
| Janet | janet@example.com | A      |

我正在尝试编写一个脚本,以编程方式查找所有标有“删除”的电子邮件并删除包含这些电子邮件的所有行。在这种情况下,我需要删除所有包含 mary@example.com 的行和 bill@example.com 并保留 John 和 Janet。预期输出:

| Name  | Email             | Group  |
|-------|-------------------|--------|
| John  | john@example.com  | A      |
| Janet | janet@example.com | B      |
| Janet | janet@example.com | A      |

问题是我找不到以这种方式过滤工作表的方法,并且我的脚本不断复制所有内容,包括我想删除的行。这是我目前写的代码:

function removeDelRows() {

    var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet
    var data = ss.getDataRange().getValues(); // Get values in active sheet

    var toDelete = new Array();
    var newData = new Array();

    // Put in toDelete array all emails marked as "Delete"
    for (var i = 0; i < data.length; i++) {
        if (data[i][2] == "Delete") {
            toDelete.push(data[i][1]);
        }
    }
    // !BUGGY!
    // Find all rows that contains emails to be deleted and remove them 
    for (var j = 0; j < data.length; j++) {
        for (var k = 0; k < toDelete.length; k++) {
            if(data[j][1] == toDelete[k]){} // Do nothing
            else{
                newData.push(data[j]); // THIS CONDITION IS NOT BEHAVING AS EXPECTED; NEWDATA IS A COPY OF DATA
            }
        }
    }
  Logger.log(newData); // newData should contains only rows that do not match toDelete ones

  // Delete everything else
    sheet.clearContents();
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData); 
}

我确信解决方案非常简单,但我已经数小时不停地敲打我的头,我无法弄清楚这一点!

【问题讨论】:

    标签: javascript arrays multidimensional-array google-apps-script google-sheets


    【解决方案1】:

    使用 deleteRow() 怎么样?

        var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet
        var data = ss.getDataRange().getValues(); // Get values in active sheet
    
        nextLine: for( var i = data.length-1; i >=0; i-- ) { 
          if( data[i][2] !== "Delete" ) continue nextLine;
          ss.deleteRow(i+1);
        }
    

    【讨论】:

    • 非常感谢!我对您的版本进行了一些修改,现在可以完美运行了!
    • 不要忘记将其标记为已回答,因为它正在工作。点击灰色复选标记
    • 请记住,此解决方案涉及对将被删除的每一行的 api 调用。如果您有一张包含数十万条记录的工作表,这可能不是最佳解决方案。
    猜你喜欢
    • 2016-10-21
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多