谷歌表单根据问题响应创建两行

时间:2021-03-24 21:26:11

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

我正在创建一个谷歌表单来捕获来自多个用户的数据。此表单有 13 个字段。 3 个表单字段是下拉列表,它们从工作表中填充数据。这部分代码就完成了。但我对以下场景感到震惊。

其中一个字段捕获实例详细信息(生产、UAT)并具有复选框选项。我以为当实例字段在两个复选框上选择时,我可以在响应表中创建两行,但了解到这不是谷歌表单的工作方式。所以我正在寻找一个脚本选项来执行以下操作。

  1. 当用户为实例选择 PRD 和 UAT 时,将在创建表单时在表单响应表中创建两行。
  2. #1 中创建的新行的数据将保持不变,除了列实例之外的两行,该列实例将采用相应行中表单中的复选框值。
  3. 如果只选择了一个选项,则响应表中只会添加一行

我在谷歌应用脚​​本或 Java 方面的经验非常有限。由于我的知识有限,我能够从表单中获得响应,但不确定如何在满足条件时创建额外的行(如上所述)。一步一步了解表单架构

代码 1: 这是获取表单中字段的标题、索引和类型。所以我知道了一些表格的信息(还在学习中)

function testgetFormDetails() 
{
  var form = FormApp.getActiveForm();
  var items = form.getItems();
  for (var i in items) 
  { 
    Logger.log(items[i].getTitle() +', ID - '+ 
               items[i].getId() +', Type - ' + 
               items[i].getType() +' , Form Index - '+ 
               items[i].getIndex());
  }
} 

以下是执行日志

**Execution log**
5:49:38 PM  Notice  Execution started
5:49:39 PM  Info    Business Group, ID - 286404828, Type - CHECKBOX , Form Index - 0
5:49:39 PM  Info    Instance, ID - 1043278952, Type - CHECKBOX , Form Index - 1
5:49:40 PM  Notice  Execution completed

代码 2: 获取问题的回复(小进步)

function getResponseForInstance() 
{
  var formResponses = FormApp.getActiveForm().getResponses();
  Logger.log(formResponses.length);
  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];
        var lookfor = 'UAT,PRD'
          if(itemResponse.getResponse() == lookfor )
            {
              Logger.log('Question:' + itemResponse.getItem().getTitle() + ' Response:' + itemResponse.getResponse() ) 
            }
      }
  }
}

执行日志显示行号、问题和响应

**Execution log**
8:22:18 PM  Info    Question:Instance Response:UAT,PRD
8:22:18 PM  Info    Question:Instance Response:UAT,PRD

现在我必须将两者结合起来才能在响应电子表格中创建一个额外的行,并且我一直在为此绞尽脑汁。我只知道 atm 是 **Logger.Log()** 行将被附加代码替换,以在满足条件时添加 2 行。

对此的任何帮助将不胜感激。

期待您的支持和指导。

为@Jose Vasquez 添加示例截图 样本表格

enter image description here

实际表单回复 enter image description here

预期响应 - 第 2 行已拆分为 2 行,C2 中的列数据被解析为每行 PRD 和 UAT,第 2 行和第 3 行的数据提醒保持不变< /p>

Expected Response'

OnFormSubmit 函数结果 enter image description here

谢谢 铝

1 个答案:

答案 0 :(得分:1)

您可以通过事后过滤分成不同的行

这是我的方法(没有触发器,只运行和处理所有当前响应):

function processResponses() {
  var ss = SpreadsheetApp.openById("SPREADSHEET_ID");
  var sheet = ss.getSheetByName("SHEET_NAME");
  const formResponses = FormApp.getActiveForm().getResponses();

  for (var i = 0; i < formResponses.length; i++) {
    var formResponse = formResponses[i];
    var itemResponses = formResponse.getItemResponses();
    
    // Add responses comma-separated included
    var rowData = itemResponses.map(item => item.getResponse().toString());
    rowData.splice(0, 0, formResponse.getTimestamp()); // Timestamp

    // Split into different rows afterwards
    if (rowData[2].includes(',')) {
      rowData[2].split(',').forEach(instanceName => {
        let tmpRow = rowData.map(data => data);
        tmpRow[2] = instanceName;
        sheet.appendRow(tmpRow); // Append to the sheet
      });
    } else {
      sheet.appendRow(rowData); // Append to the sheet
    }
  }
}

首先打开电子表格,您将在其中存储您的回复。完成后,像之前一样遍历您的回复,然后添加所有回复,包括每个表单回复的时间戳。

将响应数据添加到 rowData 后,您可以评估 Instance 列(第 2 列或 C 列)是否包含逗号。如果是这样,只需按此字符拆分此字段,然后遍历此数据,以便为每个“实例”在您的工作表中附加一个新行。

表单提交触发器(请记住,您必须安装它)

从事件对象中检索响应。

function onFormSubmit(e) {
  var ss = SpreadsheetApp.openById("SPREADSHEET_ID");
  var sheet = ss.getSheetByName("SHEET_NAME");
  // Form Response retrieved from the event object
  const formResponse = e.response;
  var itemResponses = formResponse.getItemResponses();
  
  // Add responses comma-separated included
  var rowData = itemResponses.map(item => item.getResponse().toString());
  rowData.splice(0, 0, formResponse.getTimestamp());

  // Split into different rows afterwards
  if (rowData[2].includes(',')) {
    rowData[2].split(',').forEach(instanceName => {
      let tmpRow = rowData.map(data => data);
      tmpRow[2] = instanceName;
      sheet.appendRow(tmpRow); // Append to the sheet
    });
  } else {
    sheet.appendRow(rowData); // Append to the sheet
  }
}

参考文献