当前位置: 首页 > 知识库问答 >
问题:

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

尤研
2023-03-14

我做了一个表格来捕获2个数据。

  1. 电子邮件地址

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

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

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

有没有一种方法可以从特定的文本框/选项中检索数据...等等?

我知道的唯一方法是循环所有数据并逐个检索。。这使得我很难将两个数据链接在一起。。。例如:”johndoh@email.com订阅“第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个答案

宿丰
2023-03-14

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

不管这些问题是否是必需的。

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
}
费朗
2023-03-14

是否有专门从特定文本框/选项检索数据的方法。。等

是的,它会简化你的任务。相关文档是事件对象。

触发时,触发器函数将提供事件对象。对于表单提交事件,该事件包括一个FormResponse对象,可通过response属性访问。无需遍历响应或打开表单。

因为我们可以从一个回复中获得电子邮件和群组,所以将两者联系起来就变得微不足道了。您将看到一个helper函数用于获取相应工作表上的句柄,以便向其添加订阅。

只要您的问题是必需的,由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
  }
}
 类似资料:
  • 问题内容: 首先,我将自由地让自己成为一个笨拙的文科专家,他完全可以自学此脚本。就是说,我正在尝试使用以下代码从USGS水数据服务获取值: 尽管我找到了一些有关如何从JSON响应中提取所需值的教程,但大多数教程都非常简单。我遇到的困难是从该服务返回的看起来非常复杂的响应中提取出来的。查看响应,我可以看到我想要的是来自两个不同部分的值和一个时间值。因此,我可以查看响应并查看所需的内容,但我一生无法解

  • 我在桌面应用程序中嵌入了一个http服务器,用于捕获来自OAuth2重定向的响应。下面的方法拾取消息并将其转换为字符串: 方法是一个将数据传递给另一个类的事件。成功进行身份验证调用后,数据内容如下所示:

  • 我有一个列表作为响应返回。我需要从使用product.name和tariffplan.name的列表中获得一个项目。 我使用Java8。以下是我的方法。我拿到了卡。类元素的列表。然后,我需要从列表中获得具有指定“product.name”和“tariffplan.name”的单个项目。 是否可以用Restastured来做这件事?也许像我的例子一样使用。param方法?但是在我的示例中。param

  • 发布请求后,API 将响应正文作为字符串返回 身体的反应是这样的 {UniqueID=93243434,出生性别=M,出生日期=11/1/2018 5:51:18 PM,familyNames=James,givenNames=Test} 当我尝试使用以下代码设置环境变量时: 我得到了以下错误的测试结果 错误消息:评估测试脚本时出错:JSON error:1:3出现意外标记“u ”{ unique

  • 我可以通过Inspect工具找到HTML。我的代码返回的是html,我可以通过“查看页面源代码”工具看到它。因此,这意味着taht Javascript在嵌入代码之前会修改代码。但是,splash的角色是运行javascript并返回HTML,不是吗??回应。body返回页面的源代码,而不返回我上面提到的响应所需的html代码。

  • 我想在窗体的操作重定向它之前从窗体中获取值。例如,在这个表单中,我想抓取“text_one”并将其发送到数据库,然后再将其重定向到google。我还想在谷歌上看到“text_one”。我该怎么办?