Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

google apps script - Running onEdit trigger when sheet is updated by Zapier

I have a Google spreadsheet where I would like to automatically update one field every time a new row is added by a Zapier automation.

Every time I test the script manually by adding a row or making edits on existing rows, the script fires as expected. However, when Zapier adds a new row to the spreadsheet absolutely nothing happens.

Any idea why and how I can remedy this problem?

This the script which I am trying to use:

function onEdit(e) {
    var row = e.range.getRow();
    SpreadsheetApp.getActiveSheet().
        getRange(row, 10).setValue('My_New_Value');
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I was able to replicate the behavior you are seeing in your script. I believe that when you add a row outside of the active data range, it does not trigger an edit event. In order to catch those events, you will also need to catch chagne events.

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();
 }

Looking at the documentation for a change event, you can detect that a row was inserted, but the row number is not returned.

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

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

You might be able to find the row that was inserted by looking at the last row in the active range.

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

It is possible for a change to affect more than one row if you copy and paste into multiple cells. You should loop through all of the rows in your range.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...