Усреднение значений, извлеченных из листов в массиве - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь взять оценки учеников с листа, усреднить их для каждого ученика, а затем вывести их на новую вкладку на том же листе.Каждый ученик оценивается восемью учителями по своему характеру и лидерству.

По профессии я не программист, поэтому учусь на ходу.Я выяснил, используя инструмент сценариев для листов 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, это облегчит нашу жизнь.В противном случае мы можем получить, написав формулу на листе вручную, чтобы получить средние значения, но мы хотели бы максимально автоматизировать процесс.Спасибо.

ввод

1 Ответ

0 голосов
/ 12 апреля 2019

Я не видел, где вы делаете усреднение. Но этот сценарий делает то, что я думаю, вы пытались сделать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...