我正在创建一个谷歌表单来捕获来自多个用户的数据。此表单有 13 个字段。 3 个表单字段是下拉列表,它们从工作表中填充数据。这部分代码就完成了。但我对以下场景感到震惊。
其中一个字段捕获实例详细信息(生产、UAT)并具有复选框选项。我以为当实例字段在两个复选框上选择时,我可以在响应表中创建两行,但了解到这不是谷歌表单的工作方式。所以我正在寻找一个脚本选项来执行以下操作。
我在谷歌应用脚本或 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 行已拆分为 2 行,C2 中的列数据被解析为每行 PRD 和 UAT,第 2 行和第 3 行的数据提醒保持不变< /p>
谢谢 铝
答案 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
}
}