如何复制功能内的特定行而不是全行
我有一个功能,我从网上获得,稍作修改为我自己使用。我无法工作的是如何删除整行,并只复制下面函数中的特定行。如何复制功能内的特定行而不是全行
我希望能够将变量传递给每个工作表的功能以及其相应的列进行复制。
ex。 moveCompletedRows(类型,whereToMoveType,[细胞的移动]){}
function moveCompletedRows(type,whereToMoveType) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('SortBot');
var targetSheet = ss.getSheetByName(whereToMoveType);
var val = sheet.getDataRange().getValues();
var headers = val.shift();
var arr = [], rowsToWriteBack = [];
rowsToWriteBack.push(headers);
val.forEach(function (r, i) {
r[1] == type ? arr.push(r) : rowsToWriteBack.push(r)
});
if (arr.length > 0) {
targetSheet.getRange(targetSheet.getLastRow() + 1, 1, arr.length, arr[0].length)
.setValues(arr);
sheet.clear();
sheet.getRange(1, 1, rowsToWriteBack.length, rowsToWriteBack[0].length)
.clear()
.setValues(rowsToWriteBack);
}
}
除了: 我的当前设置需要改变是因为我的形式是如此之大(多部分形式)的原因提出了很多列的(A -CH),并且每个条目仅提交大约8个(仅在不同列中),即使隐藏了列,当我在移动设备上查看页面时,它会冻结/崩溃50%的时间(我不确定这会完全解决因为具有许多行的工作表仍将位于该主工作表上,请注意它将为空)。这让我质疑,如果在移动设备上从未查看过那么多单元格的表单会导致表单加载非常慢?
感谢
编辑:
链接到包含窗体/张的云端硬盘文件夹/脚本
https://drive.google.com/folderview?id=0B-7N8A7FPKw5V20yRVFQcmNZTlk&usp=sharing
EDIT2:
一直在努力工作在这最后几个天,我有一个二次脚本我有半的工作,但部分下面标注是我想要的原配方中有工作
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet2Copy = ss.getSheetByName('Actions');
var targetSheet = ss.getSheetByName('Test');
var data = sheet2Copy.getRange(1,1, sheet2Copy.getLastRow(), sheet2Copy.getLastColumn()).getValues();
var dest = [];
for (var i = 0; i < data.length; i++) {
Logger.log(data[i][12]);// just to check if the condition is true sometimes ;-)
if (data[i][1] == "Action") {
var rowsToWriteBack = []; // initialise intermediate array
// GET THIS WORKING IN ABOVE FORMULA
// Trying to select columns to put into new sheet. Will eventually make the #'s variables passed into the formula to make it dynamic
rowsToWriteBack.push(
data[i][0],
data[i][1],
data[i][2],
data[i][10],
data[i][11],
data[i][12],
data[i][13]
);// choose here the columns you want to add
dest.push(rowsToWriteBack);
}
} // here is the end of the for loop
Logger.log(dest) ; // log the dest array instead
if (dest.length > 0) { // if something has been written in your array then batch write it to the dest. sheet
targetSheet.getRange(targetSheet.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
}
}
所以我无法得到它的工作直接关闭主表“SortBot”,并取得这么SortBot所有单元写入到旁边另一片。然后是另一个脚本“moveToSheet”,它读取新工作表并将所有所需列传输到新工作表。
我遇到的问题是发送到新窗体的所有响应,我无法监视更改并运行触发器。因此,当响应进入时,我已经将单元格C2设置为“未排序”,并且如果页面已打开,请选择C2(下拉列表),然后选择“已排序”,然后对表格进行排序。
如果有人想看看如何更系统的作品让我知道,我打算让我完成的系统的视频演示供他人使用
// Main page running the code
var responseRange = "A2:CJ";
var targetSheetSortCell = "C2";
var targetSheetSortCellValue = "Not sorted";
var type1 = "Action";
var sheetName1 = "Actions";
var targetURL1 = "SHEET_URL";
var columnsToCopy1 = [0,1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
moveToSheet(type1, sheetName1, targetURL1, columnsToCopy1, responseRange, targetSheetSortCell, targetSheetSortCellValue)
// The function
function moveToSheet(type, sheet, targetURL, columnsToCopy, responseRange, targetSheetSortCell, targetSheetSortCellValue) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet2Copy = ss.getSheetByName(sheet);
var target = SpreadsheetApp.openByUrl(targetURL)
var targetSheet = target.getSheetByName(sheet);
var columnsToCopy = columnsToCopy;
var responseRange = responseRange;
var targetSheetSortCell = targetSheetSortCell;
var targetSheetSortCellValue = targetSheetSortCellValue;
var data = sheet2Copy.getRange(1,1, sheet2Copy.getLastRow(), sheet2Copy.getLastColumn()).getValues();
var dest = [];
for (var i = 0; i < data.length; i++) {
if (data[i][1] == type) {
var destRow = []; // initialise intermediate array
for (var v = 0; v < columnsToCopy.length; v++) {
destRow.push(data[i][columnsToCopy[v]]);
}
dest.push(destRow);
targetSheet.getRange(targetSheetSortCell).setValue(targetSheetSortCellValue);
}
}
if (dest.length > 0) { // if something has been written in your array then batch write it to the dest
sheet2Copy.getRange(responseRange).clear();
targetSheet.getRange(targetSheet.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest);
}
}
看看这个是什么! 这将检查每一行,只会取非空条目,并将结果放在工作表targetSheetName中。
function minimizeRows(sheetName,targetSheetName) {
// default sheetName is "test8" and default targetSheetName = "test-results";
sheetName = sheetName ? sheetName : "test8";
targetSheetName = targetSheetName ? targetSheetName : "test8-results";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName) ? ss.getSheetByName(sheetName) : ss.insertSheet(sheetName);
var values = sheet.getDataRange().getValues();
var headers = values.shift();
// this adds the column name after each entry
for(var i=0;i<values.length;i++) {
for(var k=0;k<values[i].length;k++) {
if(values[i][k])
values[i][k] = values[i][k] + " (column: " + headers[k] + ")";
}
}
// this filters out only the non-empty entries
for(var i=0;i<values.length;i++) {
for(var k=0;k<values[i].length;k++) {
if(!values[i][k]) {
values[i].splice(k,1);
k--; // important to decrease k, because the row values[i] is decreased in size by one by split(k,1)
}
}
}
// this loop makes sure that every row will become the same length (the max length of a row)
var maxLengthOfRow = Math.max.apply(Math,values.map(function(item) { return item.length; }));
for(var i=0;i<values.length;i++) {
for(var k=0;k<maxLengthOfRow;k++) {
if(!values[i][k])
values[i].push(""); // add empty entries to create the right length of the row
}
}
var targetSheet = ss.getSheetByName(targetSheetName) ? ss.getSheetByName(targetSheetName) : ss.insertSheet(targetSheetName);
targetSheet.getRange(targetSheet.getLastRow()+1,1,values.length,values[0].length).setValues(values);
}
谢谢你的尝试,但我也需要保留空列,并需要指定确切的列将表格的某些部分留空,然后在提交表格后输入数据。 – Davey
好吧,开始工作!;) –
我不是你完全清楚试图做的是你试图提取只填充行中的列或仅包含值的范围的列?所需输入和输出的屏幕截图会有所帮助。 –
这个脚本不会真的有帮助。它会对电子表格进行排序,以查看第二列是否与某个文本/编号(第一个参数“type”)相对应。 –
@RobinGertenbach我有一个非常大的表格,根据第一个问题被分成许多部分。表单的所有响应都转到表单SortBot中,将它们排列到适当的表单选项卡中。问题是我的函数上面copys在行中的所有单元格(我需要告诉它type = inventory只复制列x,y,z。我试图将列集分成不同的工作表,没有所有的额外列,因为它会导致Android上的大规模滞后和冻结。请注意,有些列将是空的,因为它们将在发送响应之后填充 – Davey