2016-08-17 2 views
1

Я пытаюсь написать формулу или скрипт, который будет принимать два входа, посещение ученика и GPA и выплевывать их рейтинг On-Track, как описано здесь ,Написание формулы/скрипта условно для нескольких пороговых значений и применения их во многих рядах

on-track-matrix

My Google Sheet

function ONTRACK(Att, GPA){ 

    function getAttendanceRow(number){ 
    if(number>=98){row="A";} 
    else if(number>=95){row="B";} 
    else if(number>=90){row="C";} 
    else if(number>=80){row="D";} 
    else {row="E";} 
    return row 
    } 

    function getGPACol(number){ 
    if(number<1){col="F";} 
    else if(number<2){col="G";} 
    else if(number<3){col="H";} 
    else {col="I";} 
    return col 
    } 

    var matrix=getAttendanceRow(Att) + getGPACol(GPA) 

    var matrix_hash={'AI':5, 'BI':5, 
        'AH':4, 'CI':4, 
        'AG':3, 'BG':3, 'BH':3, 'CH':3, 'DI':3, 
        'BF':2, 'CF':2, 'CG':2, 'DG':2, 'DH':2,'EH':2, 
        'DF':1, 'EF':1, 'EG':1 } 
    return matrix_hash[matrix] 

} 

TWO ВОПРОСЫ

1. Как применить это через большое количество строк, не получив ошибку тайм-аута?

Я пытался использовать setFormula

function makeN(){ 
    ss.getRange("N2").setFormula("=ONTRACK(G2*100,H2)"); 
    ss.getRange("N2").copyTo(ss.getRange("N2:N"+lastRow)); 
} 

Я также играл с методом карты, как предложил свою документацию, но получаю сообщение об ошибке о первом элементом является неопределенным. Я не знаком с методом карты, поэтому моя проблема может лежать там.

function ONTRACK2(input){ 
    if (input.map) {   // Test whether input is an array. 
    return input.map(ONTRACK2); // Recurse over array if so. 
    } else { 
    // do actual function work here 
    return ONTRACK(input[0][0]*100, input[0][1]) 

    } 
}; 

Нечто подобное для работы ГПД, где я вычислительное ГПД без ошибки:

function GPA2(input){ 
    if (input.map) {   // Test whether input is an array. 
    return input.map(GPA2); // Recurse over array if so. 
    } else { 
    // do actual function work here 
    return myAverage(getPoints(input[0][0]), getPoints(input[0][1]), getPoints(input[0][2]), getPoints(input[0][4])) 

    } 
}; 

Другая идея сценария на основе было бы построить какой-то объект массива с помощью итерации, который хранит «On Track», а затем записывает их в правильный столбец.

2. Можете ли это сделать без AppScripts, как формула in-Sheets вместо этого?

Я играл вокруг с нечеткими поисками ссылочных here

Я сделал Справочную таблицу

ontrack reference table

Этих формулы, которые я пробовал, где столбцы G и H является моей посещаемостью и GPA соответственно.

=INDEX('Reference Table'!F2:F20,MATCH(2,INDEX(1/(('Reference Table'!D2:D20=G2)*('Reference Table'!E2:E20<=H2)),0))) 

=ArrayFormula(INDEX('Reference Table'!$F$2:$F$20,MAX(ROW('Reference Table'!$D$2:$D$20)*(('Reference Table'!$D$2:$D$20)=G2)*(('Reference Table'!$E$2:$E$20)<=H16)))) 

ответ

2

Я не уверен в формуле листа, но вы можете сделать это с помощью скрипта приложений.

Перейдите на страницу your sheet, в меню нажмите «Найти учеников» и «Рассчитать дорожку». Столбец «P» заполнит данные о треках учащихся. Вуаля!

Это моя функция

function FindMyTrack() 
{ 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var student = ss.getSheetByName("StudentData");//select sheets 
    var refer = ss.getSheetByName("Reference Table");//select sheets 
    var stData = student.getRange(2, 7, student.getLastRow(), 2).getValues();// get sheet data 
    var refData = refer.getRange('D2:F20').getValues();// get sheet data 
    var tracks = []; 
    //checking each student attendance and GPA with reference data 
    for(var n in stData){ 
    for(var p in refData){ 
     if(stData[n][0] >= refData[p][0] && stData[n][1] >= refData[p][1]){ 
     tracks.push([refData[p][2]]);//save matched value in an array 
     break; 
     } 
    } 
    } 
    // setting saved track data in the "P" (16) column 
    student.getRange(2, 16, tracks.length, 1).setValues(tracks); 
} 

Вы можете проверить код, связанные простыней („ГПД“) для чередования.

Смежные вопросы