Создайте зависимый раскрывающийся список для нескольких вкладок и нескольких строк - PullRequest
1 голос
/ 06 мая 2020

//CREATE PRIMARY DROPDOWN LIST
function createPrimaryDrpdwon() {
 /* SET FOLLOWING VARIABLES */

   var dataSS           = "Lookup";         //Name of the sheet that contain data for dropdown lists
   var dropSS           = "Jun 15";         //Name of the sheet which dropdown list to be created
   var primaryDataRange = "A4:A14";       //Data range for primary dropdown
   var primaryDropRange = "H3:H200";       //Range which primary dropdown set

  var primaryDropList  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(primaryDataRange).getValues();

  var primaryDropRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS).getRange(primaryDropRange);

  var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();

   primaryDropRange.setDataValidation(validationRule);
}

 
//CREATE SECONDARY DROPDOWN LIST
function onEdit(){
 /* SET FOLLOWING VARIABLES */
 var dataSS       = "Lookup";         //Name of the sheet that contain data for dropdown lists
 var dropSS       = "Jun 15";         //Name of the sheet which dropdown list to be created
 var allDataRange = "B5:C183";       //Data range for dropdown list (both primary and dependent)
 var primaryDDCol = 8;               //Column number of the primary drop down

  var dropSS_      = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS);
  var dropDData    = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(allDataRange).getValues();

  var activeCell   = dropSS_.getActiveCell();

  var activeColumn = activeCell.getColumn();

  var activeRow    = activeCell.getRow();

  

  if(activeColumn==primaryDDCol){

    var dep_Col         = primaryDDCol+1;

    var dep_Row         = activeRow;

    var depCell         = dropSS_.getRange(dep_Row, dep_Col);

    var primarySelected = activeCell.getValue();

    var validationRule  = SpreadsheetApp.newDataValidation().requireValueInList(getDependentList(dropDData,primarySelected)).build();

    

    depCell.setDataValidation(validationRule);

  }

}

 

function getDependentList(dropDData,primarySelected){

  var dependenList = [];

  var j = 0;

  if(dropDData != null){

    for(i=0; i<dropDData.length; i++){

      if(dropDData[i][0]==primarySelected){

        dependenList[j] = dropDData[i][1];

        j++;

      }

    }

  }

  return dependenList;

}

Я пытаюсь написать сценарий, который позволит использовать зависимые раскрывающиеся списки на нескольких листах в книге. Я уже создал сценарий для работы с одним листом, и он работает хорошо, но мне нужно изменить имя листа для каждого, например, если каждая вкладка была неделей месяца "5-4-20", "5-11 -20 дюймов, 5-18-20 дюймов и т. Д. c. но та же информация собирается на этой вкладке недели. Как я могу запустить сценарий для одного и того же зависимого раскрывающегося списка, чтобы он работал одинаково для каждой вкладки?

1 Ответ

1 голос
/ 07 мая 2020

Заменить определение stati c на var dropSS

Первая возможность: запустить сценарий на всех листах, кроме Lookup SpreadsheetApp.getActiveSpreadsheet().getSheets(); позволяет вы должны получить все доступные листы и запустить сценарий на всех из них.

Пример:

function iterateThroughAllSheets(){
  var dataSS           = "Lookup";             
  var primaryDataRange = "A4:A14";       
  var primaryDropRange = "H3:H200";
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (var i = 0; i < sheets.length; i++){
    var dropSS = sheets[i].getName();
    if (dropSS != dataSS){
      // continue the rest of your code as before
      var primaryDropList  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(primaryDataRange).getValues();     
      var primaryDropRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS).getRange(primaryDropRange);      
      var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();      
      primaryDropRange.setDataValidation(validationRule);
    }
  }
}

Вторая возможность: запустить скрипт только на самом новом листе

Предполагая, что ваши листы всегда будут добавляться к справа, самый новый лист будет иметь самый высокий индекс - соответствующий sheets.length.

Пример:

function runOntheLastSheet(){
  var dataSS           = "Lookup";             
  var primaryDataRange = "A4:A14";       
  var primaryDropRange = "H3:H200";
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var sheetNumber = sheets.length;
  var dropSS = sheets[sheetNumber-1].getName();  
  // continue the rest of your code as before
  var primaryDropList  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(primaryDataRange).getValues();     
  var primaryDropRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS).getRange(primaryDropRange);      
  var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();      
  primaryDropRange.setDataValidation(validationRule); 
}

Третья возможность: запустить скрипт на активном листе

Определите var dropSS = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() и запустите сценарий, когда выбранный вами лист активен.

Для всех трех возможностей измените function onEdit() соответственно.

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