删除复选框后如何在给定的单元格中插入复选框

时间:2019-04-23 19:35:15

标签: google-apps-script google-sheets

我正在寻找一个脚本来替换给定列中的复选框。以下是描述我的设置的图像。我希望这样,当删除一行时,只有带有复选框的列会再次被复选框替换。

Image of sheet

我希望删除的复选框仅替换带标签的列。不幸的是,一旦用户删除Google表格,就无法保留其数据验证。谢谢您的帮助。

1 个答案:

答案 0 :(得分: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();
      }
    }
  }
}