【问题标题】:How can I run a script only when someone adds new rows仅当有人添加新行时如何运行脚本
【发布时间】:2023-04-02 04:00:02
【问题描述】:

情况:

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

最好的问候,

【问题讨论】:

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


    【解决方案1】:

    有一个特殊的触发器来检测这种变化: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');
      }
    }
    

    【讨论】:

    • 您是否考虑过在onChange() 事件的参数changeType 中使用INSERT_ROW
    • 你说得对,没想到...随意发布另一个答案,你的想法更好,因为它使用了 GAS 直接方法。
    • 您好,我正在尝试将脚本集成到我的功能中,当有人在工作表中添加或插入新行但没有工作...我不知道我需要将我的脚本..仍在工作..
    • 您必须在脚本编辑器中单独插入函数(即 2 个单独的函数),然后只运行第一个函数来创建触发器。之后它将是全自动的。如果你想让它采取一些行动,请调用第三个函数(你可能已经拥有的那个)我把“做某事”
    • Serge, Now is working... OnChange() 值存在于 Resurce > Proyect Trigger... 注意:当我使用创建触发器的部分时,系统创建它 10 次相同触发
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2019-06-12
    • 2020-07-25
    • 2021-11-24
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多