我一直试图找出Google表格中的一些批量技术,这些技术在Excel中很容易实现。
在包含22个选项卡的工作簿上,前12个选项卡以一年中的几个月命名。我尝试自动隐藏仅在前12个标签中以A列开头的某些行。
我的当前脚本非常慢,因为它是逐行计算的。
我想在名为JAN,FEB等的前12个标签上选择行5到94 上的数据,不包括计算前的剩余标签跑。我似乎无法掌握阵列功能,如果这是最好的技术。
您可以提供批量处理这些行的任何帮助,我们将不胜感激。
function hideRows() {
["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"].forEach(function (s) {
var sheet = SpreadsheetApp.getActive()
.getSheetByName(s)
sheet.unhideRow(sheet.getRange('A1:X94'))
sheet.getRange('A1:X94')
sheet.getRange('A1:X94')
.getValues()
.forEach(function (r, i) {
if (!r[0]) sheet.hideRows(i + 1)
});
});
}
答案 0 :(得分:0)
按列A排序,批量隐藏行,然后取消排序。
function hideRows() {
var sheet, range, values, row, col95, // col95 will be a helper column that will unsort back to the original order.
arr95 = []; // this array will hold the values for col95
for (i = 0; i < 95; i++) {
arr95.push([i + 1]);
}
["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"].forEach(function (s) {
sheet = SpreadsheetApp.getActive()
.getSheetByName(s);
sheet.insertColumnAfter(1); // this column, used for sorting, will be deleted at the end.
col95 = sheet.getRange("B1:B95");
col95.setValues(arr95);
range = sheet.getRange('1:94'); // don't specify A1:X94 in case you have data in Column Y
range.sort(1);
range = sheet.getRange('1:94');
sheet.unhideRow(range);
values = range.getValues();
row = 94; // resetting row to a neutral number
for (r = 0, i = 0; r < values.length; r++) {
if (!values[r][0]) {
row = r + 1;
break; // as soon as we get an empty A-cell, the row is set and the loop ends.
}
}
if (row < 94) sheet.hideRow(sheet.getRange(row + ':94')); // batch-hiding all rows with an empty col A
range = sheet.getRange('1:94');
range.sort(2);
sheet.deleteColumn(2); // the unsorting column is deleted.
});
}
这是批次隐藏行:
if (row < 94) sheet.hideRow(sheet.getRange(row + ':94')); // batch-hiding all rows with an empty col A
与原始代码相比,此代码在我的测试中将运行时间减少了10倍。权衡的是它并不简洁。
答案 1 :(得分:0)
forEach
似乎在这里过度使用。此外,该脚本采用了一种非常不寻常的结构。
假设它总是第一次 12张,你要么不关心数据出现的顺序,要么有一个你可以排序的列
function hideRows() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
var count
for (count = 0; count < 12; count++) {
// sort the sheet by column A ascending to get all empty cells at the bottom
sheets[count].sort(1,true)
// find out the last row with data on column A
var lastRow = sheets[count].getRange('A5:A94').getLastRow()
// hide all rows bellow the last data row. You need to add 1 for the first empty row and 5 more because we skipped a few when getting the range
sheets[count].hideRows(lastRow + 6, 94 - lastRow)
// If you don't care how it's sorted leave it, or sort by the correct column here
}
}
这应该尽可能少地批量调用SpreadsheetApp。我没有测试这段代码,只是直接写在这里,所以你可能想检查一些东西(比如下面会在底部或顶部放置空行)以及hideRows
索引的计算。
编辑:刚检查getLastRow()
将返回所选范围的最后一个索引,而不是最后一行包含实际数据,因此,如果您的范围为A5:A94
,那么将返回94
,因此它的工作方式略有不同,如果它是一张工作表。但是你可以简单地运行一个for
来检查值对数组的空字符串,因为你只需要在值停止时找到它就更快了。