-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscript-google-apps.js
153 lines (128 loc) · 5.75 KB
/
script-google-apps.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/******************************************************************************
* Este tutorial é baseado no trabalho de Martin Hawksey twitter.com/mhawksey *
* Mas foi simplificado e limpo para torná-lo mais amigável para principiantes *
* Todo o crédito por este trabalho vai para Martin Hawksey *
******************************************************************************/
// se você quiser armazenar seu e-mail do lado do servidor (oculto), remova o comentário da próxima linha
var TO_ADDRESS = "donizetebrand@gmail.com";
// mostrar todas as chaves/valores do formulário em HTML para email
// usa uma matriz de chaves, se fornecida, ou o objeto para determinar a ordem de campo
function formatMailBody(obj, order) {
var result = "";
if (!order) {
order = Object.keys(obj);
}
// loop sobre todas as chaves nos dados do formulário ordenado
for (var idx in order) {
var key = order[idx];
result += "<h2 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h2><div>" + sanitizeInput(obj[key]) + "</div>";
// para cada chave, concatene uma `<h2/>`/`<div/>` pareamento do nome da chave e seu valor,
// e anexá-lo à string `result` criada no início.
}
return result; // uma vez que o loop é feito, `result` será uma longa string para colocar no corpo do email
}
// limpar o conteúdo do usuário - não confie em ninguém
// ref: https://developers.google.com/apps-script/reference/html/html-output#appendUntrusted(String)
function sanitizeInput(rawInput) {
var placeholder = HtmlService.createHtmlOutput(" ");
placeholder.appendUntrusted(rawInput);
return placeholder.getContent();
}
function doPost(e) {
try {
Logger.log(e); // the Google Script version of console.log see: Class Logger
record_data(e);
// nome mais curto para dados de formulário
var mailData = e.parameters;
// nomes e ordem dos elementos de formulário (se definido)
var orderParameter = e.parameters.formDataNameOrder;
var dataOrder;
if (orderParameter) {
dataOrder = JSON.parse(orderParameter);
}
// determinar o destinatário do email
// se você tiver seu e-mail descomentado acima, ele usa isso `TO_ADDRESS`
// caso contrário, o padrão será o email fornecido pelo atributo de dados do formulário
var sendEmailTo = (typeof TO_ADDRESS !== "undefined") ? TO_ADDRESS : mailData.formGoogleSendEmail;
// enviar e-mail se o endereço estiver definido
if (sendEmailTo) {
MailApp.sendEmail({
to: String(sendEmailTo),
subject: "Nova Mensagem pelo site da Prefeitura de Baixa Grande do Ribeiro",
// replyTo: String(mailData.email), // Isso é opcional e depende de seu formulário realmente coletando um campo chamado `email`
htmlBody: formatMailBody(mailData, dataOrder)
});
}
return ContentService // retorno json resultados de sucesso
.createTextOutput(
JSON.stringify({"result":"success",
"data": JSON.stringify(e.parameters) }))
.setMimeType(ContentService.MimeType.JSON);
} catch(error) { // se isto retornar um erro
Logger.log(error);
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": error}))
.setMimeType(ContentService.MimeType.JSON);
}
}
/**
* record_data insere os dados recebidos do envio do formulário html
* e são os dados recebidos do POST
*/
function record_data(e) {
var lock = LockService.getDocumentLock();
lock.waitLock(30000); // segure até 30 seg para evitar escrita simultânea
try {
Logger.log(JSON.stringify(e)); // registrar os dados do POST no caso de precisarmos depurá-lo
// selecione a planilha 'responses' por padrão
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = e.parameters.formGoogleSheetName || "responses";
var sheet = doc.getSheetByName(sheetName);
var oldHeader = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var newHeader = oldHeader.slice();
var fieldsFromForm = getDataColumns(e.parameters);
var row = [new Date()]; // primeiro elemento na linha deve ser sempre um timestamp
// loop através das colunas do cabeçalho
for (var i = 1; i < oldHeader.length; i++) { // start at 1 to avoid Timestamp column
var field = oldHeader[i];
var output = getFieldFromData(field, e.parameters);
row.push(output);
// marcar como armazenado, removendo dos campos de formulário
var formIndex = fieldsFromForm.indexOf(field);
if (formIndex > -1) {
fieldsFromForm.splice(formIndex, 1);
}
}
// definir novos campos em nosso formulário
for (var i = 0; i < fieldsFromForm.length; i++) {
var field = fieldsFromForm[i];
var output = getFieldFromData(field, e.parameters);
row.push(output);
newHeader.push(field);
}
// mais eficiente para definir valores como matriz [] [] do que individualmente
var nextRow = sheet.getLastRow() + 1; // obter a próxima linha
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
// atualizar linha de cabeçalho com novos dados
if (newHeader.length > oldHeader.length) {
sheet.getRange(1, 1, 1, newHeader.length).setValues([newHeader]);
}
}
catch(error) {
Logger.log(error);
}
finally {
lock.releaseLock();
return;
}
}
function getDataColumns(data) {
return Object.keys(data).filter(function(column) {
return !(column === 'formDataNameOrder' || column === 'formGoogleSheetName' || column === 'formGoogleSendEmail' || column === 'honeypot');
});
}
function getFieldFromData(field, data) {
var values = data[field] || '';
var output = values.join ? values.join(', ') : values;
return output;
}