Как автоматически добавлять / снимать флажки, если различные ячейки содержат значение? - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю с новой функцией флажка в листах Google.

на моем листе, я хотел бы иметь столбец контрольного списка, , но хотел бы, чтобы количество флажков соответствовало количеству строк, которые имеют значения на рабочем листе.
Например, скажем, столбец A содержит имена работников в компании (которые время от времени меняются), а столбец B содержит флажки. Я хотел бы, чтобы в строке был флажок, только если ячейка в столбце A содержит значение .

Вот пример:

https://docs.google.com/spreadsheets/d/1YKxGzThlMXzJRSGLON8Do4dzJq6HEldcpNTbDzH3Wsw/edit?usp=sharing

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

не уверен, поможет ли это или нет. Но один из способов добиться этого - использовать условное форматирование.

Пример. Если у меня есть записи, которые идут в A2: A, и я хочу показать флажки в B2: B ТОЛЬКО, если в соответствующей ячейке 'A' есть данные, я делаю следующее;

  1. выделите всю колонку из B2: B
  2. Вставка -> Флажки (это полностью опустит флажки)
  3. Выделите весь столбец флажков
  4. Формат -> Условное форматирование -> Пользовательская формула
  5. Введите следующую пользовательскую формулу; = ISBLANK ($ A2)
  6. Измените цвет фона и текста на один и тот же

После этого будет оцениваться столбец «А», и если он будет пустым, фон и цвет текста будут одинаковыми (например, белым), и все флажки «исчезнут». Когда вы вводите информацию в столбец «А», флажок «появится»

Это простой обходной путь решения сценариев, который работает в большинстве случаев.

0 голосов
/ 29 апреля 2018

НОВАЯ (БЫСТРЕЕ) ОБРАБОТКА ГРУППЫ ОТВЕТ:
Мой предыдущий ответ (см. Ниже) был написан на скорую руку, чтобы проиллюстрировать, как можно показать или скрыть новые флажки на основе содержимого другой ячейки. Чтобы ускорить процесс, следующий новый скрипт обрабатывает все в массив и не обновляет ячейки, пока все значения не будут вычислены. Это все еще не так быстро, как встроенный ответ на стороне клиента, но он будет обрабатывать сотни или тысячи имен в течение одной или двух секунд (поэтому он идеально подходит для возможности вставки сотен имен без срывов), и я сделал попробуйте использовать "лучшие практики" из этой страницы на developers.google.com .

Предположения:

Шаг 1:
Вы можете пропустить этот шаг, если вы скопировали пример листа Выделите все соответствующие ячейки в столбце флажков, щелкните их правой кнопкой мыши и выберите «Data Validation» в меню. Во всплывающем диалоговом окне обязательно выберите «Checkbox» в разделе «Критерии» и нажмите «Save».

Шаг 2:
Если вы скопировали лист с примером, этот скрипт уже должен быть привязан к листу, в противном случае: Вставьте и сохраните следующий скрипт в ваш редактор скриптов "Tools > Script Editor." Примечание. Возможно, вам придется одобрить выполнение сценария в соответствии с разрешениями безопасности Google.

  function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("New Checkboxes"); //change this to the name of your sheet
  ui = SpreadsheetApp.getUi();

  //PICK ONE & comment out the other one:
  //var names = ss.getRange("names");//Use this if you are naming the range
  var names = ss.getRange("B3:B");//Use this if you are naming the ranges

  var namesValues = names.getValues(); //Get array of all the names

  //PICK ONE & comment out the other one:
  //var checkboxes = ss.getRange("checkboxes"); //Use this if you are naming the range
  var checkboxes = ss.getRange("A3:A"); //Use this if you want to hard-code your range

  var cbRows = checkboxes.getHeight(); //Get # of rows in the ranges
  var cbValues = checkboxes.getValues(); //Get array of all the checkbox column cell values
  //Logger.log(cbValues);

  var newCBValues = new Array(cbRows); //Create an array to store all the new checkboxes values before we edit the actual spreadsheet

  for (var row = 0; row < cbRows; row++) {
    newCBValues[row] = new Array(0); // Make the array 2 dimensional (even though it only has 1 column, it must be 2D).
    if (namesValues[row] == "" || namesValues[row] == " ") { //If the name cell of this row is empty or blank then...
      newCBValues[row][0] = " "; //Set the value to one space (which will make the cell NOT true or false, and thus NOT display a checkbox).
      //Logger.log("newCBValues[" + row + "][0]: " + newCBValues[row][0]);
    }else{ //otherwise, if the name cell isn't blank...
      if (cbValues[row][0] === true) {
        newCBValues[row][0] = true; //Keep the checkbox checked if it's already checked
      }else{ //If the name cell isn't blank, and it's not true...
        newCBValues[row][0] = false; //Then Keep it or set it to False (an empty checkbox):
      }   
    }
  }
  checkboxes.setValues(newCBValues); // now that we have a completed array of our new checkbox values, let's edit the sheet with them!

}

Шаг 3:
Вернитесь в электронную таблицу, вставьте, отредактируйте, удалите или введите несколько имен в столбце имен, чтобы увидеть изменения.

Вот и все!


СТАРЫЙ (МЕДЛЕННЫЙ) ОТВЕТ:
Если вы не возражаете добавить скрипт на свой лист, я выяснил, как использовать «новые» флажки, но отображать их только в том случае, если у вас есть соответствующее Имя в столбце имени. Для моего сценария я сделал именованные диапазоны столбца флажка («флажки») и столбца имен («имена»). Вы также должны создать диапазоны с одинаковыми именами, если вы хотите использовать этот сценарий (или просто жестко закодировать диапазоны в сценарии), что не является хорошим способом, если вы собираетесь часто менять размер диапазона, добавляя и удаление имен. Зайдите в меню Data > Named ranges...

В любом случае, я создал обновленный пример, который вы можете увидеть на этой странице: https://docs.google.com/spreadsheets/d/1MSnQ1_6Sy018lAoehzQ55QVrfJldoKS5EnWjOxYWxIs/edit#gid=1464332245

Вам нужно будет сделать копию этой книги, а затем дать себе разрешение на использование приведенного ниже сценария, как только вы добавите его в свою книгу из меню Tools > Script Editor:

function onEdit() {
  var app = SpreadsheetApp;
  var activeSheet = app.getActiveSpreadsheet().getActiveSheet();

  var names = activeSheet.getRange("names"); //Hard Code the Range here if you don't want to use named ranges (example: "B2:B")
  var checkboxes = activeSheet.getRange("checkboxes"); //Hard Code the Range here if you don't want to use named ranges (example: "A2:A")

  var namesFirstRow = names.getRow();
  var namesLength = names.getLastRow();
  var namesCol = names.getColumn();
  var checkboxesCol = checkboxes.getColumn();

  for (var i=0; i<namesLength; i++) {
    var checkCell = activeSheet.getRange(namesFirstRow+i,checkboxesCol);
    var nameCell = activeSheet.getRange(namesFirstRow+i,namesCol);
    Logger.log(checkCell.getA1Notation() + "  " + nameCell.getA1Notation());

    if (nameCell == "" || nameCell.isBlank()) { //If There is no name in the name column (it's empty or just blank)
      checkCell.setValue(" "); // Make the checkbox column blank so no checkbox appears 
    }else{
      if (checkCell.getValue() === true || checkCell.getValue() === false) {
        //Do nothing since a value is already set
        //app.getUi().alert(checkCell.getA1Notation() + " is " + checkCell.getValue());
      }else{      
        checkCell.setValue("FALSE"); //Place an empty checkbox (FALSE) if a name value has not been set in the name column
      }
    }
  } 

}

Это будет работать только в том случае, если вы убедитесь, что для диапазона «флажки» уже выбрана проверка данных в соответствии с критериями «флажка» ...

Инструкции: для столбца, в котором вам нужны флажки: выделите весь диапазон ячеек в столбце (кроме заголовка), щелкните правой кнопкой мыши выбранный столбец, выберите «Проверка данных», а затем выберите «Флажок» для критерии. Тогда все ваши ячейки «ИСТИНА» и «ЛОЖЬ» будут отмечены или сняты. Кроме того, чтобы интегрировать все именованные диапазоны, которые находятся внутри сценария, убедитесь, что этот диапазон столбца флажка назван «флажки» (согласно инструкциям выше).

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