Скрипт Google, позволяющий выбрать только 1 флажок на строку и 3 флажка на столбец - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу создать скрипт Google на следующем Google Sheet , чтобы разрешить только 1 выбор флажка на строку и 3 флажка на максимум столбца, как описано здесь .

Если в одном ряду выбраны 2 флажка, должно появиться всплывающее окно с надписью «Пожалуйста, выберите только один флажок в строке», а для последнего редактирования должно быть установлено значение ЛОЖЬ. То же самое, если выбрано более 3-х флажков для каждого столбца (всплывающее окно windows с надписью «В этом столбце уже есть 3 выбора, выберите другой столбец» и установите значение «ЛОЖЬ» при последнем редактировании).

1 Ответ

1 голос
/ 04 апреля 2020

Эта функция накладывает ограничение только на одну проверку на строку и 3 проверки на столбец. Необходимо указать параметр массива A1Notation string и имя листа. Если вы превысили пределы, последний флажок будет возвращен в ложь, и вы получите предупреждение в формате тоста.

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);};          
    }
  }
}

Анимация:

enter image description here

Методы массива

Блок событий onEdit

Ваши данные c case:

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);};          
    }
  }
}

Анимация:

enter image description here

...