GSheets:脚本运行速度非常慢,有时不在所有工作表上执行任务

时间:2018-03-25 16:03:06

标签: google-apps-script google-sheets

我的电子表格: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");
}

1 个答案:

答案 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");
}