Ситуация:
У меня есть следующий скрипт, который запускается, когда кто-то добавляет новые строки. Этот сценарий должен обнаруживать лист и применять проверку данных или действие только тогда, когда на определенном листе есть новые строки.
Проблема:
Этот скрипт запускает только проверку данных для листа с именем «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. Я думаю, может быть, у нас может быть только один сценарий при изменении, но когда я пытаюсь объединить оба сценария в один, чтобы запустить один сценарий и определить, какой лист был отредактирован, это не сработало.
var s = e.source.getActiveSheet()
. Потом иif( s.getName() == 'ISP1' ) {
... и т.д. Имеет смысл? - person Henrique G. Abreu   schedule 10.06.2014