我有一个电子表格,其中包含来自大量表单(测验)的表单响应表。由于所有表格都包含相同的格式,数量和问题顺序,我想将它们全部收集到一张表格中。
我知道这可以使用查询来完成({sheet1!range,sheet2!range ...})但是这个查询的大小将是巨大的(有超过25个表单!)并且它需要我摆弄每次添加新表格时都使用此公式。
我最初调查的是创建一个范围内的工作表列表,然后尝试使用indirect来获取arrayformula查询以运行该列表。然而,这不起作用,并且在这个论坛上询问之后被告知无法做到这一点。
我被建议查看脚本,并花了整个周末试图找到一个可以做到这一点的脚本。然而,我失败了。
我需要脚本将表单响应表的最后一行复制到主表单的底部。我希望脚本能够对所有响应表执行此操作(我有一个表单的命名格式,可以让脚本轻松查看要合并的表单)。我想我需要使用onSubmit()函数,但不确定。
答案 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;
}