【问题标题】:Running onEdit trigger when sheet is updated by Zapier当 Zapier 更新工作表时运行 onEdit 触发器
【发布时间】:2018-02-05 20:13:15
【问题描述】:

我有一个 Google 电子表格,我想在 Zapier 自动化每次添加新行时自动更新一个字段。

每次我通过添加行或对现有行进行编辑来手动测试脚本时,脚本都会按预期触发。但是,当 Zapier 向电子表格添加新行时,绝对没有任何反应。

知道为什么以及如何解决这个问题吗?

这是我正在尝试使用的脚本:

function onEdit(e) {
    var row = e.range.getRow();
    SpreadsheetApp.getActiveSheet().
        getRange(row, 10).setValue('My_New_Value');
}

【问题讨论】:

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


    【解决方案1】:

    我能够复制您在脚本中看到的行为。我相信当您在活动数据范围之外添加一行时,它不会触发编辑事件。为了捕捉这些事件,您还需要捕捉 chagne 事件。

    https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onchange

    function onOpen ()
    { 
      var sheet = SpreadsheetApp.getActive();
      ScriptApp.newTrigger("myFunctionx")
       .forSpreadsheet(sheet)
       .onChange()
       .create();
     }
    

    查看更改事件的文档,可以检测到插入了一行,但没有返回行号。

    https://developers.google.com/apps-script/guides/triggers/events#change

    function myFunctionx(e) {
        Logger.log("Change3");
        Logger.log(e.changeType);
    }
    

    您可以通过查看活动范围中的最后一行来找到插入的行。

    function myFunctionx(e) {
        Logger.log("Change3");
        Logger.log(e.changeType);
        Logger.log(SpreadsheetApp.getActiveRange().getLastRow());
    }
    

    如果您复制并粘贴到多个单元格中,更改可能会影响多行。您应该遍历范围内的所有行。

    function onEdit(e) {
        for(var i=e.range.getRow(); i<= e.range.getLastRow(); i++) {
            SpreadsheetApp.getActiveSheet().
                getRange(i, 10).setValue(e.range.getA1Notation());
        }
    }
    

    【讨论】:

    【解决方案2】:

    onChange 每次添加新行时都会触发(通过工作表 API)。

    function zapOnChange(e){
      if(e.changeType !== 'INSERT_ROW') return;//exit if the type of change is not a row insertion
      const insertedRow = SpreadsheetApp.getActive().getActiveRange();
      //do something with inserted row
    }
    

    重要提示:

    • Sheets API 异步运行。 onChange 是随机触发的,不按插入顺序触发。
    • 例如,两个同时插入可能发生在A2:F2A3:F3,但A2:F2 的insertRow 可能会在插入A3:F3 后触发onChange因此,在运行zapOnChange() 时,最后一行可能已经是A3:F3。因此,您不能使用.getLastRow() 来确定插入的行,而是使用.getActiveRange()
    • 有时会插入多行:.getActiveRange().getNumRows() 提供插入的行数。

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多