Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

99
Views
Google Apps Script getSheetByName devuelve nulo cuando se usa una variable como argumento

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.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

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 .

about 4 years ago · Juan Pablo Isaza Report

0

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.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!