Скрипт Google Apps для 2 Dynami c Выпадающие списки из 2 отдельных таблиц - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий скрипт Google Apps onEdit, который просматривает таблицу в столбцах A: D на моем листе «Списки раскрывающегося списка». Это работает для раскрывающегося списка в столбце C листа «Обучение HISOP», когда в раскрывающемся списке в столбце A того же листа выбрана ветвь:

//Dynamic Dropdown for HISOP Training
{
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var tablists = 'Dropdown Lists';
    var tabValidation = 'HISOP Training';
    var ss = spreadsheet.getActiveSheet();
    var datass = spreadsheet.getSheetByName(tablists);
    var activeCell = ss.getActiveCell();
    if (
      activeCell.getColumn() == 1 &&
      activeCell.getRow() > 1 &&
      ss.getSheetName() == tabValidation
    ) {
      activeCell
        .offset(0, 2)
        .clearContent()
        .clearDataValidations();
      var base = datass.getRange(2, 1, 1, 5).getValues();
      var baseIndex = base[0].indexOf(activeCell.getValue()) + 1;
      Logger.log(baseIndex);
      if (baseIndex != 0) {
        //Dynamic dropdown for 'Employee'
        var validationRange = datass.getRange(6, baseIndex, 150);
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 2).setDataValidation(validationRule);
         }
    }
    if (ss.getSheetName() == tabValidation) {
      var lock = LockService.getScriptLock();
      if (lock.tryLock(0)) {
        autoid_(ss);
        lock.releaseLock();
      }
    }
    
  } 

Теперь я также хочу, чтобы раскрывающийся список в столбце D листа «Обучение HISOP» выбирал из диапазона BO: BR листа «Выпадающий список», когда ветвь в Столбец A листа «Обучение HISOP» выбран, но я не знаю, как написать для этого сценарий.

Это изображение моего листа «Обучение HISOP»:

enter image description here

This is a link to a sanitised version of my spreadsheet:

Таблица

Я был бы очень признателен за помощь с этим.

Окончательный ответ:

function myOnEdit(e){
  var sheet = SpreadsheetApp.getActive().getSheetByName('HISOP Training');
  var sheet2 = SpreadsheetApp.getActive().getSheetByName('Dropdown Lists');
  var value = e.value;
  var col = e.range.getColumn();
  var row = e.range.getRow();
  
  if(col==1 && e.range.getValue()=='New York' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    // 2 is for dropdown D
    var dropdownData = sheet2.getRange("A6:A150").getValues().flat();
    var dropdownData2 = sheet2.getRange("BO4:BO150").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+3).clearDataValidations().clearContent();
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule2);
  }

  if(col==1 && e.range.getValue()=='London' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet2.getRange("B6:B150").getValues().flat();
    var dropdownData2 = sheet2.getRange("BP4:BP150").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+3).clearDataValidations().clearContent();
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule2);
  }
  
  if(col==1 && e.range.getValue()=='Paris' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet2.getRange("C6:C150").getValues().flat();
    var dropdownData2 = sheet2.getRange("BQ4:BQ150").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+3).clearDataValidations().clearContent();    
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule2);
  }
  
  if(col==1 && e.range.getValue()=='Tokyo' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet2.getRange("D6:D150").getValues().flat();
    var dropdownData2 = sheet2.getRange("BR4:BR150").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+3).clearDataValidations().clearContent();    
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule2);
  }
  }

1 Ответ

1 голос
/ 22 июня 2020

Решение

Исходя из моей интерпретации вашего вопроса, вы хотите иметь возможность выбирать только выпадающие значения в столбцах C и D, только если в столбце выбрано конкретное значение c A. Чтобы предоставить решение этого вопроса вместо того, чтобы предоставлять конкретный c ответ на ваш случай с листами, я предоставил общее решение, абстрагирующее вопрос, чтобы другие пользователи с похожими вопросами могли легко интерполировать ответ и использовать его. Вам просто нужно будет адаптировать этот ответ к вашему случаю.

Для этого я установил условие для функции onEdit, чтобы улавливать изменения в листе и выполняется ли это условие (в в вашем случае, если выбрана ветка в столбце A), вы сможете выбрать из раскрывающихся списков C и D. Следующий код, решающий проблему, содержит комментарии, не требующие пояснений:

function onEdit(e) {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');

  // Get the value of the cell changed
  var value = e.value;
  
  // Get col and row of the cell changed to make sure it was in col A
  var col = e.range.getColumn();
  var row = e.range.getRow();
  
  // If col A. Here you could also add another condition to the if for instance if the value on col A
  // is equal to whatever value you want to select in the dropdown in A, then execute this
  if(col==1 && e.range.getValue()=='VALUE 1'){
  // Get the data for the range of the dropdown. Here you choose if you want to insert dropdowns for C and D
    var dropdownData = sheet.getRange("C1:C5").getValues().flat();
    
    // Get the cell we will let the dropdown go (clear all previous content and data validations)
    // In your case these you be the columns D and 
    var allowDropdown = sheet.getRange(row, col+1).clearDataValidations().clearContent();
    
    // Create rules for the respective dropdowns of C and D (in this case is just one rule because I am 
    // just using a single dropdown to exemplify how to do this
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    
    // Set the data validation
    allowDropdown.setDataValidation(rule);
  }
  
  // SECOND RANGE. REPEAT FOR THE REST IF WE HAVE MORE SUB RANGES
  if(col==1 && e.range.getValue()=='VALUE 2'){
    var dropdownData = sheet.getRange("D1:D5").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+1).clearDataValidations().clearContent();

    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    allowDropdown.setDataValidation(rule);
  }
}

А вот как этот пример будет выглядеть на листе:

image

function onEdit(e) {
  var sheet = SpreadsheetApp.getActive().getSheetByName('HISOP Training');
  var sheet2 = SpreadsheetApp.getActive().getSheetByName('Dropdown Lists');
  var value = e.value;
  
  var col = e.range.getColumn();
  var row = e.range.getRow();
  
  if(col==1 && e.range.getValue()=='New York' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    // 2 is for dropdown C
    var dropdownData = sheet2.getRange("BO4:BO49").getValues().flat();
    var dropdownData2 = sheet2.getRange("Z2:Z4").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+3).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule);
  }

  if(col==1 && e.range.getValue()=='London' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet.getRange("BP4:BP45").getValues().flat();
    var dropdownData2 = sheet2.getRange("AA2:AA3").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+1).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+2).clearDataValidations().clearContent();
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule);
  }
  
  if(col==1 && e.range.getValue()=='Paris' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet.getRange("BQ4:BQ43").getValues().flat();
    var dropdownData2 = sheet2.getRange("AB2:AB4").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+1).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+2).clearDataValidations().clearContent();    
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule);
  }
  
  if(col==1 && e.range.getValue()=='Tokyo' && row>2 && e.range.getSheet().getName()=='HISOP Training'){
    var dropdownData = sheet.getRange("BR4:BR33").getValues().flat();
    var dropdownData2 = sheet2.getRange("AC2:AC3").getValues().flat();
    var allowDropdown = sheet.getRange(row, col+1).clearDataValidations().clearContent();
    var allowDropdown2 = sheet.getRange(row, col+2).clearDataValidations().clearContent();    
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData, true).build();
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInList(dropdownData2, true).build();
    allowDropdown.setDataValidation(rule);
    allowDropdown2.setDataValidation(rule);
  }
}

Надеюсь, это вам помогло. Дайте мне знать, если вам еще что-нибудь понадобится или вы чего-то не поняли. :)

...