我正在尝试从一张表中提取学生分数,将每个学生的分数平均,然后将其输出到同一张表的新标签中。每位学生在八名教师的性格和领导能力上得分。
我不是行业程序员,所以我正在学习。我已经弄清楚了如何使用Google表格脚本工具将学生及其分数添加到数组中,并将其输出到表格中的新标签页。我已经找到了有关如何对数组中的数字求平均的代码示例,但是我无法使它们中的任何一个起作用。我假设我需要在执行输出之前添加代码以对值求平均值,但是我发现的所有示例似乎都与工作表所使用的编程语言不同,因为当我放置找到的任何代码时都会出错。这就是我要使学生和成绩进入新标签的工作。
function CharAvg(){
var app = SpreadsheetApp;
var sheet = app.getActiveSpreadsheet().getSheetByName("Sheet1");
var map = {};
for(var row = 3; row <=297; row++)
{
var studentname = sheet.getRange(row, 2).getValues();
if(studentname != " " && studentname != null && studentname != "")
{
if(!(studentname in map))
{
map[studentname] = [];
}
var character = sheet.getRange(row, 3).getValue();
if(character != " " && character != null)
{
map[studentname].push(character);
}
var leadership = sheet.getRange(row, 5).getValue();
if(leadership != " " && leadership != null)
{
map[studentname].push(leadership);
}
}
else
{
Browser.msgBox(studentname);
}
}
var outputsheet = app.getActiveSpreadsheet().insertSheet("OutPut");
outputsheet.getRange(1, 1).setValue("Student Name");
outputsheet.getRange(1, 2).setValue("Character Avg.");
outputsheet.getRange(1, 3).setValue("Leadership Avg.");
var row = 2;
for (var studentname in map)
{
outputsheet.getRange(row, 1).setValue(studentname);
for(var character in map[studentname])
{
outputsheet.getRange(row, 2).setValue(map[studentname][character]);
for(var leadership in map[studentname])
{
outputsheet.getRange(row, 3).setValue(map[studentname][leadership]);
}
row ++
}
row ++
}
}
如果有人可以在Google表格脚本中帮助我弄清楚该如何做,那将使我们的生活更加轻松。否则,我们可以通过在工作表中手动编写公式来获取平均值,但我们希望尽可能自动执行该过程。谢谢。
答案 0 :(得分:0)
我没有看到您在哪里进行平均。但是该脚本可以完成我认为您要尝试的操作。
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];}
}
}
平均值表: