从数组中的工作表提取的平均值

时间:2019-04-12 12:46:07

标签: google-apps-script google-sheets

我正在尝试从一张表中提取学生分数,将每个学生的分数平均,然后将其输出到同一张表的新标签中。每位学生在八名教师的性格和领导能力上得分。

我不是行业程序员,所以我正在学习。我已经弄清楚了如何使用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表格脚本中帮助我弄清楚该如何做,那将使我们的生活更加轻松。否则,我们可以通过在工作表中手动编写公式来获取平均值,但我们希望尽可能自动执行该过程。谢谢。

input

1 个答案:

答案 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  
  }
}

我的输入表:

enter image description here

我的输出表:

enter image description here

  

我认为您的数据已经平均,因为我根本没有任何平均过程。这种方法的运行速度要快得多,因为我只获取一次数据并在一个数组中处理所有数据,然后通过附加行来输出行。

这看起来像输入数据表

enter image description here

使用上表进行输入和以下代码:

计算学生平均水平

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];}
  }
}

平均值表:

enter image description here