繁体   English   中英

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

[英]How to merge a large number of form response sheets into one master sheet. (Google Sheets)

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

我知道可以使用query({sheet1!range,sheet2!range ...})来完成此操作,但是此查询的大小非常大(有25种以上的表格!),这需要我弄乱这个公式每次我添加新表格。

我最初研究的是在一个范围内创建一个工作表列表,然后尝试使用间接查询来获取arrayformula查询以遍历该列表。 但是,此操作无效,并在此论坛上询问后被告知无法完成。

建议我研究脚本,并花了整个周末的时间试图找到可以做到这一点的脚本。 但是我失败了。

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

总览

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

由于Google Apps Script的执行时间不应超过六分钟1 ,因此我认为最好不要清除母版工作表并立即附加所有工作表响应,而不是检查每个工作表是否有新的响应。 如果没有注释,注释,自定义格式,数据验证或数据更改直接应用于母版表,则此方法可行。

脚本

下面是一个脚本,用于将同一电子表格中的表单响应工作表的内容连接到名为“主”的工作表。 我认为,它很容易适应。

假定电子表格仅包含表单响应表和“主”表。

/**
 * 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM