【问题标题】:Averaging values pulled from sheets in an array从数组中的工作表中提取的平均值
【发布时间】:2019-09-03 05:41:16
【问题描述】:

我正在尝试从工作表中提取学生分数,对每个学生进行平均,然后将它们输出到同一工作表中的新选项卡。每个学生的性格和领导能力由八位老师打分。

我不是专业的程序员,所以我边走边学。我已经弄清楚如何使用 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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我没有看到你在哪里做任何平均。但是这个脚本做了我认为你想做的事情。

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

    平均值表:

    【讨论】:

    • 谢谢,我的分数在表格中没有平均。我得到的表格是老师的评分。每个学生由 8 位老师排名,我拥有的代码将学生及其每个类别的 8 个分数放入一个数组中,然后将其输出到一个新工作表中。分数还没有平均,我想做的是平均 8 个分数,当它们被拉入数组时。从我所看到的情况来看,使用 reduce 和一个公式应该可以工作,但我不知道在哪里或如何将它插入到我发布的代码中,如果这有任何意义的话。对不起,就像我说这一切对我来说都是新的。
    • 我没有看到任何关于学生分数为 8 的信息。也许您可以与匿名学生分享您的一些数据。
    • 顺便说一句,您应该避免在循环中使用 getValue()。使用 getValues() 将数据放入数组并单独从数组中操作会快得多。我说的是速度提高了 10 倍。
    • 所以我得到的表格是根据对 Google 表单的响应生成的,因此可以随机排列。这也是我第一次使用这个网站,所以我不知道如何像你一样添加表格。看起来像这样。学生 1 3 3 老师 1 学生 2 3 4 老师 5 学生 7 3 2 老师 1 学生 1 3 3 老师 2 学生 1 4 4 老师 3 学生 27 4 5 老师 1 学生 2 4 5 老师 10 非常感谢您的帮助可以给。
    • 你能详细解释一下吗? Student 1 3 3 Teacher 1 Student 2 3 4 Teacher 5 Student 7 3 2 Teacher 1 Student 1 3 3 Teacher 2 Student 1 4 4 Teacher 3 Student 27 4 5 Teacher 1 Student 2 4 5 Teacher 10
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多