有没有办法专门从特定的文本框/选项 ..etc 中检索数据?
是的,它将简化您的任务。相关文档为Event Objects。
您的触发函数在被触发时将提供一个事件对象。在您的情况下,Forms 表单提交事件,该事件包括一个 FormResponse 对象,可通过 response 属性访问。无需遍历响应或打开表单。
由于我们可以从单个响应中获取电子邮件和群组,因此将两者关联起来变得微不足道。您将看到一个辅助函数用于获取相应工作表上的句柄以添加订阅。
简单的方法 - 需要所有响应
只要您的问题是必填的,getItemResponses() 返回的数组将按照它们在表单中出现的顺序包含项目响应。
/**
* Trigger function for Google Forms "Form submit" event.
* Simple, assumes all answers are provided, no error checking.
*/
function onFormSubmit(e) {
var formResponse = e.response;
// If all questions are required, getItemResponses returns responses in form-order
var itemResponses = formResponse.getItemResponses();
var email = itemResponses[0].getResponse(); // returns a string
var group = itemResponses[1].getResponse();
var sheet = getGroupSheet( group ); // use helper function to get right sheet
if (sheet) {
sheet.appendRow([email]); // Add subscriber as a single-cell row
}
}
/**
* Gets the sheet for the indicated group.
* Helper function for onFormSubmit().
*
* @param {string} group The ID of the group, from user's response
*
* @returns {Sheet} Sheet object for the given group,
* null if group is unknown.
*/
function getGroupSheet( group ) {
var ssId = "id goes here";
switch (group) {
case "1":
var name = "Group subscription email";
break;
// case "2": // Add cases to handle other groups
// var name = "Other sheet name";
// break;
default: // If the group is unknown, log it
name = "";
Logger.log("Unexpected group ID ("+group+")");
break;
}
if (name) {
var result = SpreadsheetApp.openById(ssId).getSheetByName(name);
}
else {
result = null; // Return null for unknown groups
}
return result;
}
适应性方法 #1 - 项目索引
知道所有响应项都存在确实使事情变得简单,但我们不能总是依赖于此。如果有可能将响应项留空,我们将需要得到具体的答案。
有几种方法可以做到这一点。我们来看两个。首先,使用项目索引:
/**
* Trigger function for Google Forms "Form submit" event.
* Flexible - checks for specific response items by getting the item index
* for each response item. Example: if user answered questions 1 and 3, but not 2,
* e.response would contain itemResponses for items 0 and 2, but not 1.
*/
function onFormSubmit2(e) {
var formResponse = e.response;
var itemResponses = formResponse.getItemResponses();
for (var i=0; i<itemResponses.length; i++) {
switch (itemResponses[i].getItem().getIndex()) {
case 0:
var email = itemResponses[i].getResponse(); // returns a string
break;
case 1:
var group = itemResponses[i].getResponse();
break;
}
}
var sheet = getGroupSheet( group ); // use helper function to get right sheet
if (sheet) {
sheet.appendRow([email]); // Add subscriber as a single-cell row
}
}
适应性方法 #2 - 项目标题(问题文本)
使用索引让我们摆脱了提供所有答案的要求,但仍然很脆弱;如果表单被修改,则需要维护工作,以确保索引保持对齐。
我们可以使用的一项改进是使用问题的文本来选择我们的回答。如果问题被改写,我们仍然需要小心 - 但这种方法可以适应顺序或问题的更改或添加非问题项目(例如图像、分页符、视频或标题)。
/**
* Trigger function for Google Forms "Form submit" event.
* More Flexible - checks for specific response items by getting the item title
* for each response item. No need to know the exact order of questions this way,
* as long as we know what the question was. (Ideal if the form is
* created programmatically.)
*/
function onFormSubmit3(e) {
var formResponse = e.response;
var itemResponses = formResponse.getItemResponses();
for (var i=0; i<itemResponses.length; i++) {
switch (itemResponses[i].getItem().getTitle()) {
case "Email Address":
var email = itemResponses[i].getResponse(); // returns a string
break;
case "Group":
var group = itemResponses[i].getResponse();
break;
}
}
var sheet = getGroupSheet( group ); // use helper function to get right sheet
if (sheet) {
sheet.appendRow([email]); // Add subscriber as a single-cell row
}
}