简体   繁体   English

脚本执行时间各不相同,可能会很长,任何人都可以提出任何改进建议

[英]Script execution time varies, can be quite long, can anyone suggest any refinements

Thanks to info gathered from here, and direct help in other posts. 感谢从这里收集的信息,并在其他帖子中提供直接帮助。 An idiot like me has managed to form something resembling a script :) 像我这样的白痴已经设法形成了类似脚本的东西:)

And it does exactly what it should, with right results, perfectly. 它可以完美地完成应有的工作,并获得正确的结果。 Happy days. 快乐的时光。 But unfortunately it can take a while to execute (part of the reason its slow, is slow formula in the google sheet, hoping to replace formula with on demand scripts like this one and ditch most bulky formula) 但不幸的是,它可能需要一段时间才能执行(其缓慢的原因是Google工作表中的公式很慢,希望用这样的按需脚本替换公式并放弃最庞大的公式)

Until I get to that stage, I was hoping someone would take a peek at it, and see if there is any overhead/bloat/processing that could be saved. 在进入那个阶段之前,我一直希望有人来看看它,看看是否可以节省任何开销/膨胀/处理。

My current thoughts are that I'm checking the data more than once, when I could try to check all if's at the same time. 我当前的想法是,当我可以尝试同时检查所有数据时,我不止一次检查数据。

I'm also writing to the sheet a few times, perhaps it would be better to put returned values in an array and write once. 我也在表上写过几次,也许最好将返回的值放在数组中并写一次。

So I'm trying to look into that, but I'm still quite new at all this. 因此,我正在尝试研究这一点,但我在这方面还是很新的。

Code simply count's form responses based on a value and date then outputs results to a report. 代码仅根据值和日期对表单响应进行计数,然后将结果输出到报告中。

function snapshot() {
  var dateColumn = 2;
  var findColumn = 4;
  var toFind = "Yes - Complete (going ahead)";  
  var daysWorth = 31; 
  var target = "Snapshot";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
   var targetSheet = ss.getSheetByName(target);
  var sheet = ss.getSheetByName('Form Responses');
  var values = sheet.getDataRange().getValues();

  var today = new Date();
  var thisMorning = today;
  thisMorning.setHours(0);
  thisMorning.setMinutes(0);



  var completed = 0;
  var attempted = 0;
  var totAtt = 0;
  var totCom = 0;

  for (var i = 0; i < daysWorth; i++){
  var startGap = new Date().setTime(thisMorning.getTime() - i*24*60*60*1000);
  var endGap = new Date().setTime(thisMorning.getTime() - (i-1)*24*60*60*1000);

  for(var counter in values){
   var testDate = new Date(values[counter][dateColumn -1]);
   if (testDate > startGap && testDate < endGap && values[counter][findColumn -1] == toFind)
   {completed++;
   totCom++;}
   if (testDate > startGap && testDate < endGap)
   {attempted++;
   totAtt++}
  }



  var output = new Date(startGap);
 //Logger.log("since "+output+" we had: "+completed+" completed and: "+attempted+" attempted");

 targetSheet.getRange(i+2,1).setValue(output);
 targetSheet.getRange(i+2,2).setValue(attempted);
 targetSheet.getRange(i+2,3).setValue(completed);   
 targetSheet.getRange(i+2,4).setValue(completed/attempted*100);

  var completed = 0;
  var attempted = 0;

}
targetSheet.getRange(1,1).setValue("Date");
targetSheet.getRange(1,2).setValue("Attempted");
targetSheet.getRange(1,3).setValue("Completed");
targetSheet.getRange(1,4).setValue("Success Rate");
targetSheet.getRange(33,1).setValue("Totals");
targetSheet.getRange(33,2).setValue(totAtt);
targetSheet.getRange(33,3).setValue(totCom);
targetSheet.getRange(33,4).setValue(totCom/totAtt*100);


}

Thanks for reading :) 谢谢阅读 :)

EDIT 编辑

So here it is, with suggested edits and working. 这样就可以进行建议的编辑和工作。

function snapshot() {
  var dateColumn = 2;
  var findColumn = 4;
  var toFind = "Yes - Complete (going ahead)";  
  var daysWorth = 31; 
  var target = "Snapshot";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = ss.getSheetByName(target);
  var sheet = ss.getSheetByName('Form Responses');
  var values = sheet.getDataRange().getValues();

  var today = new Date();
  var thisMorning = today;
  thisMorning.setHours(0);
  thisMorning.setMinutes(0);
  var archive = [];


  var completed = 0;
  var attempted = 0;
  var totAtt = 0;
  var totCom = 0;

  for (var i = 0; i < daysWorth; i++){
  var startGap = new Date().setTime(thisMorning.getTime() - i*24*60*60*1000);
  var endGap = new Date().setTime(thisMorning.getTime() - (i-1)*24*60*60*1000);

  for(var counter in values){
   var testDate = new Date(values[counter][dateColumn -1]);
   if (testDate > startGap && testDate < endGap && values[counter][findColumn -1] == toFind)
   {completed++;
   totCom++;}
   if (testDate > startGap && testDate < endGap)
   {attempted++;
   totAtt++}

  }



  var output = new Date(startGap);
  if(!completed/attempted)
    {var success = 0;}
    else
   {var success = completed/attempted*100;}


 archive.push( [output, attempted, completed,success] ); 
  var completed = 0;
  var attempted = 0;

}
  var headers =[["Date","Attempted","Completed","Success Rate"]];
  var footers =[["Totals",totAtt,totCom,totCom/totAtt*100]];  
  targetSheet.getRange(1,1,1,4).setValues(headers);
  targetSheet.getRange(2,1).offset(0, 0, archive.length, archive[0].length).setValues(archive);
  targetSheet.getRange(33,1,1,4).setValues(footers);    


}

Thanks for the feedback and if anyone has anymore, I'm all ears. 感谢您的反馈,如果有任何其他人,我会很高兴。

"perhaps it would be better to put returned values in an array and write once." “也许最好将返回的值放入数组中并写入一次。” - yep, gotta figure out how to .setValues() once. -是的,必须弄清楚如何一次.setValues()。

targetSheet.getRange(i+2,1).setValue(output); targetSheet.getRange第(i + 2,1).setValue(输出); targetSheet.getRange(i+2,2).setValue(attempted); targetSheet.getRange第(i + 2,2).setValue(尝试); targetSheet.getRange(i+2,3).setValue(completed); targetSheet.getRange第(i + 2,3).setValue(完成);
targetSheet.getRange(i+2,4).setValue(completed/attempted*100); targetSheet.getRange第(i + 2,4).setValue(完成/试图* 100);

should be some thing like... 应该是...

myArray.push( [output, attempted, completed, completed/attempted*100] ); myArray.push([输出,尝试,完成,完成/尝试* 100]);

then outside the loop... 然后在循环之外...

targetSheet.getRange('A1').offset(0, 0, myArray.length, myArray[0].length).setValues(myArray); targetSheet.getRange('A1')。offset(0,0,myArray.length,myArray [0] .length).setValues(myArray);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM