多个循环谷歌应用程序脚本

时间:2017-05-09 14:23:33

标签: javascript google-apps-script

我目前正在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张单独的表格上,它们是一个缓存所有相关数据的功能,试图限制对表格的调用量,这有所帮助,但还不够。

如何使此代码更高效?我需要添加更多标准,这些标准需要更多循环才能为作业找到正确的工具集,我担心这会导致顶级函数非常快地超出函数调用时间。

0 个答案:

没有答案
相关问题