Tengo una secuencia de comandos que está configurada para ejecutarse cada vez que se envía un disparador, y necesita ordenar los datos que recibe para determinar en qué hoja escribir los datos.
Solía codificarlo con los nombres exactos y funcionó bien, pero ahora estoy tratando de hacerlo más fácil de escalar. El value de la variable en el interruptor debe ser un número.
A continuación se muestra un fragmento del código.
var myIds = [111, 222, 333, 444]; var myUsers = ['aaa', 'bbb', 'ccc', 'ddd']; ... switch (param) { case 1: break; case 2: for (let i = 0; i < myIds.length; i++) { if (value == myIds[i]) { userName = myUsers[i]; break; } } userName = 'ETC'; break; } if (userName != 'ETC') { let inSheet = 'In ' + userName; let outSheet= 'Out ' + userName; if (checkIn == true) sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(inSheet)); else sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(outSheet)); } else sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('ETC'));En lugar de ir a sus respectivas hojas de entrada/salida, todo va a la hoja ETC. Otras veces, no habría ningún cambio en las sábanas. Se agradecería mucho si alguien pudiera explicar por qué sucede esto, además de la pregunta.
Gracias por adelantado.
el break; dentro de su bucle for solo sale del bucle for , no es el case . Entonces sales del for y terminas en userName = "ETC"; , que sobrescribe cualquier valor que haya establecido el bucle.
En su lugar, puede usar indexOf o findIndex :
case 2: const index = myIds.indexOf(value); // Or `.findIndex(id => id == value)` if you need `==` not `===` userName = index === -1 ? "ETC" : myUsers[index]; break; Si realmente quisiera el ciclo for , podría asignar el nombre de userName antes del ciclo, de modo que el ciclo sobrescriba "ETC" :
case 2: userName = "ETC"; for (let i = 0; i < myIds.length; i++) { if (value == myIds[i]) { userName = myUsers[i]; break; } } break; Nota al margen: recomiendo evitar matrices paralelas como myIds y myUsers . Es muy fácil terminar actualizando uno y no el otro. En su lugar, considere una matriz de objetos:
const users = [ {id: 111, name: "aaa"}, {id: 222, name: "bbb"}, {id: 333, name: "ccc"}, {id: 444, name: "ddd"}, ]; Entonces el primer ejemplo anterior usaría find :
case 2: const user = users.find(({id}) => id == value); userName = user ? user.name : "ETC"; break; En un entorno realmente moderno con encadenamiento opcional y fusión nula, podría cambiar userName = user ? user.name : "ETC"; a nombre de userName = user?.name ?? "ETC"; pero no hay nada malo con la versión condicional.
Nota al margen 2: ha utilizado let dentro de su bucle for , por lo que parece estar utilizando el GAS más moderno que admite las funciones ES2015+. Sugiero no usar var en código nuevo, siempre use let o const .
Aparentemente, el problema estaba en otra parte del código que no incluí en la pregunta, donde reinicié la variable de nombre de usuario en cada ciclo. Esto provocó que la variable de nombre de usuario no estuviera definida en algunos bucles, lo que a su vez provocó que la función getSheetByName devolviera un error.