Автоматическое обновление выпадающего списка в листе Excel / Google на основе выбранных объектов - PullRequest
0 голосов
/ 23 января 2020

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

1. игроки
2. Транспортные средства

В линейку входит «строитель» , означающий, что каждая ячейка имеет раскрывающийся список, связанный с базой данных, и показывает доступные объекты.

Моя цель

Мне нужно автоматически обновить раскрывающийся список, как только я отправлю или выберу один объект из списка, чтобы в следующей ячейке больше не было этого объекта. как только я щелкаю по раскрывающемуся списку, также, если я удаляю объект из линейки, этот объект должен go вернуться в раскрывающийся список, поскольку он снова доступен.

Что я сделал?

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

столбец 1 : включает все доступные транспортные средства / игроков
столбец 2 : включает все назначенные транспортные средства / игроков
столбец 3 : генерирует выпадающий список, вычитая column1 из column2 по формуле = SORT(FILTER(E2:E,F2:F=""),1,true)

Проблема

, пока этот метод "работает" У меня есть некоторые проблемы с тем, как выпадающие автообновления Если я добавлю все доступное оборудование, а затем удалю и элемент, чтобы он мог быть доступен для другой ячейка / слот , выпадающий список не будет автоматически обновляться правильно, если я удалю "модуль 4 " раскрывающийся список покажет мне еще один доступный объект " unit 8 ".

Что я могу сделать, чтобы решить мою проблему?

Я добавляю ссылку на электронную таблицу, чтобы легче было понять мою проблему.

Спасибо, ребята.

электронная таблица googles

Ответы [ 2 ]

0 голосов
/ 29 января 2020

У меня есть способ решить вашу проблему, но для каждого выбора требуется столбец / строка «помощник», а также столбец «проверяющий».

Средство проверки проверит, используется ли элемент, и вспомогательный столбец для каждого будет основан на доступных оставшихся выборках.

При использовании вашего столбца 1 и столбца 2 вам просто потребуется дополнительный вспомогательный столбец для каждого выбора.

Below is an example:
A                   B   B   D   E                   Column 1 (K)   Column 2(L)
Chosen number 1     3   3   2   4                   Random items    
Chosen number 2     5   5   2   4                       1               3
Chosen number 3     1   1   2   4                       2            available
Chosen number 4         2   4                           3               1
Chosen number 5         2   4                           4            available
                                                        5               2


The formula in column C is '=B'
The formula in column D is '=transpose(filter($K$2:$K$6,$L$2:$L$6="available"))'
The data validation in column B is range C:F.
Column 1 includes all options
Column 2 includes all available options and the formula in column 2 is '=iferror(match(K2,$B$1:$B$5,0),"available")'

The purpose of column C is to allow for your data validation to be valid, even after entering in the selection.

0 голосов
/ 24 января 2020

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

function onEdit(e) {
  var ss = SpreadsheetApp.getActive();

  // Get the working Sheets
  var gameplan = ss.getSheetByName("gameplan");
  var vehicle = ss.getSheetByName("vehicle");
  var players = ss.getSheetByName("players");

  // Get current selected vehicles
  var _selectedVehicles = gameplan.getRange(2, 2, gameplan.getLastRow() - 1).getValues();
  var selectedVehicles = [];
  for(var i = 0; i < _selectedVehicles.length; i++){
    selectedVehicles.push(_selectedVehicles[i][0])
  }

  // Get current selected players
  var _selectedPlayers = gameplan.getRange(2, 1, gameplan.getLastRow() - 1).getValues();
  var selectedPlayers = [];
  for(var i = 0; i < _selectedPlayers.length; i++){
    selectedPlayers.push(_selectedPlayers[i][0])
  } 





  // Get active and unselected Vehicles
  var activeVehicles = [];
  var vehicleValues = vehicle.getRange(2, 1, vehicle.getLastRow() - 1, 2).getValues();

  for(var i =0; i < vehicleValues.length; i++){
    if(vehicleValues[i][0] == "ACTIVE" && selectedVehicles.indexOf(vehicleValues[i][1]) == -1){
      activeVehicles.push(vehicleValues[i][1])
    }
  }

  // Get active and unselected players
  var activePlayers = [];
  var playerValues = players.getRange(2, 1, players.getLastRow() - 1, 2).getValues();

  for(var i =0; i < playerValues.length; i++){
    if(playerValues[i][0] == "ACTIVE" && selectedPlayers.indexOf(playerValues[i][1]) == -1){
      activePlayers.push(playerValues[i][1])
    }
  }  



  // Insert data validation for vehicles
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(activeVehicles, true).build();
  gameplan.getRange("B2:B").setDataValidation(rule);

  // Insert data validation for Players
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(activePlayers, true).build();
  gameplan.getRange("A2:A").setDataValidation(rule);



}

Объяснение

Из вашего поста не ясно, если вы ранее использовали Apps Script . Поэтому, чтобы убедиться, что вы понимаете, что происходит (на случай, если вы захотите его изменить), я go рассмотрю свой код, объясняя все шаги и методы, которые я использовал.

В основном код состоит из 4 частей. ,

  • Получение рабочих листов
// Get the working Sheets
  var gameplan = ss.getSheetByName("gameplan");
  var vehicle = ss.getSheetByName("vehicle");
  var players = ss.getSheetByName("players");

Здесь в основном вызывается getSheetByName() в электронной таблице.

  • Получить уже выбранные значения
 // Get current selected vehicles
  var _selectedVehicles = gameplan.getRange(2, 2, gameplan.getLastRow() - 1).getValues();
  var selectedVehicles = [];
  for(var i = 0; i < _selectedVehicles.length; i++){
    selectedVehicles.push(_selectedVehicles[i][0])
  }

  // Get current selected players
  var _selectedPlayers = gameplan.getRange(2, 1, gameplan.getLastRow() - 1).getValues();
  var selectedPlayers = [];
  for(var i = 0; i < _selectedPlayers.length; i++){
    selectedPlayers.push(_selectedPlayers[i][0])
  } 

Так что здесь просто повторяется один и тот же код два раза. Внутри каждого листа вызывается метод getRange. Тогда, поскольку тип возвращаемого значения Object[][], нам нужно выполнить итерацию и получить каждое отдельное значение и push его в массив selectedVehicles (или Players).

  • Получение активных и невыбранных транспортных средств
 // Get active and unselected Vehicles
  var activeVehicles = [];
  var vehicleValues = vehicle.getRange(2, 1, vehicle.getLastRow() - 1, 2).getValues();

  for(var i =0; i < vehicleValues.length; i++){
    if(vehicleValues[i][0] == "ACTIVE" && selectedVehicles.indexOf(vehicleValues[i][1]) == -1){
      activeVehicles.push(vehicleValues[i][1])
    }
  }

Таким образом, здесь используется тот же метод getRange для получения значений, но в В этом случае мы получаем два столбца: ACTIVE/INACTIVE и id. После этого мы выполняем итерацию по массиву, чтобы убедиться, что эта строка имеет статус ACTIVE и идентификатор отсутствует в предыдущем selected массиве. Посмотрите на indexOf. И мы храним все значения, соответствующие этим условиям, в новом массиве.

  • Наконец, мы навязываем новую проверку данных
// Insert data validation for vehicles
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(activeVehicles, true).build();
  gameplan.getRange("B2:B").setDataValidation(rule);

Для этого последнего бита, который вам нужно использовать, это метод newDataValidation(), который создает a DataValidationBuilder объектов. В этом объекте у вас есть много методов, чтобы заставить данные вести себя так, как вы хотите, один из них requireValueInList, чтобы иметь выпадающий список с желаемыми значениями. В случае массив, который мы создали на предыдущем шаге. После использования build мы можем добавить это новое правило к range с помощью sedDataValidation.

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