Salta el contingut

Restriccions de Google Apps Script

Template literals niats — límit de 2 nivells

El sandbox JavaScript del navegador de GAS té un límit de nesting de template literals inferior a V8/Node. Template literals niats a 3+ nivells causen SyntaxError en producció que Node.js no detecta localment.

Exemple del problema

// ❌ FALLARÀ a GAS (3 nivells de nesting)
el.innerHTML = `
  ${data.map(d => `
    <li>${d.val ? `<b>${d.val}</b>` : ''}</li>
  `).join('')}
`;

Solucions

Opció 1 — Variables pre-calculades (la més simple):

// ✅ Correcte: el condicional és una variable, no un template literal niat
const renderItem = d => {
  const bold = d.val ? '<b>' + d.val + '</b>' : '';
  return `<li>${bold}</li>`;
};
el.innerHTML = data.map(renderItem).join('');

Opció 2 — Funcions helper:

// ✅ Correcte: cada nivell és una funció separada
function barraRow(label, val, max) {
  return `<div class="bar"><span>${label}</span><div style="width:${val/max*100}%"></div></div>`;
}
el.innerHTML = data.map(d => barraRow(d.label, d.val, maxVal)).join('');

Opció 3 — Concatenació de strings per seccions amb lògica condicional:

// ✅ Correcte: strings concatenades, no template literals niats
let html = '<ul>';
data.forEach(d => {
  html += '<li>' + (d.val ? '<b>' + d.val + '</b>' : '') + '</li>';
});
html += '</ul>';
el.innerHTML = html;

Regles d'or

  • MAI: ${condition ? \...` : `...`}` dins d'un template literal ja niat
  • MAI: ${arr.map(x => \...${x.prop ? `...` : ''}...`)}`
  • SEMPRE: pre-calcular els valors condicionals en variables abans del template literal principal

Detectar errors de sintaxi sense desplegar

Node.js pot verificar la sintaxi dels fitxers HTML (saltant la primera línia <script>):

# Comprova admin-scripts.html
tail -n +2 admin-scripts.html | node --check

# Comprova scripts.html
tail -n +2 scripts.html | node --check

Això detecta errors de sintaxi JS que GAS no reporta clarament però que sí que provoquen errors en producció.


Altres limitacions de GAS

Limitació Detall
Serialització google.script.run no suporta Date, classes, undefined ni funcions
Temps d'execució Màxim 6 minuts per execució de funció GAS
Cache CacheService té un límit de 100KB per entrada
JSON.stringify al template No funciona per injectar strings; usar cometes literals: '<?= var ?>'