Google 允许每行仅选择 1 个复选框,每列仅选择 3 个复选框的脚本

Google script to allow selecting only 1 checkbox per row and 3 checkboxes per column

我想在以下 Google Sheet to allow only 1 checkbox selection per row, and 3 checkboxes selected per column as maximum, as described here 上制作一个 Google 脚本。

如果在同一行上选中了 2 个复选框,则应显示弹出窗口 window,显示 "Please select only 1 checkbox per row",最后一次编辑应设置为 FALSE。如果每列选择了 3 个以上的复选框,则相同(弹出 windows 说 "This column has already 3 selections, please choose a different column",并在最后一次编辑时设置为 FALSE)。

此函数限制了每行只能检查一次,每列只能检查 3 次。您必须提供数组范围参数 A1Notation 字符串和 sheet 名称。如果您超出限制,最后一个复选框将返回到 false,您会收到祝酒词格式的警告。

function onEdit(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='You provide sheet name') {
    const mcpr=1;
    const mcpc=3;
    const arrayrange='A1:C10';//You provide A1Notation range string
    const arg=sh.getRange(arrayrange);
    const avs=arg.getValues();
    const ulr=arg.getRow();
    const ulc=arg.getColumn();
    const lrr=ulr+arg.getHeight()-1;
    const lrc=ulc+arg.getWidth()-1;   
    if(e.range.columnStart<=lrc && e.range.rowStart<=lrr && e.value=="TRUE") {
      let rc=avs[e.range.rowStart-ulr].filter(function(e){return e;}).reduce(function(a,v){ if(v){return a+1;} },0);
      if(rc>mcpr){e.range.setValue("FALSE");e.source.toast('Sorry maximum checks per row is ' + mcpr);};
      let cc=avs.map(function(r,i){return r[e.range.columnStart-ulc];}).filter(function(e){return e}).reduce(function(a,v){if(v){return a+1;}},0);
      if(cc>mcpc){e.range.setValue('FALSE');e.source.toast('Sorry maximum checks per column is ' + mcpc);};          
    }
  }
}

动画:

Array Methods

onEdit Event Block

您的具体情况:

function onEdit(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='Sheet1') {
    const mcpr=1;
    const mcpc=3;
    const arrayrange='D3:AC7';
    const arg=sh.getRange(arrayrange);
    const avs=arg.getValues();
    const ulr=arg.getRow();
    const ulc=arg.getColumn();
    const lrr=ulr+arg.getHeight()-1;
    const lrc=ulc+arg.getWidth()-1;   
    if(e.range.columnStart<=lrc && e.range.rowStart<=lrr && e.value=="TRUE") {
      let rc=avs[e.range.rowStart-ulr].filter(function(e){return e;}).reduce(function(a,v){ if(v){return a+1;} },0);
      if(rc>mcpr){e.range.setValue("FALSE");e.source.toast('Sorry maximum checks per row is ' + mcpr);};
      let cc=avs.map(function(r,i){return r[e.range.columnStart-ulc];}).filter(function(e){return e}).reduce(function(a,v){if(v){return a+1;}},0);
      if(cc>mcpc){e.range.setValue('FALSE');e.source.toast('Sorry maximum checks per column is ' + mcpc);};          
    }
  }
}

动画: