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 ?>' |