Сценарий Google: как применить правило проверки данных для определенного листа, когда кто-то добавляет новые строки

Ситуация:

У меня есть следующий скрипт, который запускается, когда кто-то добавляет новые строки. Этот сценарий должен обнаруживать лист и применять проверку данных или действие только тогда, когда на определенном листе есть новые строки.

Проблема:

Этот скрипт запускает только проверку данных для листа с именем «ISP1», когда я добавляю новые строки на лист «ISP2», повторно применяю проверку данных на листе «ISP1».

Некоторая часть этого скрипта должна выполняться для каждого листа, а часть — только тогда, когда на конкретном листе появляются новые строки.

Функция добавления новых строк: ссылка

Скрипт:

function initializeTrigger(){ // run this only once to create a trigger if necessary
  var sheet = SpreadsheetApp.getActive();
 ScriptApp.newTrigger("dataValidation")
   .forSpreadsheet(sheet)
   .onChange()
   .create();
}

function dataValidation(e){
  Logger.log(e.changeType);
  if(e.changeType=='INSERT_ROW'){
    // do Something

    //DataValidation - In Column B
    var cell1 = SpreadsheetApp.getActiveSheet().getRange('B3:B');
    var rule1 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Open', 'Closed']).build();
      cell1.setDataValidation(rule1);  

            //DataValidation - In Column C
    var cell2 = SpreadsheetApp.getActiveSheet().getRange('C3:C');
    var rule2 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(true).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Y','N']).build();
      cell2.setDataValidation(rule2);


      //DataValidation - In Column D & I for ISP1
    var ss = SpreadsheetApp.getActiveSheet();
    if(ss.getName() == "ISP1"){
    var cell3 = ss.getRange('D3:D');
    var rule3 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['DATCO', 'XFR MDA2', 'SCH CALL']).build();
      cell3.setDataValidation(rule3);

    var cell4 = ss.getRange('I3:I');
    var rule4 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['1:00:00', '2:00:00', '12:00:00', '24:00:00']).build();
      cell4.setDataValidation(rule4);

      }

      //DataValidation - In Column D & I for ISP2
    var ss = SpreadsheetApp.getActiveSheet();
    if(ss.getName() == "ISP2"){
    var cell5 = ss.getRange('D3:D');
    var rule5 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['NOC', 'CUS', 'DATCO', 'COMER']).build();
      cell5.setDataValidation(rule5);

    var cell6 = ss.getRange('I3:I');
    var rule6 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['0:15:00', '0:20:00', '1:00:00']).build();
      cell6.setDataValidation(rule6);
      }

    Browser.msgBox('New row(s) added, Data Validation Completed');
  }
}

Этот сценарий следует запускать и применять проверку данных только тогда, когда кто-то добавляет новые строки в указанные листы.
-Столбец B и C следует запускать для активного листа.
-Столбец D&I следует запускать только тогда, когда кто-то добавляет новые строки для указанный лист ISP1 или ISP2


ДРУГОЙ ПРОВЕРЕННЫЙ СЦЕНАРИЙ:

Оба скрипта запускаются при изменении.

function Data_V(){

  var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  //var ss = event.source.getActiveSheet();
  if (s.getName() == "ISP1") {
  var numRows = s.getMaxRows();
  if(ScriptProperties.getProperty('numberOfRows')){
    var nRows = Number(ScriptProperties.getProperty('numberOfRows'));
    if(nRows<numRows){

      //DataValidation - In Column B
    var cell1 = s.getRange('B3:B');
    var rule1 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Open', 'Closed']).build();
      cell1.setDataValidation(rule1);

            //DataValidation - In Column C
    var cell2 = s.getRange('C3:C');
    var rule2 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(true).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Y','N']).build();
      cell2.setDataValidation(rule2);


      //DataValidation - In Column D
    var cell3 = s.getRange('D3:D');
    var rule3 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['DATCO', 'XFR MDA2', 'SCH CALL']).build();
      cell3.setDataValidation(rule3);

      //DataValidation - In Column I
    var cell4 = s.getRange('I3:I');
    var rule4 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['1:00:00', '2:00:00', '12:00:00', '24:00:00']).build();
      cell4.setDataValidation(rule4);

      ScriptProperties.setProperty('numberOfRows',numRows);// update value with current value
    }
    Browser.msgBox('New row(s) added, Data Validation Completed ISP1');
  }
  ScriptProperties.setProperty('numberOfRows',numRows);// create a start value with current value of simply update if the trigger was called for another reason
 }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function Data_V2(){

  var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  //var ss = event.source.getActiveSheet();
  if (s.getName() == "ISP2") {
  var numRows = s.getMaxRows();
  if(ScriptProperties.getProperty('numberOfRows')){
    var nRows = Number(ScriptProperties.getProperty('numberOfRows'));
    if(nRows<numRows){

      //DataValidation - In Column B
    var cell5 = s.getRange('B3:B');
    var rule5 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Open', 'Closed']).build();
      cell5.setDataValidation(rule5);

            //DataValidation - In Column C
    var cell6 = s.getRange('C3:C');
    var rule6 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(true).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['Y','N']).build();
      cell6.setDataValidation(rule6);


      //DataValidation - In Column D
    var cell7 = s.getRange('D3:D');
    var rule7 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    .requireValueInList(['NOC', 'CUS', 'DATCO', 'COMER']).build();
      cell7.setDataValidation(rule7);

      //DataValidation - In Column I
    var cell8 = s.getRange('I3:I');
    var rule8 = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false).setHelpText("Seleccione Solo los Valores Indicados")
    ..requireValueInList(['0:15:00', '0:20:00', '1:00:00']).build();
      cell8.setDataValidation(rule8);

      //CopyFormat - In Column H
    //var source = s.getRange('H1');
    //var destination = s.getRange('H3:H');
    //source.copyTo(destination, {formatOnly:true});

      ScriptProperties.setProperty('numberOfRows',numRows);// update value with current value
    }
    Browser.msgBox('New row(s) added, Data Validation Completed ISP2');
  }
  ScriptProperties.setProperty('numberOfRows',numRows);// create a start value with current value of simply update if the trigger was called for another reason
 }
}

Оба скрипта запускают Onchange. Когда я добавляю строки в ISP1, выполняется сценарий Data_V для ISP1, но когда я добавляю строки новостей в ISP2, сценарий Data_V2 не запускается, но снова запускается Data_V. Я думаю, может быть, у нас может быть только один сценарий при изменении, но когда я пытаюсь объединить оба сценария в один, чтобы запустить один сценарий и определить, какой лист был отредактирован, это не сработало.


person LAD Service Desk    schedule 10.06.2014    source источник
comment
Просто возьмите лист в начале var s = e.source.getActiveSheet(). Потом и if( s.getName() == 'ISP1' ) {... и т.д. Имеет смысл?   -  person Henrique G. Abreu    schedule 10.06.2014
comment
Привет, все еще не работает. Пример: -- Я добавляю новые строки в таблицу ISP1, скрипт применяет все проверки данных, кроме части ISP2. Когда я добавляю новые строки на листе ISP2, сценарий снова применяет проверку всех данных на листе ISP1, а не выполняет проверку данных на листе ISP2, а также не реализует конкретную часть для ISP2. Когда я добавляю новые строки в ISP2, появляется окно, указывающее, что скрипт обнаружил новые строки, но не выполняет проверку данных на том листе, где я добавляю строки.   -  person LAD Service Desk    schedule 10.06.2014
comment
Я думаю, проблема здесь в том, что опция обнаружения изменений в электронной таблице определяет, где изменения, я разделяю сценарий на два сценария, один для ISP1, а другой для ISP2. Когда я добавляю новые строки в ISP1, запускаю сценарий ISP2, когда я добавляю новые строки в ISP2. сценарий в ISP2, но в любое время применить проверку данных.   -  person LAD Service Desk    schedule 10.06.2014