Только один ИСТИННЫЙ флажок - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть столбец флажков:

My column.

Если флажок установлен, он устанавливает значение для ячейки на другом листе.

ЕслиЯ отмечаю флажок № 1, он становится истинным, а оставшееся все еще ложным, тогда, если я отмечаю флажок № 2, он также становится истинным долго с полем № 1, а оставшийся все еще ложным.Это нормальная операция, но мне нужно, чтобы, когда я ставил флажок, он становился истинным, а все остальные блоки становились ложными, либо они отмечены, либо нет. Другими словами, я хочу, чтобы один флажок проверялся за раз.

Могу ли я это сделать?

Это мой код для установки значения, если флажок установлен:

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 голосов
/ 18 сентября 2018

Как я уже упоминал, я бы использовал onEdit (событие), чтобы отслеживать, какой флажок был установлен, и проходить по столбцу, и установить только один флажок в значение true.Обратите внимание, что в вашем фрагменте кода getRange ("B2: B") может содержать 999 строк.Я использую getDataRange (), чтобы ограничить только строки, которые используются.И я использую getCriteriaType (), чтобы проверить, что это флажок, а не какой-то другой тип данных.И я предполагаю, что на вашем листе2 вы хотите записать, какой флажок был последний раз отмечен как true.Ответ tehhowch является более общим и, возможно, больше, чем вам нужно, так что вот ограниченный конкретный ответ.

function onEdit(event) {
  try {
    var sheet = event.range.getSheet();
    // Limit the following code to a particular sheet
    if( sheet.getName() === "Sheet5" ) {
      // Limit the following code to column B
      if( event.range.getColumn() === 2 ) {
        var range = sheet.getRange(2,2,sheet.getLastRow()-1,1);
        var checks = range.getValues();
        var valid = range.getDataValidations();
        for( var i=0; i<checks.length; i++ ) {
          if( valid[i][0].getCriteriaType() === SpreadsheetApp.DataValidationCriteria.CHECKBOX ) checks[i][0] = false;
        }
        // Assuming there are no formulas in this range
        range.setValues(checks);
        event.range.setValue(event.value);
        if( event.value === true ) {
          event.source.getSheetByName("Sheet6").getRange(2,2,1,1).setValue(event.range.getRow());
        }
      }
    }
  }
  catch(err) {
    SpreadsheetApp.getUi().alert(err);
  }
}
0 голосов
/ 18 сентября 2018

Такое поведение называется «радио-кнопкой».

Самый простой способ добиться этого - связать простой триггер редактирования:

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

Вышеприведенные намеки на некоторые предлагаемые методы, такие как использование вспомогательных функций для инкапсуляции и абстрагирования логики, что упрощает понимание функций.

Обзор:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...