此问题类似于“在Google表格中处理表单数据”(https://webapps.stackexchange.com/questions/88736/forms-data-manipulation-in-google-sheets),但需要更多的自动化功能:
背景:用户填写Google表单以提出请求,并可以选择重复同样的问题来填写第二,第三,第四和第五个请求。我已经创建了一个表格来处理这些行,以便将具有相同列的行转移到一列。
表单回复:该表单返回用户填写表单后的回复
操纵行:工作表使用以下命令返回操纵行: = OFFSET('表单响应'!$ A $ 2,上限((row()-row($ B $ 1))/ 5,1)-1,column()-column($ B $ 1),1,COUNTA($ B $ 1:$ D $ 1))在单元格B2中, 和
= OFFSET('表单响应'!$ A $ 2,上限((row()-row($ B $ 1))/ 5,1)-1,mod(row()-(row($ B $ 1) +1),5)* COUNTA($ E $ 1:$ N $ 1)+ COUNTA($ B $ 1:$ D $ 1),1,COUNTA($ E $ 1:$ N $ 1)) 在单元格E2中
粘贴值:此工作表将返回操作行的粘贴值,不包括“偏移量”公式,然后删除任何包含空白单元格E-N的行。这是反映在“粘贴值”标签中的应用程序脚本:
var ss = SpreadsheetApp.getActive();
var sheet = SpreadsheetApp.getActiveSheet();
//Duplicate sheet 'Manipulated Rows' as paste values
function moveValuesOnly() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Paste Values');
var source = ss.getRange('Manipulated Rows!A1:T100000');
source.copyTo(ss.getRange('Paste Values!A1'), {contentsOnly: true});
deleteRows(sheet);
}
//Function to Delete empty rows:
function deleteRows(sheet) {
var rows = sheet.getDataRange();
var range_manipulated_rows = ss.getSheetByName('Manipulated Rows!A1:T100000');
var range_paste_values = ss.getSheetByName('Paste Values!A1:T100000');
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (range_manipulated_rows == range_paste_values && row[4] == '' && row[5] == '' && row[6] == '' && row[7] == '' && row[8] == '' && row[9] == ''
&& row[10] == '' && row[11] == '' && row[12] == '' && row[13] == '') { // if paste values tab is equal to manipulated rows tab and cell E-N are blank
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}
};
我想通过创建一个应用脚本来使此操作更加自动化,该脚本将直接将“表单响应”表单转换为“粘贴值”表单,而无需使用操作行。就像在“粘贴值”工作表中一样,它需要删除所有单元格E-N均为空白的所有行。
任何输入将不胜感激!
答案 0 :(得分:2)
从您的问题和评论中,我可以理解以上内容。这个示例脚本怎么样?
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var src = ss.getSheetByName("Form Responses");
var dst = ss.getSheetByName("Paste Values");
var values = src.getDataRange().getValues();
var header = values.splice(0, 1)[0].splice(0, 13);
var res = values.reduce(function(ar, e) {
var h = e.splice(0, 3);
h.unshift("");
for (var i = 0; i < 5; i++) {
var temp = e.splice(0, 10);
if (temp.filter(String).length == 0) continue;
if (temp.length < 10) temp.splice(temp.length, 10 - temp.length, "");
ar.push(h.concat(temp));
}
return ar;
}, []);
if (dst.getRange("A1").getValue() != "Status") res.unshift(["Status"].concat(header));
dst.getRange(dst.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
}
Form Responses
和Paste Values
的工作表名称。如果要更改工作表名称,请修改脚本。Paste Values
表的标题行是自动设置的。如果您不想设置此项,请修改脚本。