删除一个复选框时,如何在给定单元格中插入复选框

问题描述 投票:1回答:1

我希望创建一个脚本,删除它们时替换给定列中的复选框。下面是描述我的设置的图像。我想这样,当删除一行时,只有带复选框的列将再次被复选框替换。

Image of sheet

我希望删除后只用复选框替换带标签的列。遗憾的是,Google表格无法在用户删除数据后保留数据验证。谢谢您的帮助。

google-apps-script google-sheets
1个回答
0
投票

如果覆盖非复选框会很危险,您可以让脚本为这些范围重新添加数据验证。同样,这自然更安全,更快,因为它一次完成整列。

function checkboxes() {

  var targetSheetName = "Sheet1",
      headerRows = 1,
      checkboxColumns = [1, 3, 4, 5, 7]; // UPDATE THIS LIST IF RESTRUCTURING SPREADSHEET

  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(targetSheetName),
      maxRows = targetSheet.getMaxRows(),
      targetRows = maxRows - headerRows,
      enforceCheckbox = SpreadsheetApp.newDataValidation();
  enforceCheckbox.requireCheckbox();
  enforceCheckbox.setAllowInvalid(false);
  enforceCheckbox.build();

  for (var c in checkboxColumns) {
    var targetRange = targetSheet.getRange(headerRows+1, checkboxColumns[c], targetRows);
    targetRange.setDataValidation(enforceCheckbox);
  }
}

如果您不关心这些列的内容,则会强制使用复选框覆盖非复选框。它的速度要慢得多,因为它逐个单元格来保存复选框并覆盖其他所有内容。

function checkboxes() {

  var targetSheetName = "Sheet1",
      headerRows = 1,
      checkboxColumns = [1, 3, 4, 5, 7]; // UPDATE THIS LIST IF RESTRUCTURING SPREADSHEET

  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(targetSheetName),
      maxRows = targetSheet.getMaxRows(),
      targetRows = maxRows - headerRows;

  for (var c in checkboxColumns) {
    for (var r = headerRows + 1; r <= maxRows; r++) {    
      var targetRange = targetSheet.getRange(r, checkboxColumns[c]);
      if (targetRange.isChecked() == null) {
        targetRange.insertCheckboxes();
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.