我有以下脚本,它在OnEdit中运行,但我希望将此脚本调整为仅在有人向表单添加新行时运行。
function DataValidation2(e)
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
if (s.getName() == "Sheet1"){
var cell = s.getRange('C3:C');
var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(false).requireValueInList(['0:15:00', '0:20:00']).build();
cell.setDataValidation(rule);
}
}
如果可能的话,只有当有人使用工作表末尾的boton add include添加新行时才执行此脚本?
最诚挚的问候,
答案 0 :(得分:2)
有一个特殊触发器可以检测到这些变化:onChange
您甚至可以按照文档中的描述以编程方式创建它:
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("myFunction")
.forSpreadsheet(sheet)
.onChange()
.create();
然后是一个像这样的函数,它会在每次看到行数的变化上被调用,如果它发生了变化就会做一些事情......如果变化是其他的话,什么都不做。
您可以添加更多条件来处理其他情况,例如,如何删除已删除的ID行
function myFunction(){
var numRows = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getMaxRows();
if(ScriptProperties.getProperty('numberOfRows')){
var nRows = Number(ScriptProperties.getProperty('numberOfRows'));
if(nRows<numRows){
//do something because rows have been added in this sheet
ScriptProperties.setProperty('numberOfRows',numRows);// update value with current value
}
}
ScriptProperties.setProperty('numberOfRows',numRows);// create a start value with current value of simply update if the trigger was called for another reason
}
按照Wchiquito的评论编辑
这是另一个(更简单的)版本也很好用:
function initializeTrigger(){ // run this only once to create a trigger if necessary
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("myFunction")
.forSpreadsheet(sheet)
.onChange()
.create();
}
function myFunction(e){
Logger.log(e.changeType);
if(e.changeType=='INSERT_ROW'){
// do Something
Browser.msgBox('New row(s) added');
}
}