Esse comportamento é esperado (e pegou muita gente de surpresa recentemente 🙂) e não é bug do seu código.
Houve uma mudança de comportamento nos Apps Script Add-ons / Apps Script UI (especialmente em apps baseados em Docs/Workspace Add-ons) relacionada a formInputs de checkboxes.
Vou explicar o porquê, o que mudou e como corrigir de forma segura.
Em Switch / Checkbox controls, o objeto formInputs só envia os valores que foram alterados na interação atual.
Ou seja:
✅ Checkboxes marcados automaticamente pelo código (estado inicial)
➜ NÃO entram em formInputs
✅ Checkboxes que o usuário clicou agora
➜ ENTRAM em formInputs
Antigamente, o Apps Script:
Reenviava todos os valores True
Mesmo os que já estavam marcados
👉 Isso mudou (especialmente em Apps de Docs, Sheets e Workspace Add-ons).
Resultado:
formInputscontém apenas os usuários recém-selecionados, não a lista completa.
O novo comportamento segue o modelo de:
“event delta” (apenas o que mudou)
Isso reduz payload, melhora performance e evita conflitos de estado.
Nunca confie em
formInputscomo estado completo
Use-o apenas como diferença (delta)
Salve os usuários selecionados em:
PropertiesService
Firestore
Sheet
Banco externo
Ou Drive JSON
Exemplo:
{ "users": ["a...@empresa.com", "jo...@empresa.com"] }
Você já faz corretamente:
selectedUsers.includes(user.email)
Isso define:
selected: true
Em vez de esperar todos os checkboxes em formInputs:
const selectedUsers = Object.keys(e.formInputs.users);
function onSave(e) { const storedUsers = getStoredUsers(); // estado atual const changedInputs = e.formInputs?.users || {}; // Usuários marcados agora const newlyChecked = Object.keys(changedInputs) .filter(u => changedInputs[u].stringInputs.value[0] === 'true'); // Usuários desmarcados agora const newlyUnchecked = Object.keys(changedInputs) .filter(u => changedInputs[u].stringInputs.value[0] === 'false'); // Atualiza estado const updatedUsers = storedUsers .filter(u => !newlyUnchecked.includes(u)) .concat(newlyChecked.filter(u => !storedUsers.includes(u))); saveUsers(updatedUsers); }
storedUsers → estado antigo
formInputs → o que mudou
Você faz um merge de estado
Resultado = estado final correto
Se o app permitir:
Armazene a lista completa em um TextInput oculto (JSON)
Atualize via onChange
Leia tudo no submit
⚠️ Menos elegante, mas útil em casos simples.
Tratar UI como stateless
Persistir estado fora do formulário
Usar formInputs apenas como delta
Documentação:
https://developers.google.com/apps-script/add-ons/concepts/event-objects
https://developers.google.com/apps-script/add-ons/common-controls#switch
✔️ Seu app está funcionando corretamente
❌ O comportamento antigo não deve mais ser assumido
✅ A solução é controlar estado manualmente e aplicar delta
--
You received this message because you are subscribed to the Google Groups "Google Apps Script Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-apps-script-community/0bbf33ff-aa9b-4d5c-86ca-a2f13316c9e5n%40googlegroups.com.