只有一个TRUE复选框

时间:2018-09-17 20:58:39

标签: javascript google-apps-script google-sheets spreadsheet

我有一列复选框,例如所附的照片My column

如果选中一个框,它将为另一个工作表中的单元格设置一个值。

如果我选中1号复选框,它将变为true,其余的仍为false 那么如果我选中2号框,那么它也会变成1号框,而其余框仍为false。

这是正常操作,但是我还需要其他内容

当我选中一个框时,它变为true,而其他所有框都变为false,则无论是否选中它们。换句话说,我希望一次选中一个框。

我可以这样做吗?

这是我的代码,如果选中此框,则可以设置一个值。

var hasValue = sheet.getRange("B2:B").getValues();
    for (var i = 0; i < hasValue.length; i++) {
        if (hasValue[i][0] == true) {
             var transfer = sheet2.getRange(2, 2, 1, 1).setValue(i+1);
        }
    }

2 个答案:

答案 0 :(得分:1)

这种行为被称为“单选按钮”。

最简单的方法是绑定简单的编辑触发器:

  1. 检查编辑后的范围,以确定它是否位于您的复选框区域,如果没有,请退出。
  2. 将所有复选框设置为false
  3. 将已编辑的单元格设置为事件对象中的适当值
  4. 如果需要,执行更新

您将必须配置的极少样本,并且仅针对单单元格编辑进行配置。

function onEdit(e) {
  if (!e || e.value === undefined)
    return; // The function was run from the Script Editor, or a multi-cell range was edited.
  const edited = e.range;
  const s = edited.getSheet();
  if (s.getName() !== "some name")
    return; // A cell on the wrong sheet was edited
  if (isCheckboxRow_(edited.getRow()) && isCheckboxCol_(edited.getColumn())) {
    // The cell edited was in a row and a column that contains a checkbox
    updateCheckboxes_(s, edited, e);
  }
}

function isCheckboxRow_(row) {
  // Assumes checkboxes are only in rows 5, 6, 7, 8, 9, and 10
  return row >= 5 && row <= 10;
}
function isCheckboxCol_(col) {
  // Assumes checkboxes are in column A
  return col === 1; 
}
function updateCheckboxes_(sheet, editRange, eventObject) {
  if (!sheet || !edit || !eventObject)
    return; // Make sure all required arguments are defined (i.e. this was called and not run from the Script Editor)
  const cbRange = sheet.getRange("A5:A10"); // location of the checkboxes in a radio group.
  cbRange.setValue(false);
  editRange.setValue(eventObject.value);
  // Reference some other sheet
  const targetSheet = eventObject.source.getSheetByName("some other sheet name")
  if (!targetSheet)
    return; // the sheet name didn't exist in the workbook we edited.
  // Reference a cell in the same row as the cell we edited, in column 1
  const targetCell = targetSheet.getRange(editRange.getRow(), 1);
  if (eventObject.value) {
    // when true, give the target cell the value of the cell next to the edited checkbox
    targetCell.setValue(editRange.offset(0, 1).getValue());
    // do other stuff that should be done when a checkbox is made true
  } else {
    // the checkbox was toggled to false, so clear the target cell
    targetCell.clear();
    // do other stuff that should be done when a checkbox is made false
  }
}

以上内容暗示了一些建议的做法,例如使用助手功能封装和抽象逻辑,从而使功能更易于理解。

评论:

答案 1 :(得分:0)

正如我提到的那样,我将给我们一个onEdit(event)来监视已选中哪个复选框,并循环浏览该列,并且仅将一个复选框设置为true。请注意,在您的代码段中,getRange(“ B2:B”)可能是999行。我使用getDataRange()来限制使用的行。我使用getCriteriaType()来检查它是否是复选框,而不是其他数据类型。我假设在您的sheet2上,您想记录上一次选中哪个框为true。 tehhowch的答案更为笼统,可能超出您的需求,因此这里的答案很有限。

Profit