如何将大量表单响应表合并到一个主表单中。 (Google表格)

时间:2016-09-19 07:40:26

标签: google-apps-script google-sheets

我有一个电子表格,其中包含来自大量表单(测验)的表单响应表。由于所有表格都包含相同的格式,数量和问题顺序,我想将它们全部收集到一张表格中。

我知道这可以使用查询来完成({sheet1!range,sheet2!range ...})但是这个查询的大小将是巨大的(有超过25个表单!)并且它需要我摆弄每次添加新表格时都使用此公式。

我最初调查的是创建一个范围内的工作表列表,然后尝试使用indirect来获取arrayformula查询以运行该列表。然而,这不起作用,并且在这个论坛上询问之后被告知无法做到这一点。

我被建议查看脚本,并花了整个周末试图找到一个可以做到这一点的脚本。然而,我失败了。

我需要脚本将表单响应表的最后一行复制到主表单的底部。我希望脚本能够对所有响应表执行此操作(我有一个表单的命名格式,可以让脚本轻松查看要合并的表单)。我想我需要使用onSubmit()函数,但不确定。

1 个答案:

答案 0 :(得分:1)

概述

我不认为使用on submit触发器是一个好主意,因为涉及多种形式和大量响应。另一方面,如果提交的答复非常接近,则可能会发生冲突。恕我直言,更好的方法是按需求(手动)或使用time-driven trigger运行脚本。

由于Google Apps脚本的执行时间不应超过六分钟 1 ,我认为更好的方法是清除主表并附加所有内容表单立即响应。如果不会在主工作表上直接应用注释,注释,自定义格式,数据验证或数据更改,则可以使用此功能。

脚本

下面是一个脚本,它将同一电子表格中的表单回复表的内容连接到名为' Master'的表单。我认为它很容易适应。

我们假设电子表格只包含表格回复表和“主人”表格。片材。

/**
 * Joins the data from form responses sheets on a master responses sheet.
 * Assumes that the master sheet has the form response headers and 
 * that there aren't extra columns.
 */

function joinSheetsData() {
  // Initialize loop variables
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var masterName = 'Master';                             // Change this.
  var masterSheet = ss.getSheetByName(masterName);
  var headers = [masterSheet.getDataRange().getValues()[0]];
  var masterdata = [];

  // Loop to append form responses from all response sheets to one array. 
  for(var i = 0; i < sheets.length; i++){ 
    if(sheets[i].getName() != masterSheet.getName()){
      var data = sheets[i].getDataRange().getValues();
      data.splice(0,1);
      masterdata = append(masterdata,data);
    }
  }
  // Clear the master sheet.
  masterSheet.clear();
  // Add the headers to the master sheet.
  var masterheadersRow = masterSheet.getRange(1, 1, 1,
    masterdata[0].length);
  masterheadersRow.setValues(headers);
  // Send the resulting array to the master sheet.
  var masterdataRange = masterSheet.getRange(2, 1, masterdata.length,
    masterdata[0].length);
  masterdataRange.setValues(masterdata);
}

/*
 * Auxiliary function to append 2D arrays.
 */
function append(a,b){
  for(var i = 0; i<b.length; i++){
    a.push(b[i]);
  }
  return a;
}
相关问题