我目前正在GAS工作,根据多个标准创建和优化搜索功能。
我的代码有效,但在搜索完成之前函数调用是否会超时是不一致的。
//Top level function to run the sub-level OD, ID, End Ring, Pusher, and Bushing Length functions
function toolSearch(od, id, mat) {
var od1 = parseFloat(od);
var id1 = parseFloat(id);
var inc = .25; //change to 0 when standardized bushings are implemented
var passOutput = [];
var failOutput = ["Tooling Unavailable", "Contact CPI Stafford Materials Engineer"];
if (od1 > 49 || id1 > 46)
return failOutput;
//If statement to determine amount of end rings required based on OD shell size and material
if (mat == "Hot Mold" && od < 10)
var qER = 4;
else
qER = 2;
//Initial tooling search
var od2 = toolSearchOD(od1);
var id2 = toolSearchID(id1);
var er = toolSearchER(od2, id2);
var ps = toolSearchPS(od2);
var wall = wallCall(od2, id2);
//return variables must be parsed from strings to integers and decimals
od2 = parseFloat(od2);
id2 = parseFloat(id2);
er = parseInt(er);
ps = parseInt(ps);
wall = parseFloat(wall);
//Remove comments when standardized bushings are implemented
/*if(id>10)
{inc = .5;}
else
{inc = .25;}*/
//If statement to check for pusher and end ring requirments before moving into for loop
if (er < qER || ps < 1) {
//For loop to find OD and ID shells, the required quantity of end rings, and the pusher
for (var i = 0; i < 50; i++) { //Loop is set at 75 in order to prevent 30 second function time out. May need to be adjusted.
od2 += inc;
od2 = toolSearchOD(od2);
od2 = parseFloat(od2);
wall = wallCall(od2, id2);
wall = parseFloat(wall);
er = toolSearchER(od2, id2);
er = parseInt(er);
ps = toolSearchPS(od2);
ps = parseInt(ps);
if (wall > 3) {
id2 -= inc
id2 = toolSearchID(id2);
id2 = parseFloat(id2);
od2 = od1 - inc;
od2 = parseFloat(od2);
er = toolSearchER(od2, id2);
er = parseInt(er);
}
if (er >= qER && ps >= 1)
break;
}
}
//A final check to make sure that the variable is parsed to an integer or decimal
od2 = parseFloat(od2);
id2 = parseFloat(id2);
er = parseInt(er);
ps = parseInt(ps);
wall = parseFloat(wall);
var blength = bLength(mat, od2, id2); //Bushing Length function input/output
//If statement to check if requirements have been met to return the proper information
if (er < qER || ps < 1 || wall > 3) {
return failOutput;
} else {
passOutput = [od2, id2, blength, er, ps, wall];
return passOutput;
}
}
//A final check to make sure that the variable is parsed to an integer or decimal
od2 = parseFloat(od2);
id2 = parseFloat(id2);
er = parseInt(er);
ps = parseInt(ps);
wall = parseFloat(wall);
var blength = bLength(mat,od2, id2); //Bushing Length function input/output
//If statement to check if requirements have been met to return the proper information
if(er < qER || ps < 1 || wall > 3){
Logger.log("FAILURE TO FIND SIZE " + passOutput);
return failOutput;}
else{
passOutput = [od2,id2, blength,er, ps, wall];
return passOutput;}
}
//****************************************************************************************
//Sub-function for searching the shell OD inventory, based on the updated OD from toolSearch
function toolSearchOD(od) {
var range = CacheService.getScriptCache().get('rangeSHOD');//Call to data in cache
range = Utilities.parseCsv(range);//All returns from cache need to be parsed from a CSV format to a horizontal array with a permanent row of zero
var size = lastRow("Shell Inventory");//Call to sub-function to determine index of last row of the sheet with data in it.
var found = 0;
od = parseFloat(od);//A built in check to make sure that the variable is parsed to a decimal
var inc = .25;//change to 0 when standardized bushings are implemented
//Remove comments when standardized bushings are implemented
/*if(od>10)
{var inc = .5;}
else
{inc = .25;}*/
while (found != 1){
for(var j=0;j<size;j++)
{
if(range[0][j] == od){
od = range[0][j];
found = 1;
}
}
if(found != 1)
od+=inc;
}
return od;
}
//****************************************************************************************
//Sub-function for searching the shell OD inventory, based on the updated ID from toolSearch
function toolSearchID(id) {
var range = CacheService.getScriptCache().get('rangeSHID');
range = Utilities.parseCsv(range);
var size = lastRow("Shell Inventory");
var found = 0;
id = parseFloat(id);
var inc = .25;//change to 0 when standardized bushings are implemented
//Remove comments when standardized bushings are implemented
/*if(id>10)
{var inc = .5;}
else
{inc = .25;}*/
while (found != 1){
for(var j=0;j<size;j++)
{
if(range[0][j] == id){
id = range[0][j];
found = 1;
}
}
if(found != 1)
id-=inc;
}
return id;
}
//****************************************************************************************
//Sub-function for searching the end ring inventory, based on the updated ID and OD values from toolSearchID and toolSearchOD.
function toolSearchER(od,id) {
var rangeOD = CacheService.getScriptCache().get('rangeEROD');
var rangeID = CacheService.getScriptCache().get('rangeERID');
var rangeQTY = CacheService.getScriptCache().get('rangeERQTY');
rangeOD = Utilities.parseCsv(rangeOD);
rangeID = Utilities.parseCsv(rangeID);
rangeQTY = Utilities.parseCsv(rangeQTY);
var size = lastRow("End Ring Inventory");
var erQTY = 0;
od = parseFloat(od);
id = parseFloat(id);
for(var j=0;j<size;j++)
{
if(rangeID[0][j] == id && rangeOD[0][j] == od){
erQTY += parseInt(rangeQTY[0][j]);
}
}
return erQTY;
}
//****************************************************************************************
//Sub-function for searching the end ring inventory, based on the updated ID and OD values from toolSearchID and toolSearchOD.
function toolSearchPS(od) {
var rangeQTY = CacheService.getScriptCache().get('rangePSQTY');
var rangeOD = CacheService.getScriptCache().get('rangePSOD');
rangeOD = Utilities.parseCsv(rangeOD);
rangeQTY = Utilities.parseCsv(rangeQTY);
var size = lastRow("Pusher Inventory");
var psQTY = 0;
od = parseFloat(od);
od -= .25;
for(var j=0;j<size;j++)
{
if(rangeOD[0][j] == od){
psQTY = rangeQTY[0][j];
}
}
return psQTY;
}
//****************************************************************************************
//Sub-function to calculate bushing wall size based on updated OD and ID inputs from toolSearch, toolSearchOD, and toolSearchID
function wallCall(od,id){
var wall;
wall = (od-id)/2;
return wall;
}
//****************************************************************************************
//Sub-function that puts all required data into a Google cache for more efficent processing. Cache time limit is 1 hour
function cache(){
var ss = SpreadsheetApp.getActive();
var sheetSH = ss.getSheetByName("Shell Inventory");
var sheetSHL = sheetSH.getRange("F2:F").getValues();
var sheetER = ss.getSheetByName("End Ring Inventory");
var sheetPS = ss.getSheetByName("Pusher Inventory");
var rangeSHOD = sheetSH.getRange("D2:D").getValues();
var rangeSHID = sheetSH.getRange("C2:C").getValues();
var rangeERQTY = sheetER.getRange("H2:H").getValues();
var rangeEROD = sheetER.getRange("C2:C").getValues();
var rangeERID = sheetER.getRange("D2:D").getValues();
var rangePSQTY = sheetPS.getRange("G2:G").getValues();
var rangePSOD = sheetPS.getRange("B2:B").getValues();
CacheService.getScriptCache().put('rangeSHOD',rangeSHOD,3600);
CacheService.getScriptCache().put('rangeSHID',rangeSHID,3600);
CacheService.getScriptCache().put('sheetSHL' ,sheetSHL,3600);
CacheService.getScriptCache().put('rangeERID',rangeERID,3600);
CacheService.getScriptCache().put('rangeEROD',rangeEROD,3600);
CacheService.getScriptCache().put('rangeERQTY',rangeERQTY,3600);
CacheService.getScriptCache().put('rangePSQTY',rangePSQTY,3600);
CacheService.getScriptCache().put('rangePSOD',rangePSOD,3600);
}
//****************************************************************************************
//Sub-function to calculate the index of last row of data for a sheet
function lastRow(sheetName){
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName(sheetName);
var size=sheet.getLastRow();
return size;
}
//****************************************************************************************
//Sub-function to calculate bushing length based on OD and ID shell lengths and type of material
function bLength (mat,od, id){
var rangeID = CacheService.getScriptCache().get('rangeSHID');
var rangeOD = CacheService.getScriptCache().get('rangeSHOD');
var rangeL = CacheService.getScriptCache().get('sheetSHL');
rangeID = Utilities.parseCsv(rangeID);
rangeOD = Utilities.parseCsv(rangeOD);
rangeL = Utilities.parseCsv(rangeL);
var size = lastRow("Shell Inventory");
var lengthID = 0;
var lengthOD = 0;
var blength = 0;
id = parseFloat(id);
od = parseFloat(od);
//Find ID shell length
for(var j=0;j<size;j++)
{
if(rangeID[0][j] == id){
lengthID = rangeL[0][j];
}
}
found = 0;
//Find OD shell length
for(var j=0;j<size;j++)
{
if(rangeOD[0][j] == od){
lengthOD = rangeL[0][j];
}
if(lengthID == 18){
blength = "5 inches *Configuration not recommended*.";}
else if (lengthOD == 18)
blength = "5 inches";
else if(mat == "Hot Mold"){
blength = "6 inches";}
else
blength = "9 inches";
return blength;
}
}
function matType(mat){
var hot = 0;
var matType;
switch (mat){
case 620:
hot = 1;
break;
case 603:
hot = 1;
break;
case 604:
hot = 1;
break;
case 611:
hot = 1;
break;
case 605:
hot = 1;
break;
case 608:
hot = 1;
break;
case 580:
hot = 1;
break;
case 607:
hot = 1;
break;
default:
break;
}
if (hot == 1)
matType = "Hot Mold";
else
matType = "Cold Mold";
return matType;
}
是的,我知道它很笨重。 “for”循环要求是为了防止脚本超时,但它远没有效果,我知道有更好的方法。
数据在3张单独的表格上,它们是一个缓存所有相关数据的功能,试图限制对表格的调用量,这有所帮助,但还不够。
如何使此代码更高效?我需要添加更多标准,这些标准需要更多循环才能为作业找到正确的工具集,我担心这会导致顶级函数非常快地超出函数调用时间。