Form inputs only having the selected values from the App

32 views
Skip to first unread message

Gaya Sri Harshana

unread,
Feb 9, 2026, 4:36:55 AM (11 days ago) Feb 9
to Google Apps Script Community
Hello,

In my Docs Application, there is an user management page where admins can add/ remove users from a list.

I have used Switch Control type Check box next to the User name.

Once we go to the user management page, I am setting the checkbox value to True for the already selected users. And that displays properly in the App as well.

The issue is, let's say a new user is being selected (Mark the checkbox as True for a user), and click save, My formInputs: contains only the new user. Not other users whose check boxes are already selected. 

This used to work fine, but now it only has the recently added user only.

Kildere S Irineu

unread,
Feb 9, 2026, 10:30:33 AM (10 days ago) Feb 9
to google-apps-sc...@googlegroups.com

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.


📌 O que está acontecendo (causa raiz)

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:

formInputs contém apenas os usuários recém-selecionados, não a lista completa.


🔴 Por que isso não deve ser tratado como bug

O novo comportamento segue o modelo de:

“event delta” (apenas o que mudou)

Isso reduz payload, melhora performance e evita conflitos de estado.


✅ Solução correta (boa prática atual)

✔️ Regra de ouro

Nunca confie em formInputs como estado completo
Use-o apenas como diferença (delta)


🟢 Arquitetura correta para User Management

1️⃣ Estado atual salvo (fonte da verdade)

Salve os usuários selecionados em:

  • PropertiesService

  • Firestore

  • Sheet

  • Banco externo

  • Ou Drive JSON

Exemplo:

{ "users": ["a...@empresa.com", "jo...@empresa.com"] }

2️⃣ Renderização da tela

Você já faz corretamente:

selectedUsers.includes(user.email)

Isso define:

selected: true

3️⃣ Processamento do submit (AQUI está a correção)

Em vez de esperar todos os checkboxes em formInputs:

❌ Errado (antigo)

const selectedUsers = Object.keys(e.formInputs.users);

✅ Correto (novo padrão)

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); }

🧠 Explicação simples

  • storedUsersestado antigo

  • formInputso que mudou

  • Você faz um merge de estado

  • Resultado = estado final correto


🟢 Alternativa (hidden field – quando aplicável)

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.


📌 Boas práticas recomendadas pelo Google

  • Tratar UI como stateless

  • Persistir estado fora do formulário

  • Usar formInputs apenas como delta

Documentação:


✅ Conclusão

✔️ 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.

Gaya Sri Harshana

unread,
Feb 9, 2026, 10:20:24 PM (10 days ago) Feb 9
to Google Apps Script Community
Hi,

Thank you for the detailed response explaining the situation.

Regarding fixing this problem, Now my,

formInputs: {users: [ 'email_1', 'email_2' ] },

Only contains the selected users from the list, is there anyway I can get the unchecked users from the list, so that I can compare with the original list and go forward. 
Reply all
Reply to author
Forward
0 new messages