Установите для sourceRange проверки данных массив значений - PullRequest
0 голосов
/ 11 февраля 2019

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

Я написал скрипт, который извлекает имена из двух разных источников и объединяет их в один массив.

Я надеялся установить диапазон источника в качестве этого массива.

Вот мой код:

function setDataValid_(range, sourceRange) {
  var rule = SpreadsheetApp.newDataValidation()
    .requireValueInRange(sourceRange, true)
    .build();
  range.setDataValidation(rule);
}

function onEdit() {
  var auditionsSheet =  SpreadsheetApp.getActiveSpreadsheet();
  var castingDirectorsTab = auditionsSheet.getSheetByName("Casting Directors");
  var contactsTab = auditionsSheet.getSheetByName("Contacts");
  var socialMediaOutreachTab = auditionsSheet.getSheetByName("Social Media Outreach");
  var lastRowCD = castingDirectorsTab.getLastRow();
  var lastRowContacts = contactsTab.getLastRow();  
  var activeCell = socialMediaOutreachTab.getActiveCell();
  var activeColumn = activeCell.getColumn();

  // get data
  var castingDirectorNameData = castingDirectorsTab.getRange(2, 1, lastRowCD, 1).getValues();
  var contactNameData = contactsTab.getRange(2, 1, lastRowContacts, 1).getValues();  

  //get name data to a single arrays
  var castingDirectorName = [];
  castingDirectorNameData.forEach(function(yr) {
    castingDirectorName.push(yr[0]);
  });

  var contactName = [];
  contactNameData.forEach(function(yr) {
     contactName.push(yr[0]);
  });

  // get rid of the empty bits in the arrays
  for (var x = castingDirectorName.length-1; x > 0; x--)  {
    if ( castingDirectorName[x][0] === undefined ) {
        castingDirectorName.splice(  x, 1 )
    }
  }

  for (var x = contactName.length-1; x > 0; x--)  {
    if ( contactName[x][0] === undefined ) {
      contactName.splice(  x, 1 )
    }
  }

  //combine two data sources for data validation
  var combinedNames = [];
  combinedNames.push(castingDirectorName + contactName);

  Logger.log (combinedNames);
  Logger.log( typeof combinedNames);

  // data validation set up and build
  if (activeColumn == 1 && auditionsSheet.getName() == "Social Media Outreach") {
    var range = auditionsSheet.getRange(activeCell.getRow(), activeColumn +1);
    var sourceRange = combinedNames;
    setDataValid_(range, sourceRange)
  }
}

Когда я вписываю дату в Col A в социальных сетях, в Col 2. ничего не происходит.

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

function setDataValid_(range, sourceRange) {
  var rule = SpreadsheetApp.newDataValidation()
    .requireValueInRange(sourceRange, true)
    .build();
   range.setDataValidation(rule);
}

function onEdit() {
  var aSheet = SpreadsheetApp.getActiveSheet();
  var aCell = aSheet.getActiveCell();
  var aColumn = aCell.getColumn();

  // data validation for Auditions Tab Projet Type to Project Details 
  if (aColumn == 9 && aSheet.getName() == 'Auditions') {
    var range = aSheet.getRange(aCell.getRow(), aColumn + 1);
    var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('RefTables!' + aCell.getValue())
    setDataValid_(range, sourceRange)
  }
}

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

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

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

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