如何只复制函数内的特定行而不是整行
How to copy only specific rows inside function instead of full row
我有一个功能是从网上获得的,并稍作修改以供我自己使用。我无法开始工作的是如何删除整行并只复制下面函数中的特定行。
我希望能够将每个 sheet 及其对应列的变量传递给函数以进行复制。
例如。 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 个(只是在不同的列中),即使隐藏了列,当我在 freezes/crashes 50% 的时间在移动设备上查看页面(我不确定这是否会完全解决它,因为有很多行的 sheet 仍然在那个主 sheet 上,请注意它将为空白)。这让我产生疑问,如果 sheet 包含那么多从未在移动设备上查看过的单元格,是否会导致 sheet 加载速度非常慢?
谢谢
编辑:
Link 到包含 form/sheet/ 脚本的 Drive 文件夹
https://drive.google.com/folderview?id=0B-7N8A7FPKw5V20yRVFQcmNZTlk&usp=sharing
编辑2:
最近几天我一直在努力解决这个问题,我有一个辅助脚本,我已经半工作了,但下面标记的部分是我想在原始公式中工作的部分
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);
}
}
看看这个!
这将检查每一行,并且只接受非空条目,并将结果放入 sheet 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);
}
所以我无法让它直接从主 sheet "SortBot" 开始工作,所以 SortBot 将所有单元格写入它旁边的另一个 sheet。然后另一个脚本 "moveToSheet" 读取新的 sheet 和 t运行 将所有需要的列转移到新的 sheet.
我 运行 遇到的一个问题是发送到新表单的所有响应我无法观察更改和 运行 触发器。因此,当收到响应并且页面打开时,我将单元格 C2 设置为 "Not sorted" select C2 (Dropdown) 和 select "Sorted" 然后它将对 sheet.
进行排序
如果有人想了解该系统的更多功能,请告诉我,我正计划制作我完成的系统的视频演练供其他人使用
// 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);
}
}
我有一个功能是从网上获得的,并稍作修改以供我自己使用。我无法开始工作的是如何删除整行并只复制下面函数中的特定行。
我希望能够将每个 sheet 及其对应列的变量传递给函数以进行复制。
例如。 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 个(只是在不同的列中),即使隐藏了列,当我在 freezes/crashes 50% 的时间在移动设备上查看页面(我不确定这是否会完全解决它,因为有很多行的 sheet 仍然在那个主 sheet 上,请注意它将为空白)。这让我产生疑问,如果 sheet 包含那么多从未在移动设备上查看过的单元格,是否会导致 sheet 加载速度非常慢?
谢谢
编辑:
Link 到包含 form/sheet/ 脚本的 Drive 文件夹
https://drive.google.com/folderview?id=0B-7N8A7FPKw5V20yRVFQcmNZTlk&usp=sharing
编辑2:
最近几天我一直在努力解决这个问题,我有一个辅助脚本,我已经半工作了,但下面标记的部分是我想在原始公式中工作的部分
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);
}
}
看看这个! 这将检查每一行,并且只接受非空条目,并将结果放入 sheet 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);
}
所以我无法让它直接从主 sheet "SortBot" 开始工作,所以 SortBot 将所有单元格写入它旁边的另一个 sheet。然后另一个脚本 "moveToSheet" 读取新的 sheet 和 t运行 将所有需要的列转移到新的 sheet.
我 运行 遇到的一个问题是发送到新表单的所有响应我无法观察更改和 运行 触发器。因此,当收到响应并且页面打开时,我将单元格 C2 设置为 "Not sorted" select C2 (Dropdown) 和 select "Sorted" 然后它将对 sheet.
进行排序如果有人想了解该系统的更多功能,请告诉我,我正计划制作我完成的系统的视频演练供其他人使用
// 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);
}
}