google-apps-script - Google 表单根据问题响应创建两行

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

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

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

  1. 当用户为实例选择 PRD 和 UAT 时,创建表单时将在表单响应表中创建两行。
  2. 在 #1 中创建的新行的数据对于两行将保持相同,但列实例将采用相应行中表单中的复选框值。
  3. 如果仅选择一个选项,则仅将一行添加到响应表

我在 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

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

对此的任何帮助将非常感激。

期待您的支持和指导。

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

enter image description here

实际表单回复 enter image description here

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

Expected Response'

OnFormSubmit 函数结果 enter image description here

谢谢 铝

最佳答案

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

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

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 后,您可以评估实例列(第 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
  }
}

引用文献

关于google-apps-script - Google 表单根据问题响应创建两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66789648/

相关文章:

google-apps-script - 将邮政编码从 Google 电子表格导入 Google 融合表时,如何防止删除前导零?

javascript - Google 脚本 Javascript 日期错误

google-apps-script - 我无法在谷歌云平台上创建 OAuth 2.0 客户端 ID

google-sheets - 如何从 Google 表格中的链接(链接功能,而不是 HYPERLINK 公式)中提取 URL?

javascript - Google Script 通过电子邮件发送表单值,错误 : cannot read property "namedValues"

google-apps-script - Google 表单多项选择从应用程序脚本提交时其他选项不可见

google-apps-script - 谷歌应用程序脚本使用jdbc将日期插入表

google-apps-script - 使用 Appscript 将 Markdown 文本文件转换为 Google 文档?

google-apps-script - 如何从带有占位符的模板创建新文档

google-apps-script - 通过 api 编辑电子表格时,如何让 onEdit 事件在 Google Apps 脚本中被捕获?