我想问一下在Google表单的电子表格中进行更改后运行 onChange触发器。
我有这个源代码,用于在更改后发送电子邮件:
function onChange(e){
var sheet = SpreadsheetApp.getActiveSheet();
var helpRange = sheet.getRange(2, 16);
var debugRange = sheet.getRange(2,17);
var startRow = helpRange.getValue();
var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
debugRange.setValue(numRows);
var dataRange = sheet.getRange(startRow, 1, numRows, 11);
var data = dataRange.getValues();
var cal = CalendarApp.getDefaultCalendar();
for (i in data) {
var row = data[i];
var title = row[3];
var desc = "Description: " + row[4] + " Requested Accounts: " + row[5] + " Marketing Support: " + row[6] + " Responsible Salesman " + row[8] + " Email: " + row[9] + " " + row[10]; // Second column
var tstart = row[1];
var tstop = row[2];
var loc = row[7];
cal.createEvent(title, new Date(tstart), new Date(tstop), {description:desc,location:loc});
helpRange.setValue(sheet.getLastRow() + 1);
var emailAddress = sheet.getRange(sheet.getLastRow(), 10).getValue();
var subject = "New Event Created: " + title;
Browser.msgBox(emailAddress + " " + subject + " "+ desc);
MailApp.sendEmail(emailAddress, subject, desc);
}
}
此电子表格应由Google表单自动填写(当用户提交答案时),其他任何用户都不应对其进行任何更改。每次我在物理上进行一些更改时都会触发此onChange触发器(正如预期的那样但这不会发生)但是当我从Google表单提交答案时,它也会显示在电子表格中,但不会触发onChange触发器。
为什么?
我可以编写它以便在Google表单更改后触发触发器吗?
答案 0 :(得分:1)
如eddyparkinson所述,您肯定需要表单提交触发器,而不是更改或编辑触发器。
可以在Google表单或收到表单回复的Google表格中设置form submit trigger。每种情况下的触发事件略有不同; Google Sheets form submit event包含简单数组中的表单条目值(e.values,e.namedValues),而Forms form submit event包含FormResponse对象,可以查询有关表单的所有信息提交。
答案 1 :(得分:1)
要了解为什么它不起作用,有四个要点:
onFormSubmit()
。function createTriggerFunction(){
//Get the target spreadsheet
var ss = SpreadsheetApp.openById('XXXXXXXXXXXX');
//Create a new trigger using ScriptApp service passing your function as parameter
ScriptApp.newTrigger("yourMailFunction")
.forSpreadsheet(ss)
.onFormSubmit()
.create()
}
现在,要安装此新触发器,您必须在Google App脚本编辑器的 Select Function 列表中选择此createTriggerFunction()
并运行一次,否则,每次您运行时都会创建相同的触发器。
这一点对工作很重要:重写功能适用于简单触发器,在这种情况下,onChange()和onFormSubmit()are not。因此,在本例中,为方便起见,您的代码将在名为yourMailFunction
的新函数中使用它。
function yourMailFunction(e){
var sheet = SpreadsheetApp.openById('XXXXXXXXXXXX');
...
}
}
请注意,我使用的是SpreadsheetApp.openById('XXXXXXXXXXXX')
而不是SpreadSheetApp.getActiveSheet()
。 非常重要,因为当表单提交并在关联的电子表格中插入新行时,没有活动的电子表格,因此您必须通过ID对其进行调用。 >