Проверка и раскрытие данных скриптов Google Apps - PullRequest
0 голосов
/ 25 февраля 2020

Я создал несколько листов, которые должны использовать отделы. (Например, Dept 1, Dept 2, Dept 3.) Все эти отделы имеют свой собственный контент с указанными c элементами на втором листе электронной таблицы. (Например, Dept 1 = A2: F35, Dept 2 = A38: F60, Dept 3 = A63: F89)

Раскрывающийся список (Раскрывающийся список 1 ( ячейка H60 )) используется для выбора отдел.

Как только отдел выбран, мне нужно изменить данные второго раскрывающегося списка ( ячейка B67 ), чтобы отображать только информацию о выбранном отделе. Я использую несколько функций V-LOOKUP

Sheet Snippet

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

Пожалуйста, дайте мне знать, если кто-нибудь может помочь.

Вот ссылка на лист

1 Ответ

0 голосов
/ 27 февраля 2020
  • У вас есть выпадающий список № 1 (в данном примере - H5) с названиями различных отделов.
  • У вас есть выпадающий список № 2 (в столбце B) начиная со строки 12) с элементами, принадлежащими одному из отделов (информация о том, к каким элементам принадлежат какие отделы, содержится в листе Content).
  • Вы хотите изменить элементы, выбранные в каждом раскрывающемся списке # 2, когда в раскрывающемся списке # 1 выбран другой параметр.

Если все верно, вы можете использовать следующий триггер onEdit (проверьте встроенные комментарии):

function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var column = range.getColumn();
  var row = range.getRow();
  var dropdown1 = range.getValue();
  var options = range.getDataValidation().getCriteriaValues()[0];
  var depts = {}; // Object with key-values like: { departmentName: [itemNames] }
  var currentProp = "";
  if (sheet.getName() === "Main" && column === 8 && row === 5) { // Check that edited cell is dropdown #1
    var contentSheet = e.source.getSheetByName("Content");
    var content = contentSheet.getRange(1, 1, contentSheet.getLastRow()).getValues().map(function(value) {
      return value[0]; // Get departments and items from "Content"
    });
    // Create properties for each department / items in "Content"
    for (var i = 0; i < content.length; i++) {
      if(options.indexOf(content[i]) !== -1) {
        depts[content[i]] = [];
        currentProp = content[i];
      } else {
        depts[currentProp].push(content[i])
      }
    }
    var firstRow = 12;
    var column = 2;
    var numRows = sheet.getLastRow() - firstRow + 1;
    for (var j = 0; j < numRows; j++) { // Iterate through each dropdown #2
      var dropdownRange = sheet.getRange(firstRow + j, column);
      var dropdownValues = dropdownRange.getDataValidation().getCriteriaValues()[0];
      for (var k = 0; k < dropdownValues.length; k++) { // Find element from dropdown that belongs to selected department
        if (depts[dropdown1].indexOf(dropdownValues[k]) !== -1) {
          dropdownRange.setValue(dropdownValues[k]); // Change dropdown value
          break; // End loop
        }
      }
    }
  }
}

Примечание:

  • Я предполагаю, что раскрывающиеся списки уже заполнены, и единственное, что вы хотите сделать, - это изменить выбранное значение из каждого раскрывающегося списка № 2, если значение из раскрывающегося списка № 1 равно отредактировано.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...