Sorry, to add to this.
The email is sending, however, it’s not filling in the Google sheet. It has the {{}} for the details it needs. Example below.

--
You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/1Fsw96x5xJc/unsubscribe.
To unsubscribe from this group and all its topics, 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/0933790b-96fd-440b-9496-b5c465e7c6ben%40googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-apps-script-community/99d0162a-4219-4f7e-8f0e-8cb6df1230een%40googlegroups.com.
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/573e4bbe-ac9c-4b54-aa85-ea282ce20df9n%40googlegroups.com.
Você quer que, ao enviar um Google Formulário, o script:
Copie um modelo de planilha.
Preencha essa nova planilha com os dados da submissão.
Converta a planilha em PDF.
Envie esse PDF por e-mail.
Atualize uma coluna com o status de envio.
O e-mail está sendo enviado, mas o PDF contém os campos como
{{nome}}, sem os dados reais.
O modelo que você está usando contém placeholders como {{nome}}, esperando substituições de texto — isso só funciona com Google Docs ou Slides, não com Google Sheets.
Google Sheets não tem mecanismo nativo de substituição de placeholders de texto como um template de texto. Quando você preenche células, o valor {{nome}} permanece lá, a menos que você sobrescreva a célula inteira com um novo valor.
No seu código, esse trecho:
for (let i = 0; i < 32; i++) { templateSheet.getRange(templateRow, i + 2).setValue(data[i] || ''); }
coloca dados nas colunas de B a AG, na linha 2, mas isso só sobrescreve o conteúdo se a célula estiver vazia ou for exatamente a célula correta — não substitui {{variável}} automaticamente.
Essa é a abordagem mais indicada se você quer usar {{variáveis}}.
Vantagens:
Suporte total à substituição de texto.
Visual profissional.
Exemplo básico de substituição:
const docTemplateId = 'ID_DO_DOC_MODELO'; const docCopy = DriveApp.getFileById(docTemplateId).makeCopy(`Call Sheet - ${callerName}`); const doc = DocumentApp.openById(docCopy.getId()); const body = doc.getBody(); body.replaceText('{{nome}}', callerName); body.replaceText('{{telefone}}', mobile); body.replaceText('{{iniciais}}', initials); doc.saveAndClose(); const pdf = docCopy.getAs(MimeType.PDF);
📚 Referência oficial: DocumentApp.replaceText()
Se você quiser continuar usando planilha como base, crie um modelo onde a linha 2 esteja vazia. Preencha diretamente com setValues():
templateSheet.getRange(templateRow, 2, 1, 32).setValues([data.slice(0, 32)]);
Isso substitui o loop e preenche em uma só operação (mais rápido e seguro).
Seu catch atual usa a aba Form responses 1, que pode não ser a aba onde o erro aconteceu:
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form responses 1');
Melhore assim:
const sheet = e?.range?.getSheet() || SpreadsheetApp.getActiveSheet(); sheet.getRange(e?.range?.getRow() || sheet.getLastRow(), 38).setValue('Failed - ' + err.message);
Evite DriveApp.getRootFolder().removeFile(...) — pode lançar exceções se o arquivo for de outro dono.
Prefira usar Batch com getValues() / setValues() sempre que possível.
Coloque Logger.log() para rastrear valores-chave durante testes.