我正在创建一个谷歌表单来捕获多个用户的数据。该表格有 13 个字段。 3 个表单字段是下拉菜单,用于填充工作表中的数据。这部分代码就完成了。但我对以下场景感到震惊。
其中一个字段捕获实例详细信息(生产、UAT)并具有复选框选项。我以为当实例字段选择了两个复选框时,我将能够在响应表中创建两行,但了解到这不是谷歌表单的工作原理。因此,我正在寻找一个脚本选项来执行以下操作。
- 当用户为实例选择 PRD 和 UAT 时,创建表单时将在表单响应表中创建两行。
- 在 #1 中创建的新行的数据对于两行将保持相同,但列实例将采用相应行中表单中的复选框值。
- 如果仅选择一个选项,则仅将一行添加到响应表
我在 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 添加示例屏幕截图 样本表格
预期响应 - 第二行已拆分为 2 行,C2 中的列数据每行解析为 PRD 和 UAT,并且第 2 行和第 3 行的数据提醒保持不变
谢谢 铝
最佳答案
您可以通过事后过滤分成不同的行
这是我的方法(没有触发器,仅运行和处理所有当前响应):
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/