Tenho uma macro de aplicativo de planilha do Google que está comparando pontuações semanais em um conjunto de times em uma liga. Ela está verificando qual time teria vencido um ao outro a cada semana comparando pontuações em um conjunto de categorias. Há alguma lógica para definir se algumas categorias pontuam por serem mais altas ou mais baixas. A macro está comparando corretamente as pontuações em quase todos os casos, mas eventualmente encontrei um bug que não consigo resolver.
// Get all relevant data from the stat sheet in one go
const statsRange = statSheet.getRange('C8:C234').offset(0, weeks);
const statsData = statsRange.getValues();
// Iterate through teams (assuming 12 teams)
for (let i = 0; i <= 11; i++) {
for (let j = 0; j <= 11; j++) {
if (i===11&&j===11) {break}
if (j===i) {j=j+1;}
let score = 0;
// Iterate through stats for each team pair, comparing and calculating score.
Scores are across 19 rows per team in the data set. There are 15 relevant rows.
for (let k = 0; k <= 15; k++) {
var homeStat = statsData[(19 * i) + k];
var awayStat = statsData[(19 * j) + k];
// Skip some stats and handle some differently
if (k === 0 || k === 1 || k === 3 || k === 4) {continue}
else if (k === 13||k === 14) {
score += (homeStat < awayStat) ? 1 : (homeStat > awayStat) ? -1 : 0;
} else {
score += (homeStat > awayStat) ? 1 : (homeStat < awayStat) ? -1 : 0;
}
console.log(i, j, k, homeStat, awayStat, score)
}
Um exemplo de conjunto de dados de entrada
Célula | Valor |
---|---|
C198 | 180 |
C199 | 409 |
C200 | 0,44 |
C201 | 114 |
C202 | 148 |
C203 | 0,77 |
C204 | 68 |
C205 | 542 |
C206 | 43 |
C207 | 174 |
C208 | 107 |
C209 | 28 |
C210 | 14 |
C211 | 55 |
C212 | 0 |
C213 | 0 |
C214 | 7 |
C215 | |
C216 | |
C217 | 130 |
C218 | 273 |
C219 | 0,476 |
C220 | 65 |
C221 | 82 |
C222 | 0,793 |
C223 | 35 |
C224 | 360 |
C225 | 42 |
C226 | 142 |
C227 | 87 |
C228 | 31 |
C229 | 25 |
C230 | 52 |
C231 | 0 |
C232 | 1 |
C233 | 7 |
Por algum motivo, se HomeStat e AwayState forem de ordens de magnitude diferentes, essa comparação produz resultados inversos. Um exemplo de log/saída: i e j são times na planilha. k é a categoria de estatísticas. Estatísticas de casa e visitante são as entradas de cada time para a categoria. A pontuação deve aumentar ou diminuir com base na lógica. k = 10 é o erro. Ele aumenta quando a pontuação da casa é menor que a pontuação do visitante.
|time|log|i|j|k|home stat|away stat|score|
6:59:04 PM Info 11 10 2 [ 0.476 ] [ 0.44 ] 1
6:59:04 PM Info 11 10 5 [ 0.793 ] [ 0.77 ] 2
6:59:04 PM Info 11 10 6 [ 35 ] [ 68 ] 1
6:59:04 PM Info 11 10 7 [ 360 ] [ 542 ] 0
6:59:04 PM Info 11 10 8 [ 42 ] [ 43 ] -1
6:59:04 PM Info 11 10 9 [ 142 ] [ 174 ] -2
6:59:04 PM Info **11 10 10 [ 87 ] [ 107 ] -1**
6:59:04 PM Info 11 10 11 [ 31 ] [ 28 ] 0
6:59:04 PM Info 11 10 12 [ 25 ] [ 14 ] 1
6:59:04 PM Info 11 10 13 [ 52 ] [ 55 ] 2
6:59:04 PM Info 11 10 14 [ 0 ] [ 0 ] 2
6:59:04 PM Info 11 10 15 [ 1 ] [ 0 ] 3
A lógica sempre aplica +1 à pontuação que tem um comprimento menor (2 vs. 3 números), independentemente de ser em casa ou fora. Se ambas as pontuações tiverem 2 ou 3 números de comprimento, a pontuação é correta.
As chances são de que esses valores não sejam números, mas sequências de texto que parecem números. As sequências de texto são comparadas lexicograficamente, então
"10"
<"2"
.Para que isso funcione, formate a coluna como Formato > Número > Automático em vez de Formato > Número > Texto simples , ou use
Number()
, assim:Veja Number() .