将数据验证的sourceRange设置为值数组

时间:2019-02-11 07:39:37

标签: validation google-apps-script google-sheets

我正在创建一个社交媒体推广跟踪器。我想创建一个联系人姓名的下拉列表。问题是我在两个不同的工作表上有两个名称来源。

我编写了一个脚本,该脚本从两个不同的来源提取名称并将它们组合到一个数组中。

我希望将源范围设置为该数组。

这是我的代码:

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)
  }
}

当我在A栏的社交媒体外展中输入日期时,在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相对较新,并且不确定数据验证构建器的所有内部功能。

0 个答案:

没有答案