Я не видел, где вы делаете усреднение. Но этот сценарий делает то, что я думаю, вы пытались сделать.
function CharAvg() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("Sheet123");
//var rg=sh.getRange(3,1,295,5);//This was your range
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());//this was for my data
var vA=rg.getValues();
var sA=[];//student array
var index=0;
for(var i=0;i<vA.length;i++) {
for(var j=0;j<vA[i].length;j++) {vA[i][j]=vA[i][j].toString().trim();}
if(vA[i][1] && vA[i][2] && vA[i][4]) {
sA.push({studentName:vA[i][1],character:vA[i][2],leadership:vA[i][4]});//each array element is an object
}else{
SpreadsheetApp.getUi().alert('Student Name: ' + vA[i][1]);
}
}
//var osh=ss.insertSheet("outPut");//This was your output spelled differently
var osh=ss.getSheetByName('Sheet117');//This was for my data
osh.appendRow(['Student Name','Character Avg','Leadership Avg']); //appending header
for(var i=0;i<sA.length;i++) {
osh.appendRow([sA[i].studentName,sA[i].character,sA[i].leadership]);//appending rows
}
}
Мой лист ввода:
Мой выходной лист:
Я предполагаю, что ваши данные уже усреднены, потому что я вообще не видел процесса усреднения. Этот подход будет работать намного быстрее, потому что я просто получаю данные один раз и обрабатываю их все в одном массиве, а затем выводю строки, добавляя их.
Похоже ли это на лист ввода данных
Используя приведенную выше таблицу для ввода и следующий код:
Расчет среднего студента
function CharAvg() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("Sheet118");
//var rg=sh.getRange(3,1,295,5);//This was your range
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());//this was for my data
var vA=rg.getValues();
var sA=[];//student array
var sObj={sA:[]};
var index=0;
for(var i=0;i<vA.length;i++) {
for(var j=0;j<vA[i].length;j++) {vA[i][j]=vA[i][j].toString().trim();}
if(vA[i][1] && vA[i][2] && vA[i][4] && vA[i][5]) {
if(sObj.hasOwnProperty(vA[i][1])) {
sObj[vA[i][1]].character=Number(sObj[vA[i][1]].character)+Number(vA[i][2]);
sObj[vA[i][1]].leadership=Number(sObj[vA[i][1]].leadership)+Number(vA[i][4]);
sObj[vA[i][1]].submitted=Number(sObj[vA[i][1]].submitted)+Number(vA[i][5]);
sObj[vA[i][1]].count++;
}else{
sObj[vA[i][1]]=new Score(vA[i][2],vA[i][4],vA[i][5]);
sObj.sA.push(vA[i][1]);
}
sA.push({studentName:vA[i][1],character:vA[i][2],leadership:vA[i][4]});//each array element is an object
}else{
SpreadsheetApp.getUi().alert('Student Name: ' + vA[i][1]);
}
}
var osh=ss.getSheetByName('Sheet126');//This was for my data
osh.clearContents();
osh.appendRow(['Student Name','Character Avg','Leadership Avg','Submitted Avg','Count']); //appending header
for(var i=0;i<sObj.sA.length;i++) {
var row=[sObj.sA[i]].concat(sObj[sObj.sA[i]].row());
osh.appendRow(row);
}
}
function Score(character,leadership,submitted) {
if(character && leadership && submitted) {
this.character=character;
this.leadership=leadership;
this.submitted=submitted;
this.count=1;
this.characterAvg=function(){return Number(this.character)/Number(this.count);};
this.leadershipAvg=function(){return Number(this.leadership)/Number(this.count);};
this.submittedAvg=function(){return Number(this.submitted)/Number(this.count);};
this.row=function(){return [this.characterAvg(),this.leadershipAvg(),this.submittedAvg(),this.count];}
}
}
Таблица средних значений: