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

Google表单根据问题回答创建两行

山凌
2023-03-14

我正在创建一个google表单来捕获来自多个用户的数据。此表单有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());
  }
} 

下面是执行html" target="_blank">日志

**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是**记录器。Log()**行将被附加代码替换,以在满足条件时添加2行。

在此方面的任何帮助都将不胜感激。

期待您的支持和指导。

根据@Jose Vasquez示例表单添加示例屏幕截图

预期响应-第二行被分成两行,C2中的列数据被解析为每行的PRD和UAT,第二行和第三行的数据提醒保持不变

谢谢艾尔

共有1个答案

姚建树
2023-03-14

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

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
  }
}
  • FormResponse.get时间戳
  • Sheet.append行
 类似资料:
  • 我想让我的谷歌表单根据问题回答将数据放入不同的谷歌表单(而不是不同的标签)。 例如,如果有人为汽车制造商选择“Honda”,我希望将所有表单数据转储到表A中。如果有人选择“Toyota”,我希望将所有表单数据转储到表B中,依此类推。虽然这些是单独的图纸,但图纸的选项卡名称与制造商匹配。 我熟悉谷歌应用脚本,但不是行业专家或开发者。任何帮助将不胜感激,谢谢!

  • 问题内容: 我在单个表中创建两个标识列时遇到问题。这是我工作的一部分…他们不惜任何代价在一个表中需要两个标识列。有什么办法可以做到这一点。 请提供任何语法来一次或以后在单个表中创建两个标识列。 在此先感谢,Shashra 问题答案: 在SQL Server中,您可以具有一个计算列,该列仅与标识(或任何其他)列具有相同的值:

  • 问题内容: 我们正在通过Python API使用Google BigQuery 。如何根据查询结果创建表(新表或覆盖旧表)?我查看了查询文档,但没有发现有用。 我们要模拟: ANSI SQL中的“ SELEC … INTO …”。 问题答案: 您可以通过在查询中指定目标表来执行此操作。您将需要使用API而不是调用,并且应该指定并填写目标表。 如果您使用的是原始API,则配置如下所示。如果您使用的是

  • 问题内容: 我在使用RODBC的sqlSave创建表时遇到了麻烦(或更准确地说,是将数据写入到创建的表中)。 这与现有的sqlSave问题/答案不同,因为 他们遇到的问题是不同的,我可以创建表,而他们不能, 我已经不成功地合并了他们的解决方案,例如在运行sqlSave之前关闭并重新打开连接, 错误消息是不同的,唯一的例外是帖子在以上两种方式中是不同的 我在Windows RDP上使用MS SQL

  • null 我还尝试在表创建后使用sqlUpdate()。不管我是在R中还是在SQL Server Management Studio中创建它,我都会得到错误 最后,请注意,在没有append=TRUE的情况下,在创建新表时,以及在使用和不使用rownames选项的情况下,我也尝试了这种方法。 Freenode的#r的Flick先生让我检查是否可以使用sqlQuery读取空表,事实上,我可以。 我创

  • 我运行了以下查询: 然后得到一个带有时间戳数据类型的列: 我想用这个表输出创建一个新表。