我目前正在使用Google表单来启用用户提交网站更改。这一切都很美妙。
我添加了一个具有故障单状态的额外列。现在我编写了一个脚本,用于检查何时将其更新为Done,然后将该行移动到另一个名为done的表中。
然而,这仅在我更新手动添加的行时才有效。如果我更改从表单条目创建的行上的列,它将无法工作。有没有人见过这个问题。代码如下。
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
}
}
答案 0 :(得分:1)
是的,除非您手动执行,否则onEdit函数不会触发,您将需要使用onFormSubmit触发器,该触发器会在收到表单响应时触发。这是一个连接到表单的手动安装的触发器,它应该能够像上面那样完成上面的功能。
var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
ScriptApp.newTrigger('myFunction')
.forForm(form)
.onFormSubmit()
.create();
但是,为了安全起见,您可能希望按ID或按名称定义电子表格,工作表和范围,而不是根据它们是否处于活动状态,我相信如果电子表格不是,则getActiveWhatever()种类的方法将返回null打开。
答案 1 :(得分:1)
如前所述,使用主动并不是最好的主意。
而不是:
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
尝试:
var range = e.range;
var sheet = range.getSheet();
var ss = sheet.getParent();
如果您尝试这样做,则无法从代码编辑器执行它,因为没有传递任何事件。您必须通过实际提交表单来执行它。