Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在googlescript上优化迭代脚本_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 在googlescript上优化迭代脚本

Javascript 在googlescript上优化迭代脚本,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正试图让这个脚本运行得更快 function refreshWeeklyReport() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var weeklyReportSheet = ss.getSheetByName("Weekly Report"); var oneDayAgoReport = initializeDaysAgoReportObject(3,1,1); var twoDaysAgoReport = in

我正试图让这个脚本运行得更快

function refreshWeeklyReport() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var weeklyReportSheet = ss.getSheetByName("Weekly Report");

  var oneDayAgoReport = initializeDaysAgoReportObject(3,1,1);
  var twoDaysAgoReport = initializeDaysAgoReportObject(11,1,2);
  var threeDaysAgoReport = initializeDaysAgoReportObject(19,1,3);
  var fourDaysAgoReport = initializeDaysAgoReportObject(27,1,4);
  var fiveDaysAgoReport = initializeDaysAgoReportObject(35,1,5);
  var sixDaysAgoReport = initializeDaysAgoReportObject(43,1,6);
  var sevenDaysAgoReport = initializeDaysAgoReportObject(51,1,7);

  var reports = [oneDayAgoReport, twoDaysAgoReport, threeDaysAgoReport, fourDaysAgoReport, fiveDaysAgoReport, sixDaysAgoReport, sevenDaysAgoReport];

  reports.forEach(function(report) {
    // Assign random colors
    var colorDiff = randomColor(150);
    var r = colorDiff.r;
    var g = colorDiff.g;
    var b = colorDiff.b;
    var summary = getSumsForDates(report.date, addDays(report.date,1), true, r,g,b, false);
    Logger.log('Summary' + JSON.stringify(summary));
    Logger.log('Report' + JSON.stringify(report));
    report.linearFeetCell.setValue(summary.linearFeet);
    report.piecesCell.setValue(summary.pieces);
    report.boardFootageCell.setValue(summary.boardFootage);
    report.trussesCell.setValue(summary.trusses);
    report.salesDollarsCell.setValue(summary.salesDollars);
    report.setupsCell.setValue(summary.setups);
    // Randomize colors here
    report.dayCell.setBackgroundRGB(r, g, b);

  });
}
下面是正在调用的另一个函数:

function initializeDaysAgoReportObject(startRow, startColumn, numberOfDaysAgo)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var weeklyReportSheet = ss.getSheetByName("Weekly Report");

  var daysAgoReport = {}; // Creates an object

  // Variables
  daysAgoReport.startRow = startRow;
  daysAgoReport.startColumn = startColumn;
  daysAgoReport.date = minusDays(new Date(), numberOfDaysAgo);
  daysAgoReport.date.setHours(0);
  daysAgoReport.day = days[daysAgoReport.date.getDay()];
  daysAgoReport.dateCell = weeklyReportSheet.getRange(startRow,startColumn + 1);
  daysAgoReport.dayCell = weeklyReportSheet.getRange(startRow,startColumn);

  daysAgoReport.linearFeetCell = weeklyReportSheet.getRange(startRow+1,startColumn+1);
  daysAgoReport.piecesCell = weeklyReportSheet.getRange(startRow+3,startColumn+1);
  daysAgoReport.boardFootageCell = weeklyReportSheet.getRange(startRow+5,startColumn+1);
  daysAgoReport.trussesCell = weeklyReportSheet.getRange(startRow+1,startColumn+7);
  daysAgoReport.salesDollarsCell = weeklyReportSheet.getRange(startRow+1,startColumn+4);
  daysAgoReport.setupsCell = weeklyReportSheet.getRange(startRow+2,startColumn+7);

  daysAgoReport.nonOverTimeLaborCostCell = weeklyReportSheet.getRange(startRow+4,startColumn+4);
  daysAgoReport.overTimePremiumCostCell = weeklyReportSheet.getRange(startRow+6,startColumn+4);

  daysAgoReport.nonOverTimeLaborHoursCell = weeklyReportSheet.getRange(startRow+2,startColumn+10);
  daysAgoReport.overTimeLaborHoursCell = weeklyReportSheet.getRange(startRow+4,startColumn+10);

  var displayDate = addDays(daysAgoReport.date,1);
  daysAgoReport.dayCell.setValue(daysAgoReport.day);
  daysAgoReport.dateCell.setValue(displayDate);

  //set labor cells
  var laborData = getTotalsFromLabor(daysAgoReport.date);

  daysAgoReport.nonOverTimeLaborCostCell.setValue(laborData.regularLaborCost);
  daysAgoReport.overTimePremiumCostCell.setValue(laborData.overTimePremium);

  daysAgoReport.nonOverTimeLaborHoursCell.setValue(laborData.regularHours);
  daysAgoReport.overTimeLaborHoursCell.setValue(laborData.overtimeHours);

  return daysAgoReport;
}
此函数执行以下计算:

function getSumsForDates(dateStart, dateEnd, highlightActiveRows, r,g,b, clearInActiveRows)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var reportSheet = ss.getSheetByName("Custom Report");
  var summary = {};
  summary.linearFeet = 0;
  summary.pieces = 0;
  summary.boardFootage =0;
  summary.trusses = 0;
  summary.salesDollars = 0;
  summary.setups = 0;

  var summaryOffset = 15;
  // If Customeer Report data exceeds 3000, TypeError will occur.
  var dateColumn = reportSheet.getRange(summaryOffset,17,3000,1); 
  var values = dateColumn.getValues(); // get all data in one call
  var currentRow = 0;

  while ( values[currentRow][0] != "" ) {
    var dateBuilt = new Date(values[currentRow][0]); 
    var afterStart = dateBuilt.getTime() >= dateStart.getTime();
    var beforeEnd = dateBuilt.getTime() <= dateEnd.getTime()
    var currentRange = reportSheet.getRange(currentRow + summaryOffset,1,1,17)
    var currentValues = currentRange.getValues();
    if( afterStart && beforeEnd )
    {
      var linearFeet = currentValues[0][6];
      var pieces = currentValues[0][9];
      var boardFootage = currentValues[0][13];
      var trusses = currentValues[0][1];
      var salesDollars = currentValues[0][15];

      summary.linearFeet += linearFeet;
      summary.pieces += pieces;
      summary.boardFootage += boardFootage;
      summary.trusses += trusses;
      summary.salesDollars += salesDollars;
      summary.setups++

        if(highlightActiveRows)
        {
          currentRange.setBackgroundRGB(r,g,b);
        }
    }
    else
    {
        if(clearInActiveRows)
        {
          currentRange.setBackgroundRGB(255,255,255);
        }
    }
    currentRow++;
  }

  return summary;
}
函数getSumsForDates(日期开始、日期结束、highlightActiveRows、r、g、b、ClearInactivativeRows)
{
var ss=SpreadsheetApp.getActiveSpreadsheet();
var reportSheet=ss.getSheetByName(“自定义报告”);
var-summary={};
summary.linearFeet=0;
summary.pieces=0;
summary.BoardCutes=0;
总结:桁架=0;
summary.salesDollars=0;
summary.setups=0;
var总和偏差=15;
//如果Customeer报告数据超过3000,则会发生TypeError。
var dateColumn=reportSheet.getRange(总和偏移量,173000,1);
var values=dateColumn.getValues();//在一次调用中获取所有数据
var currentRow=0;
while(值[currentRow][0]!=“”){
var DateBuild=新日期(值[currentRow][0]);
var afterStart=datebuild.getTime()>=dateStart.getTime();

var beforeEnd=datebuild.getTime()在多达3000行的循环中,
var currentValues=currentRange.getValues();
getValues
是一个开销相当大的命令。我会在
之前加上
getDataRange().getValues()
(我可能会保留
dateColumn.getValues()
,以简化事情)然后重新计算
currentValues
。总的来说,这应该可以节省很多时间。顺便说一句,我对你的行“//如果Customeer报告数据超过3000,将发生TypeError。”-这是怎么回事?