如果有人添加新行,我该如何运行脚本

时间:2013-11-28 05:03:17

标签: events google-apps-script google-sheets

情况:

我有以下脚本,它在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添加新行时才执行此脚本?

最诚挚的问候,

1 个答案:

答案 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');
  }
}