如何从Google表单中提取响应项

cho*_*opz 7 google-sheets google-apps-script google-forms

我已经制作了一个表格来捕获2个数据.

  1. 电子邮件地址.
  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");
        }
      }


    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Mog*_*dad 15

有没有办法专门从特定的文本框/选项..etc中检索数据?

是的,它将简化您的任务.相关文档是事件对象.

触发时,触发器功能将被提供一个事件对象.在您的情况下,表单表单提交事件,该事件包括可由属性访问的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;
}
Run Code Online (Sandbox Code Playgroud)

适应性方法#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
  }
}
Run Code Online (Sandbox Code Playgroud)

适应性方法#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
  }
}
Run Code Online (Sandbox Code Playgroud)