我的电子表格:Link
我有以下脚本,它可以让我控制列在特定工作表(A,B,C,D,E)上隐藏/取消隐藏。打开工作表时有一个触发器。如果我从脚本编辑器运行脚本,它确实执行任务,非常慢的表单。然而,如果我尝试打开电子表格,它从表A开始,然后是B,但是没有在B中完成它。知道当前用户没有输入数据,我想知道这是否是最好的方法(担心最后一个电子表格,它非常缓慢地运行计算和这个脚本)
你能帮忙完成这个小任务吗?我对编写脚本知之甚少,这只是我在互联网上找到的一些复制/粘贴,
感谢您的时间!
基本上:我正在尝试控制哪个星期显示,我会显示第1周并隐藏其余部分,然后在接下来的一周,我会显示第2周并隐藏其余部分等。 ..
脚本
function hideColumnsOnSheet(sheetName) {
var b = SpreadsheetApp.getActive().getSheetByName(sheetName);
b.showColumns(1, b.getMaxColumns());
b.getRange('4:4')
.getValues()[0]
.forEach(function (r, i) {
if (r && r == 'x') b.hideColumns(i + 1)
});
}
function onOpen() {
hideColumnsOnSheet("A");
hideColumnsOnSheet("B");
hideColumnsOnSheet("C");
hideColumnsOnSheet("D");
hideColumnsOnSheet("E");
}
答案 0 :(得分:0)
颠倒原始方式以减少昂贵的API调用。隐藏开头的所有列,找到第4行中包含空格的第一列和最后一列,然后显示其间的所有列,我修改了下面的方法:
<强>更新强>
升级到所有列都无法在开始时隐藏,我们将该方法撤回,但仍然只减少到两个hideColumns()
API调用。
function hideColumnsOnSheet(sheetName) {
var b = SpreadsheetApp.getActive().getSheetByName(sheetName);
b.showColumns(1, b.getMaxColumns());
var visibleColumn = [];
b.getRange('J4:4').getValues()[0].forEach(function (r, i) {
if (r != 'x') {
visibleColumn.push(i + 1);
}
});
var freezeColumnsNum = 9;
var indexOfFirstShowColumn = parseInt(visibleColumn[0] + freezeColumnsNum);
var indexOfLastShowColumn = parseInt(visibleColumn.pop() + freezeColumnsNum);
if (indexOfFirstShowColumn != (freezeColumnsNum + 1)) {
b.hideColumns(freezeColumnsNum + 1, (indexOfFirstShowColumn - 1) - freezeColumnsNum);
}
b.hideColumns(indexOfLastShowColumn + 1, (b.getMaxColumns() -
indexOfLastShowColumn));
}
function onOpen(e) {
hideColumnsOnSheet("A");
hideColumnsOnSheet("B");
hideColumnsOnSheet("C");
hideColumnsOnSheet("D");
hideColumnsOnSheet("E");
}