我正在构建一个电子表格,用于跟踪正在进行的工作,因为它正在逐步完成制造流程。
该过程的每个步骤都有一个列,其中总的部分移动到每个阶段。移动到舞台的部件数量在此列的左侧(部件一次移动几个部件)。
我的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个步骤,一次需要几分钟才能运行大量订单...
这是一个非常简单的数学任务,所以必须有一种更有效的方法,我只是找不到合适的关键字来描述我需要做什么。
我很高兴能够学到任何需要做的事情,只需知道要走向何方。
提前致谢!
答案 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(带小数的数字)。
上面的代码没有经过测试,因为我没有准备好与您一样的格式,但我认为逻辑清晰,如果它不起作用,我想你应该能够调整它以适用于您的工作表。