Google Apps脚本会双重删除电子表格中的行

Jac*_*ack 0 javascript google-sheets google-apps-script

function onEdit() {
var openRequests = SpreadsheetApp.getActive().getSheetByName('Open Requests');
var lastRowOpen = openRequests.getLastRow();

var closedRequests = SpreadsheetApp.getActive().getSheetByName('Closed Requests');
var lastRowClose = closedRequests.getLastRow();

var closed = openRequests.getRange(2,8,lastRowOpen,1).getValues();

for (var i = 0; i < lastRowOpen; i++)
{
    if (closed[i][0].toString() == 'Yes')
    {
        var line = i+2;
        if (closedRequests.getLastRow() == 1)
        {
            openRequests.getRange(line,1,1,9).copyTo(closedRequests.getRange(2,1,1,9));
            closedRequests.getRange(2,9,1,1).setValue(new Date());
            openRequests.deleteRow(line);
        }
        else
        {
            openRequests.getRange(line,1,1,9).copyTo(closedRequests.getRange(lastRowClose+1,1,1,9));
            closedRequests.getRange(lastRowClose+1,9,1,1).setValue(new Date());
            openRequests.deleteRow(line);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我已经设置了一个触发器来运行onEdit.它的作用是检查一个被调用的列Closed以查看它是否显示Yes.该Closed列有一个数据验证下拉菜单,其中包含值Yes.

因此,当我单击下拉菜单并选择时Yes,它应该将整行复制到另一个名为的工作表,Closed Requests然后从电子表格中删除该行Open Requests.

我遇到的问题是,大约50%的时间,它删除我选择的行Yes,但它也删除它下面的行(大约50%的时间发生这种情况,只有一些时间,第二个删除的行显示在Closed Requests其他时候,整行只是永远消失,除非我撤消).

据我所知,该deleteRow()函数删除整行并将其下方的所有行向上移动以填充空白.因此,要删除的行下方的行会向上移动到同一行并被删除.我不知道为什么函数会被调用两次.

我尝试添加一些延迟但它似乎没有工作.

Sca*_*ael 5

function onEdit(e) {
  var eRange = e.source.getActiveRange();
  var openRequests = SpreadsheetApp.getActive().getSheetByName('Open Requests');
  var closedRequests = SpreadsheetApp.getActive().getSheetByName('Closed Requests');
  var nextRowClose = (closedRequests.getLastRow()?closedRequests.getLastRow()+1:2);

  if(eRange.getSheet().getName()=="Open Requests" && eRange.getColumn()==8 && eRange.getValue()=="Yes") {
    openRequests.getRange(eRange.getRow(), 1, 1, 9)
      .copyTo(closedRequests.getRange(nextRowClose, 1));
    closedRequests.getRange(nextRowClose, 9).setValue(new Date());
    openRequests.deleteRow(eRange.getRow());
  }
}
Run Code Online (Sandbox Code Playgroud)