需要比循环更有效的解决方案

时间:2017-12-19 19:56:28

标签: optimization google-apps-script google-sheets

我正在构建一个电子表格,用于跟踪正在进行的工作,因为它正在逐步完成制造流程。

该过程的每个步骤都有一个列,其中总的部分移动到每个阶段。移动到舞台的部件数量在此列的左侧(部件一次移动几个部件)。

我的scrpit然后获取“添加”列中的值,将它们添加到“总计”列,然后将“添加”列重置为“”。

以下是代码:

function addColumns() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    // ss is now the spreadsheet the script is associated with
    var sheet = ss.getSheets()[0]; // sheets are counted starting from 0
    // sheet is the first worksheet in the spreadsheet

    for (var i=4; i<500; i++ ) {
        if(sheet.getRange(i,1).getValue()>0){ //Only run if order number not empty
            //Breakout Column
            var add = sheet.getRange(i,6);
            var total = sheet.getRange(i,7);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            //CNC Column
            var add = sheet.getRange(i,8);
            var total = sheet.getRange(i,9);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            //CutSand Column 
            var add = sheet.getRange(i,10);
            var total = sheet.getRange(i,11);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            //Lasered Column
            var add = sheet.getRange(i,12);
            var total = sheet.getRange(i,13);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            //To Finishing Column
            var add = sheet.getRange(i,14);
            var total = sheet.getRange(i,15);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            // Defective Column
            var add = sheet.getRange(i,17);
            var total = sheet.getRange(i,18);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
            //Etsy Column
            var add = sheet.getRange(i,20);
            var total = sheet.getRange(i,21);
            total.setValue(total.getValue() + add.getValue());
            add.setValue("");
        }
        if(sheet.getRange(i,4).getValue()<1){i=500} //Once you find a blank order exit the loop
    }
}

我写的代码确实完成了这个;它完全符合我的需要。问题是,由于代码在每个循环上访问电子表格,每个单元格需要几乎整整一秒才能运行,并且每个订单有7个步骤,一次需要几分钟才能运行大量订单...

这是一个非常简单的数学任务,所以必须有一种更有效的方法,我只是找不到合适的关键字来描述我需要做什么。

我很高兴能够学到任何需要做的事情,只需知道要走向何方。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我建议做这样的事情:(未经测试)

function addColumns() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; // Refers to the first worksheet in the spreadsheet
    var data = sheet.getDataRange().getValues(); // Acquires all values of the sheet
    for (var i = 3; i < data.length; i++) { // Loop over every row
        if (data[i][0].length > 0) { // Check if first column has a value

            // Breakout
            sheet.getRange(i+1,7).setValue(parseFloat(data[i][6]) + parseFloat(data[i][5]));
            sheet.getRange(i+1,6).clear();

            // Repeat code above for other columns
        }
    }
}

此代码从工作表中获取所有数据,而不是循环固定数量的500行。假设您的数据从第4行开始,我也在上面的代码中实现了这一点。

变量data一次获取所有数据,而不是一直尝试获取每个范围(单元格)的值。我希望这会在一段时间内保存你的脚本。

因为我们一次获取数据,所以脚本将值视为字符串。在我们计算总列的新值之前,我们将值解析为float(带小数的数字)。

上面的代码没有经过测试,因为我没有准备好与您一样的格式,但我认为逻辑清晰,如果它不起作用,我想你应该能够调整它以适用于您的工作表。