GSheets:脚本运行非常缓慢,有时无法在所有工作表上执行任务

GSheets: Script running very slowly and sometimes not performing task on all sheets

我的电子表格:链接

我有以下脚本,它应该使我能够控制在特定工作表(A、B、C、D、E)上隐藏/取消隐藏的列。打开工作表有一个触发器。如果我从脚本编辑器运行脚本,它确实会非常缓慢地逐张执行任务。但是,如果我尝试打开电子表格,它从工作表 A 开始,然后是 B,但没有在 B 中完成。知道当前用户没有输入数据,我想知道这是否是最好的方法(害怕在最后运行计算和此脚本非常缓慢的电子表格)

你能帮忙完成这个小任务吗?我对编写脚本不太了解,这只是我在互联网上找到的一些复制/粘贴,

感谢您的宝贵时间!

基本上:我试图控制显示哪一周,我会显示第 1 周并隐藏其余部分,然后在接下来的一周,我会显示第 2 周并隐藏其余部分,等等...

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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");
}


扭转您原来的方式来减少昂贵的 API 调用。在开头隐藏所有列,在第4行找到第一列和最后一列有空格,然后显示中间的所有列,我修改了如下方法:

更新

由于一开始不能隐藏所有列,我们将方法反向,但仍然减少到只有两个 hideColumns() API 调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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");
}