Google 表单以根据问题响应创建两行

Google form to create two rows based on a question response

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

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

  1. 当用户select PRD 和UAT 为实例时,在表单响应sheet 上创建的两行将在表单创建时创建。
  2. 在#1 中创建的新行的数据对于列实例之外的两行将保持相同,列实例将采用相应行中表单中的复选框值。
  3. 如果只 select 编辑了一个选项,那么只会将一行添加到响应中 sheet

我在 google 应用脚本或 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

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

非常感谢对此的任何帮助。

期待您的支持与指导。

根据@Jose Vasquez 添加示例屏幕截图 样本表格

实际表单响应

预期响应 - 第二行已拆分为 2 行,C2 中的列数据每行解析为 PRD 和 UAT,第 2 行和第 3 行的数据提示保持相同

OnFormSubmit 函数结果

谢谢 阿尔

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

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

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

首先打开您将存储回复的 Spreadsheet。完成后,像您已经做的那样遍历您的回复,然后添加您的所有回复,包括每个表单回复的时间戳。

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

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

从事件对象中检索响应。

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

参考资料