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

时间:2014-10-08 09:39:03

标签: google-apps-script google-sheets google-form

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

  1. 电子邮件地址。
  2. 用户想要订阅的群组。
  3. 每个小组都有自己的电子表格。 [根据发布的代码,每个都在同一个电子表格中。]

    当用户提交表单时,表单应捕获电子邮件地址,并将数据发送到用户订阅的相应电子表格。

    这是我迄今为止所做的。我被卡住了..

    有没有办法专门从特定的文本框/选项..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");
            }
          }
    
    
        }
      }
    }
    

2 个答案:

答案 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;
}

适应性方法#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
  }
}

答案 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
}