状況:
誰かが新しい行を追加したときに実行される次のスクリプトがあります。このスクリプトは、シートを検出し、特定のシートに新しい行がある場合にのみ datavalidation またはアクションを適用する必要があります。
問題:
このスクリプトは、「ISP1」というシートにデータ検証を適用するだけで実行され、シート「ISP2」に新しい行を追加すると、シート「ISP1」にデータ検証が再適用されます。
このスクリプトの一部はすべてのシートに対して実行する必要がありますが、一部は特定のシートに新しい行がある場合にのみ実行する必要があります。
AddNew Rows への関数: リンク
脚本:
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');
}
}
このスクリプトは、誰かが特定のシートに新しい行を追加した場合にのみ、実行してデータ検証を適用する必要があります。
-Column B&C アクティブ シートに対して実行する必要があります。
-列 D&I 誰かが特定のシート ISP1 または ISP2 に新しい行を追加した場合にのみ実行する必要があります
テストされた他のスクリプト:
どちらのスクリプトも onchange で実行されます。
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 に行を追加すると、実行されるスクリプトは ISP1 の Data_V ですが、ISP2 にニュース行を追加すると、スクリプト Data_V2 は実行されませんでしたが、Data_V が再度実行されます。変更時にスクリプトを 1 つしか持てないのではないかと思いますが、両方のスクリプトを 1 つにマージして 1 つのスクリプトを実行し、編集されたシートを検出しようとすると、機能しませんでした。