Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script Google表单根据问题回答创建两行_Google Apps Script_Google Sheets_Google Forms - Fatal编程技术网

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

Google apps script Google表单根据问题回答创建两行,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我正在创建一个google表单来捕获来自多个用户的数据。此表单有13个字段。其中3个表单字段是下拉列表,用于填充工作表中的数据。这部分代码已完成。但我被下面的场景打动了 其中一个字段捕获实例详细信息生产、UAT和has复选框选项。我原以为当实例字段在两个复选框上选择时,我可以在响应表中创建两行,但我了解到这不是谷歌表单的工作方式。因此,我正在寻找一个脚本选项来执行以下操作 当用户为实例选择PRD和UAT时,将在创建表单时在表单响应表中创建两行。 在1中创建的新行的数据对于两行将保持相同,列实例除

我正在创建一个google表单来捕获来自多个用户的数据。此表单有13个字段。其中3个表单字段是下拉列表,用于填充工作表中的数据。这部分代码已完成。但我被下面的场景打动了

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

当用户为实例选择PRD和UAT时,将在创建表单时在表单响应表中创建两行。 在1中创建的新行的数据对于两行将保持相同,列实例除外,它将采用相应行中表单中的复选框值。 如果只选择了一个选项,则只向响应表添加一行 我在谷歌应用程序脚本或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() ) 
            }
      }
  }
}
现在我不得不将两者结合起来,在响应电子表格中创建一个额外的行,并为此绞尽脑汁。我只知道atm是**记录器。当条件满足时,日志**行将被附加代码替换,以添加2行

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

期待您的支持和指导

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

实际形式响应

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

OnFormSubmit函数结果

谢谢 Al

您可以通过随后的筛选将其拆分为不同的行 这是我的方法没有触发器,只运行并处理所有当前响应:

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
    }
  }
}
工具书类
你能分享一张图片或表格作为例子吗?@JoseVasquez-对延迟表示歉意,错过了你的评论,并感谢你调查这个问题。根据要求,我添加了3个屏幕截图。让我知道,如果截图描绘了一个更好的画面,如果你需要更多的信息。嗨,何塞,谢谢分享的建议,感谢你在这方面的时间。我使用ONFORMSUBMIT触发器运行函数,但什么也没发生。我错过了什么或做错了什么?您打算如何调用该函数?对于代码第3行中的工作表名称,我提供了存储表单响应的工作表名称,我是否正确执行了该操作?或者工作表名称应该是新的工作表名称?我进行了编辑以添加onFormSubmit触发器。前一个答案仍然有效,因为它处理所有当前的响应。第二个函数起作用。但是,对于1个表单提交,响应表中有3行。请参考问题中onFormSubmit的结果抱歉,我不确定我是否可以在评论中添加屏幕截图-这是预期结果吗?还是我做错了什么?进一步的processResponses函数是如何工作的?我做了什么错误的事情使其无法工作?根据您的示例,我知道您希望插入一个拆分的响应?第二行被拆分为两行,C2中的列数据被解析为每行PRD和UAT,第二行和第三行的数据提醒保持不变。这就是为什么除非您添加了另一个实例复选框,否则会将响应拆分为不同的行。关于processResponses函数,它只用于处理表单中的所有当前响应,并拆分响应,而不管标记的实例数量如何。如果对您不起作用,请在图像中添加URL。我为未能解释而道歉。我希望将表单提交的原始响应更改为两行拆分实例,而不是原始行。否则你的代码就完全符合我的需要了。将原始响应拆分为两行后是否可以删除?
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
    }
  }
}
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
  }
}