【问题标题】:Identify and delete the first checked checkbox in a column [Google Sheets]识别并删除列中第一个选中的复选框 [Google 表格]
【发布时间】:2020-03-10 08:05:37
【问题描述】:
  • C 列,从第 6 行开始,全部填满了复选框。
  • 我想删除选中该行 C 列中的框的所有行。
  • 此工作表的名称为“Today”,位于下面的同名变量中。

这是我目前所拥有的,它没有成功运行,我无法确定原因:

    var values = Today.getRange('C6:C').getValues();
    var a = 0;
      while (a<=values.length){
        if ( values[a][0] == "True" ) {   
          Today.deleteRow(a+6);           //Here I add 6 to 'a' since the range 'values' started from row 6.
        }
      a++    //Increase 'a' by 1 and continue.
      }

【问题讨论】:

  • 这是我目前所拥有的,没有成功运行,我无法确定原因: values 的值是多少?提示:Logger.log(values);

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


【解决方案1】:
  • 您想删除在“Today”工作表名称上选中“C”列复选框的行。
  • 复选框置于“C6:C”。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

修改点:

  • 可以通过检索数据范围来降低循环成本。
  • 当删除行时,当使用反向循环时,过程可以更简单。因为当一行被删除时,行号就改变了。请注意这一点。

模式一:

在此模式中,使用 SpreadsheetApp 等电子表格服务。

修改脚本:

function myFunction() {
  var sheetName = "Today"; // Please set the sheet name.

  var Today = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var values = Today.getRange('C6:C' + Today.getLastRow()).getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i][0]) Today.deleteRow(i + 6);
  }
}

模式 2:

在此模式中,使用了 Sheets API。所以please enable Sheets API at Advanced Google services.在删除行数较多的情况下,这种方式的处理成本要比模式1低。

示例脚本:

function myFunction() {
  var sheetName = "Today"; // Please set the sheet name.

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var sheetId = sheet.getSheetId();
  var values = sheet.getRange('C6:C' + sheet.getLastRow()).getValues();
  var requests = values.reduce(function(ar, [e], i) {
    if (e) ar.push({deleteDimension:{range:{sheetId:sheetId,dimension:"ROWS",startIndex:(i + 5),endIndex:(i + 6)}}});
    return ar;
  }, []).reverse();
  Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 谢谢。模式 1 准确地向我展示了我所缺少的东西。不过我有一个问题 - 如果我尝试使用相同的模式来删除所有未选中的框,它似乎失败了。我已将模式 1 中的 'values[i][0]' 替换为 'values[i][0] == false'。这不应该以相同的方式工作,而是删除所有未选中的框吗?
  • @Nagaram92 感谢您的回复。不幸的是,我无法了解it seems to fail 的详细情况。这是因为我的英语水平不好。我对此深表歉意。如果要使用模式1删除“C”列中未选中复选框的行,将if (values[i][0]) Today.deleteRow(i + 6);修改为if (values[i][0] === false) Today.deleteRow(i + 6);怎么样?但是我无法理解你的实际情况。所以如果这不是你想要的方向,我再次道歉。
  • 非常感谢田池。你的评论正是我所需要的。再次感谢您。
猜你喜欢
  • 2013-01-22
  • 2017-10-08
  • 2023-04-10
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多