我已经制作了一个表格来捕获2个数据。
每个小组都有自己的电子表格。 [根据发布的代码,每个表都在同一个电子表格中。]
当用户提交表单时,表单应捕获电子邮件地址,并将数据发送到用户订阅的相应电子表格。
这是我迄今为止所做的。我被卡住了..
有没有办法专门从特定的文本框/选项..etc中检索数据?
我知道的唯一方法是循环所有数据并逐个检索..这使我很难将2个数据链接在一起......例如:"johndoh@email.com" subscribed to "Group 1"
function onFormSubmit() {
var form = FormApp.getActiveForm();
var formResponses = form.getResponses();
for (var i = 0; i < formResponses.length; i++) {
var formResponse = formResponses[i];
var itemResponses = formResponse.getItemResponses();
for (var j = 0; j < itemResponses.length; j++) {
var itemResponse = itemResponses[j];
// Checks if it is multiple choice option
if (itemResponse.getItem().getType() == FormApp.ItemType.MULTIPLE_CHOICE) {
// If user chooses group 1, open spreadsheet and store user's email in 1st column
if (itemResponse.getResponse() == "1") {
var ss = SpreadsheetApp.openById("id goes here");
var sheet = ss.getSheetByName("Group subscription email");
}
}
}
}
}
答案 0 :(得分:14)
有没有办法专门从特定的文本框/选项..etc中检索数据?
是的,它将简化您的任务。相关文档为Event Objects。
触发时,触发器功能将随事件对象一起提供。在您的情况下,表单表单提交事件,该事件包含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;
}
知道所有响应项目都存在确实简单,但我们始终不能依赖它。如果有可能将响应项留空,我们需要获得具体答案。
有几种方法可以做到这一点。我们来看看两个。首先,使用项目索引:
/**
* 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
}
}
使用索引使我们免于提供所有答案的要求,但仍然很脆弱;如果表单被修改,则需要维护工作,以确保索引保持一致。
我们可以使用的改进是使用问题的文本来选择我们的回复。如果问题被重新编码,我们仍然需要小心 - 但这种方法可以适应顺序或问题的变化或添加非问题项目(如图像,分页符,视频或标题)。
/**
* 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
}
}
答案 1 :(得分:0)
这就是我从表单提交中提取值的方式,
无论是否需要提问。
function formResponse(e) {
let responseSheet = e.range.getSheet()
let responseValues = e.namedValues
let userName = responseValues["Name"]
//works even if the answer is blank.
let userGroup = responseValues["Group"]
//do something
}