【问题标题】:How to extract response items from a Google Form如何从 Google 表单中提取响应项
【发布时间】:2014-10-08 09:39:03
【问题描述】:

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

  1. 电子邮件地址。
  2. 用户想要订阅的组。

每个组都有自己的电子表格。 [根据发布的代码,每个人在同一个电子表格中都有自己的sheet。]

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

这是我到目前为止所做的。我被卡住了..

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


    }
  }
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这非常详细。非常感谢!它使代码更容易理解
    • 嗨 Mogsdad,脚本运行良好。我检查了执行记录,一切正常。但是当我查看我的电子表格时,它返回“[Ljava.lang.Object;@4c9b0c7e”。我猜我需要某种从数组到字符串的转换?
    • 想通了。更改 sheet.appendRow([[email]]);到 sheet.appendRow([email]);
    • 谢谢 - 我的错字已修正。
    • 如果我遇到错误怎么办:You do not have permission to call Form.getResponses?
    【解决方案2】:

    这就是我从表单提交中提取值的方式,

    无论这些问题是否必填。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2022-07-02
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多