google 使用单选按钮等复选框的脚本

google script using checkboxes like radio buttons

我正在尝试在 Google 表格中使用单选按钮之类的复选框。我从 https://www.benlcollins.com/apps-script/radio-buttons-in-google-sheets/ 上的有用脚本开始,但它只处理行,不幸的是,这对我不起作用。也感谢 Ben 的代码。

因此,我希望使用 Ben 的代码作为起点,让应用程序取消选中属于一组的复选框,只选中所选的复选框。

我已经将演示设置为多项选择题和答案,有两个问题(如下面的屏幕截图所示:

我的代码是:

/**
 * onEdit to uncheck checkboxes as required
 */
function onEdit(e) {
  // get event object data: sheet name, row number and column number
  const sheet = e.range.getSheet();
  if(sheet.getName()!='questions'){return}  // makes sure we only impact the one sheet we want to adjust
  const row = e.range.rowStart; 
  console.log(row);
  if (row < 8) {
    var block1 = row;
  }
  else if(row > 8 && row < 14) {
    var block2 = row;
  }
  switch(block1) {
    // case when row 3 is checked
    case 1:
      sheet.getRange("B4:B7").uncheck();
      break;
    // case when row 4 is checked
    case 2:
      sheet.getRangeList(["B3","B5:B7"]).uncheck();
      break;
    // case when row 5 is checked
    case 3:
      sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
      break;
    // case when row 6 is checked
    case 4:    
      sheet.getRangeList(["B3:B5","B7"]).uncheck();
      break;   
    // case when row 7 is checked
    case 5:
      sheet.getRange("B3:B6").uncheck();
      break;
    // cell is outside of rows 3 to 7
    default:
      return;
  }
  switch (block2) {
    // case when row 10 is checked
    case 1:
      sheet.getRange("B11:B13").uncheck();
      break;
    // case when row 11 is checked
    case 2:
      sheet.getRangeList(["B10","B12:B13"]).uncheck();
      break;
    // case when row 12 is checked
    case 3:
      sheet.getRangeList(["B10:B11","B13"]).uncheck();
      break;
    // case when row 13 is checked
    case 4:    
      sheet.getRangeList(["B10:B12"]).uncheck();
      break;
    // cell is outside of rows 3 to 7
    default:
      return;
  }
}

请注意,我的工作簿中有多个工作表,因此需要在第 7 行进行测试。

目前唯一能按我预期的方式工作的单元格是 B7。

对此我有点头疼,所以寻求一些指导。

我没有为每个问题使用 switch 语句,而是创建了一个适用于列 B 中任何框的函数(您可以更改为适合您需要的列)。您不必为每个问题创建单独的 switch 语句。

工作原理

onEdit() 检查编辑的单元格是否在目标的第 2 栏中 sheet,以及是否选中了该框(设置为 true)。

然后向上查找该问题组中的第一个单元格,然后向下查找该问题组中的最后一个单元格。

然后它遍历该问题集中的所有行号,并取消选中任何不是已编辑单元格的框。

有一个警告 - 包含问题的行中必须包含某些内容,函数才能找到问题范围的顶部。见下文

const ss = SpreadsheetApp.getActive();

function onEdit(e){
   let cell = e.range;
   let value = e.value;
   let sheet = e.source.getActiveSheet();
   
   Logger.log(cell.getA1Notation()+"  "+sheet.getName() + " "+ value);
   
   let col = cell.getColumn()

   if(col === 2 && sheet.getName() === "Question" && value === "TRUE") {
    
    // get the row numbers of the top and bottom check boxes in this question set
    let topRow = cell.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
    let bottomRow = cell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
    
    // get the number of rows in this question set, the + before the variables forces
    // app script to treat them as a number.  
    let numOfRows = +bottomRow - +topRow +1;
   
    Logger.log("Top Row: "+topRow + " bottom row:  "+bottomRow+" number of rows: " + numOfRows);

    // loop through each box in the question set and uncheck any that weren't the edited cell
    for (var i = 0; i < numOfRows; i++){
     let box = sheet.getRange(+topRow + +i, 2);
     let boxA1 = box.getA1Notation();
      Logger.log(boxA1);
      
      if (boxA1 !== cell.getA1Notation()){
        Logger.log("Box does not equal cell");
        box.uncheck();
      }
    }
   }
}

这是我测试的图片sheet:

知道了。代码如下:

/**
 * onEdit to uncheck checkboxes as required
 */
function onEdit(e) {
  // get event object data: sheet name, row number and column number
  const sheet = e.range.getSheet();
  if(sheet.getName()!='questions'){return}  // makes sure we only impact the one sheet we want to adjust
  const row = e.range.rowStart; 
  console.log(row);
  if (row < 8) {
    var block1 = row;
    var loopid=1;
  }
  else if( 8 > row < 14) {
    var block2 = row;
    var loopid=2;
  }
  if (loopid== 1) {
    switch(block1) {
      // case when row 3 is checked
      case 3:
        sheet.getRange("B4:B7").uncheck();
        break;
      // case when row 4 is checked
      case 4:
        sheet.getRangeList(["B3","B5:B7"]).uncheck();
        break;
      // case when row 5 is checked
      case 5:
        sheet.getRangeList(["B3:B4","B6:B7"]).uncheck();
        break;
      // case when row 6 is checked
      case 6:    
        sheet.getRangeList(["B3:B5","B7"]).uncheck();
        break;   
      // case when row 7 is checked
      case 7:
        sheet.getRange("B3:B6").uncheck();
        break;
      // cell is outside of rows 3 to 7
      default:
        return;
    }
  }
  if (loopid==2) {
    switch (block2) {
      // case when row 10 is checked
      case 10:
        sheet.getRange("B11:B13").uncheck();
        break;
      // case when row 11 is checked
      case 11:
        sheet.getRangeList(["B10","B12:B13"]).uncheck();
        break;
      // case when row 12 is checked
      case 12:
        sheet.getRangeList(["B10:B11","B13"]).uncheck();
        break;
      // case when row 13 is checked
      case 13:    
        sheet.getRange(["B10:B12"]).uncheck();
        break;
      // cell is outside of rows 10-14
      default:
        return;
    }
  }
}

您可以测试区域...

function onEdit(e) {
  var s = e.source.getActiveSheet();
  var r = e.source.getActiveRange();
  if(s.getName()!='questions'){return}
  if(r.getColumn()!=2){return}
  var col = 2;
  var region = r.getDataRegion()
  var begin = region.getRow()+1;
  var height = region.getNumRows()-1; 
  var row = r.getRow();
  if (r.getValue()) {
    var values = s.getRange(begin,col,height,1).getValues()
    for (var i=0;i<values.length;i++){
      values[i][0]=false
    }
    values[row-begin][0]=true
    s.getRange(begin,col,height,1).setValues(values)
  }
}

https://docs.google.com/spreadsheets/d/14vJjimVVfd_-G_M2sT7m1CjBr-rLaVhyYW0e622VDsE/copy