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。”-这是怎么回事?