Estoy creando un sistema de clasificación de clasificación de Elo en Google Sheets usando Apps Script y mientras ejecuto la siguiente función que calcula los cambios de Elo, aparece el error "TypeError: kleft no es una función". No entiendo por qué mi variable "kleft" está siendo confundido con una función o donde me estoy equivocando ya que he escrito un código similar varias veces antes sin ningún problema.
//function to calculate Elo change function elorat(leftscore,rightscore){ //leftscore and rightscore are the actual points scored by the two players in the match var sheet = SpreadsheetApp.getActive(); var mtd = sheet.getSheetByName('MTD'); var leftelo = mtd.getRange("K4").getValue(); //elo of player 1 before the game var rightelo = mtd.getRange("N4").getValue(); //elo of player 2 before the game var expectleft = 1/(1 + Math.pow(10,(rightelo-leftelo)/1000)); //expected points scored by player1 var expectright = 1/(1 + Math.pow(10,(leftelo-rightelo)/1000)); //expected points scored by player2 var kleft = 0; //declaring the k-factor to be used in calculations var kright = 0; if(1000<leftelo<9000){ var kleft = Math.round((-0.00001125*(leftelo-1000)*(leftelo-9000))+20); //adjusting k-factor of player1 based on current elo } else{ var kleft = 20; //boundary case } if(1000<rightelo<9000){ var kright = Math.round((-0.00001125*(rightelo-1000)*(rightelo-9000))+20); } else{ var kright = 20; } var leftchange = Math.round(kleft(leftscore-expectleft)); //amount of change in elo post match for player1 var rightchange = Math.round(kright(rightscore-expectright)); //amount of change in elo post match for player2 mtd.getRange("K5").setValue(leftchange); //setting values onto the sheet mtd.getRange("N5").setValue(rightchange); mtd.getRange("K6").setValue(leftelo+leftchange); mtd.getRange("N6").setValue(rightelo+rightchange); }Hay un par de problemas.
Problema 1:
En primer lugar, esta expresión if(1000<leftelo<9000) se evalúa siempre como true .
Puede probarlo usted mismo si console.log(1000<5<9000) seguirá siendo true .
Reemplázalo con:
if(leftelo > 1000 && leftelo < 9000) y lo mismo para rightelo
Problema 2:
Tanto kleft como kright son variables normales, pero las usa como funciones y es por eso que el compilador da ese error.
En casi todos los lenguajes de programación, esta expresión kleft(leftscore-expectleft) significa que tienes una función con el nombre kleft y estás tratando de pasar un valor que es el resultado de leftscore-expectleft .
Lo que quieres en cambio es multiplicar kleft con (leftscore-expectleft) :
kleft * (leftscore-expectleft) kright * (rightscore-expectright) Finalmente, no estoy seguro de dónde está llamando a la función elorat . Si este es todo su código, de nuevo, esto no funcionará porque esta función espera dos argumentos. Pero dado que no recibió un error por eso, supongo que hay algún código que no se comparte aquí.