Javascript GoogleSheets脚本:自动将一行删除到另一个工作表中

Javascript GoogleSheets脚本:自动将一行删除到另一个工作表中,javascript,google-apps-script,google-sheets,google-apps,Javascript,Google Apps Script,Google Sheets,Google Apps,我目前正在使用谷歌表单,使用户能够提交网站更改。这一切都运转得很好 我添加了一个额外的列,该列具有票证状态。现在,我编写了一个脚本,检查何时更新为“完成”,然后将该行移动到另一个名为“完成”的工作表中 但是,这仅在我更新手动添加的行时有效。如果我更改从表单条目创建的行上的列,它将不起作用。以前有人见过这个问题吗。代码如下 function onEdit(e){ /* When a user updates a status to done the ticket gets moved

我目前正在使用谷歌表单,使用户能够提交网站更改。这一切都运转得很好

我添加了一个额外的列,该列具有票证状态。现在,我编写了一个脚本,检查何时更新为“完成”,然后将该行移动到另一个名为“完成”的工作表中

但是,这仅在我更新手动添加的行时有效。如果我更改从表单条目创建的行上的列,它将不起作用。以前有人见过这个问题吗。代码如下

function onEdit(e){

  /*
   When a user updates a status to done the ticket gets moved to another sheet
  */
  var sheetNameToWatch = "Form responses 1"; // The sheet to watch for changes
  var columnNumberToWatch = 1; // The column where the change happens on the above sheet
  var valueToWatch = "Done"; // What is the text you are looking for
  var sheetNameToMoveTheRowTo = "Done"; // The Sheet name for where the row gets moved to.

  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet
  var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet
  var range = sheet.getActiveCell(); // Get the current cell that has just been updated

  // Check that you are on the correct sheet and column. 
  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); // get a reference for the target sheet
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // get a reference for the target row
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); // copy the row from current sheet to the new sheet
    sheet.deleteRow(range.getRow()); // Delete the row from the old sheet
  }

}

是的,除非您手动执行,否则onEdit函数不会启动。您需要使用触发器,当收到表单响应时,触发器将启动。这是一个连接到表单的手动安装的触发器,它应该能够像编写的那样完成上面的功能

 var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
 ScriptApp.newTrigger('myFunction')
     .forForm(form)
     .onFormSubmit()
     .create();

不过,为了安全起见,您可能希望通过id或名称而不是通过它们是否处于活动状态来定义电子表格、工作表和范围,我相信如果电子表格未打开,GetActiveAnwhere()类方法将返回null。

如前所述,使用active不是最好的方法

而不是:

var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet 
var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet 
var range = sheet.getActiveCell(); // Get the current cell that has just been updated 
尝试:


如果尝试此操作,则无法从代码编辑器执行,因为未传递任何事件。您必须通过实际提交表单来执行它。

如果缩进4个空格,或突出显示代码,然后按编辑栏中的{}符号,代码将以更易于阅读的格式偏移。我已尝试将其更改为formsubmit触发器,但这也不起作用。问题似乎在于那张纸上的行。如果我手动添加一行并将状态列更新为“完成”。它工作得很好,只是在我更改从表单提交创建的行时,它似乎不起作用。
var range = e.range;
var sheet = range.getSheet();
var ss = sheet.getParent();