javascript - 如何使用 Google Apps 脚本删除与 Google 表格中的条件匹配的所有行?

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

我正在使用 Google 表格、表单和 Apps 脚本开发一个简单的电子邮件管理系统,但我对 Javascript/Google Apps 脚本还不熟悉,而且我已经在这个问题上困扰了很长时间了。

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

| Name  | Email             | Group  |
|-------|-------------------|--------|
| John  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="72181d1a1c32170a131f021e175c111d1f" rel="noreferrer noopener nofollow">[email protected]</a>  | A      |
| Bill  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="90f2f9fcfcd0f5e8f1fde0fcf5bef3fffd" rel="noreferrer noopener nofollow">[email protected]</a>  | A      |
| Janet | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="016b606f6475416479606c716d642f626e6c" rel="noreferrer noopener nofollow">[email protected]</a> | B      |
| Mary  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a272b38330a2f322b273a262f64292527" rel="noreferrer noopener nofollow">[email protected]</a>  | B      |
| Mary  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e08d819299a08598818d908c85ce838f8d" rel="noreferrer noopener nofollow">[email protected]</a>  | Delete |
| Bill  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f1d1613133f1a071e120f131a511c1012" rel="noreferrer noopener nofollow">[email protected]</a>  | Delete |
| Janet | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5b313a353e2f1b3e233a362b373e75383436" rel="noreferrer noopener nofollow">[email protected]</a> | A      |

我正在尝试编写一个脚本,以编程方式查找所有标记为“删除”的电子邮件,并删除包含这些电子邮件的所有行。在这种情况下,我需要消除包含 [email protected] 的所有行和 [email protected]并保留约翰和珍妮特。预期输出:

| Name  | Email             | Group  |
|-------|-------------------|--------|
| John  | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="83e9ecebedc3e6fbe2eef3efe6ade0ecee" rel="noreferrer noopener nofollow">[email protected]</a>  | A      |
| Janet | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d6bcb7b8b3a296b3aeb7bba6bab3f8b5b9bb" rel="noreferrer noopener nofollow">[email protected]</a> | B      |
| Janet | <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a4cec5cac1d0e4c1dcc5c9d4c8c18ac7cbc9" rel="noreferrer noopener nofollow">[email protected]</a> | 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); 
}

我确信解决方案非常简单,但我已经绞尽脑汁了几个小时,但我无法弄清楚这一点!

最佳答案

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

关于javascript - 如何使用 Google Apps 脚本删除与 Google 表格中的条件匹配的所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530238/

相关文章:

javascript - 如何使用过滤功能显示li?

java - 检查随机数组中的重复数字

java - 将 java 数组存储到文件中以供读写

搜索 ArrayList 时发生 Java JSON ClassCastException

javascript - 如何将 Java 正则表达式转换为 JavaScript 正则表达式?

javascript - 在 JavaScript 中使用 break 与 find() 的 for 循环

javascript - 如何在 jhipster 中管理来自自定义 REST 的 .json 响应数据

javascript - 从关联数组/对象中提取的全局变量?

javascript - Javascript中多维数组的计数值

elasticsearch - 如何使用Elasticsearch获取正确的子节点