如何加速谷歌应用程序脚本api调用xml for循环和sub for循环键值存储

时间:2017-09-15 17:04:29

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

请有人可以审查并建议探索优化和加速的途径。我没有想法。这是一个从谷歌电子表格应用程序脚本调用的功能,现在有200多个工作,有点慢。

有关更快构造的建议,而不是" for"环?或者其他聪明的优化想法。它是通过键值存储解析任务的子例程吗?也许有一种更聪明的方法可以做到这一点?

有兴趣学习更好的方法。

非常感谢你能花一点时间来帮助

*最后的api响应示例

function updateTracker() {
  var output = [];

  // fetch and parse doc
  var document = xmlFetch('https://api.blahblah');

  //locate child set
  var jobset = document.getRootElement().getChild("Jobs").getChildren();

  //get api call status
  var WFMcallstatus = document.getRootElement().getChild("Status").getValue();
  if (WFMcallstatus != "OK") {  
    return "Call Failed"
  }

  //loop through jobs
  for (var i = 0; i < jobset.length; i++) {

    //job attrib from xml
    var jobstate= jobset[i].getChild("State").getValue();
    if (jobset[i].getChild("Type")) {
      var jobtype= jobset[i].getChild("Type").getValue();
    } else {
      var jobtype= "";
    }
    var jobid = jobset[i].getChild("ID").getValue();    
    var jobname = jobset[i].getChild("Name").getValue();
//    var jobdescription = jobset[i].getChild("Description").getValue();
    var jobclient = jobset[i].getChild("Client").getChild("Name").getValue();

    //array the wanted fields for our output row
    var jobrow = [jobstate, jobtype, jobname, jobclient];

    // subloop job tasks
    var taskelem = jobset[i].getChild("Tasks").getChildren();
    var tasks = parseTasks(taskelem);

    //prepare urls
    var intid = jobset[i].getChild("InternalID").getValue();
    var wfmurls = wfmUrls(intid, jobid);

    // concat arrays for saving   
    var jobrowconcat = wfmurls.concat(jobrow,tasks);

    //push to 2d array
    output.push(jobrowconcat);

  }
  return output
} 

//job task iterator
function parseTasks(taskelem) {


  //get a new keystore to find the element values of the custom fields from their id's
  var tknewob  = storedTkkeys()

  for (var j = 0; j < taskelem.length; j++) {
    //      var taskname = taskarray[j].getChild("Name").getValue();

    var taskid = taskelem[j].getChild("TaskID").getValue();

    if (taskid in tknewob) {
      var taskstate = taskelem[j].getChild("Completed").getValue();
      if (taskstate == "true") {
        taskstate = "✔";
      } else {
        taskstate = "X"; 
      }
      //using id and state we can build another ordered json
      var tkvalstr = ""+taskstate;
      tknewob[taskid].taskstate = tkvalstr;            
    }
  }
  // make a full row set with empty spaces to fill gaps
  var tkjobrow = [];
  for (var key in tknewob) {
    var obj = tknewob[key];
    var prop = "taskstate";
    if (obj.hasOwnProperty(prop)) {
      tkjobrow.push(obj[prop]);
    } else {
      tkjobrow.push("");
    }           
  }  
  return tkjobrow
}

// key store for tasks
function storedTkkeys() {
  //key values
  var taskkeystore = {2667746: { name: "(t1) Lead 1st Contact"},
                      2667747: { name: "(t2) Lead 1st Follow Up"},
                      2667753: { name: "(t3) Lead 2nd Follow Up" },
                      2667749: { name: "(t4) Quote Request"},
                      2667751: { name: "(t5) Quote Issued and Sent"},
                      2667754: { name: "(t6) Quote 1st Follow Up" },
                      2667755: { name: "(t7) Quote 2nd Follow Up"},
                      2667757: { name: "(t8) Contract Requested"},
                      2667759: { name: "(t9) Contract & Deposit Invoice Issued and Sent"},
                      2667762: { name: "(ta) Contract 1st Follow Up"},
                      2667766: { name: "(tb) Contract 2nd Follow Up"},
                      2677091: { name: "(tc) Contract signed"},
                      2677135: { name: "(td) Contract Confirmed"}, 
                      2667773: { name: "(te) Deposit Invoice 1st Follow Up"},
                      2667774: { name: "(tf) Deposit Invoice 2nd Follow Up"},
                      2684065: { name: "(tg) Deposit Invoice Paid"},                      
                      2667772: { name: "(th) Final Invoice Approved and Sent"},                                           
                      2667775: { name: "(ti) Final Invoice 1st Follow Up" },
                      2667776: { name: "(tj) Final Invoice 2nd Follow Up" }, 
                      2677121: { name: "(tk) Account Settled"}};
  return taskkeystore
}

<Response api-method="List">
<Status>OK</Status>
<Jobs>
<Job>
<ID></ID>
<Name></Name>
<Description></Description>
<Client>
<ID></ID>
<Name></Name>
</Client>
<ClientOrderNumber></ClientOrderNumber>
<State></State>
<Type></Type>
<StartDate></StartDate>
<DueDate></DueDate>
<CompletedDate></CompletedDate>
<InternalID></InternalID>
<Assigned/>
<Tasks>
<Task>
<ID>62028029</ID>
<Name>(t1) Lead 1st Contact</Name>
<TaskID>2667746</TaskID>
<Description>First contact with a lead</Description>
<Completed>true</Completed>
<Billable>false</Billable>
<Folder>1 Lead</Folder>
</Task>
<Task>
<ID>62028030</ID>
<Name>(t2) Lead 1st Follow Up</Name>
<TaskID>2667747</TaskID>
<Description/>
<Completed>true</Completed>
<Billable>false</Billable>
<Folder>1 Lead</Folder>
</Task>

0 个答案:

没有答案