Google 表单在提交回复后向所有者发送电子邮件
Google Form Send Email to Owner after Response Submission
我刚开始 Google 表格。我需要在用户提交数据后立即通过电子邮件向表单所有者(我自己和其他一些人)发送回复。我需要电子邮件中的数据,其中包含用户在提交表单后立即提交的字段及其值。
我无法根据我的 google 帐户设置通过我的雇主使用附加组件,因为附加组件被阻止了。
我正在探索应用程序脚本,但收效甚微,因为我是新手。因为有一些示例代码可以帮助我开始创建一个基本脚本来发送电子邮件。
我有以下代码:
function sendFormByEmail(e)
{
var email = "ownersemail@host.ca";
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
var message = "";
var subject = "New Hire: ";
for(var i in headers)
message += headers[i] + ': '+ e.namedValues[headers[i]].toString() + "\n\n";
subject += e.namedValues[headers[2]].toString() + " - starts " + e.namedValues[headers[15]].toString();
MailApp.sendEmail(email, subject, message);
}
然后我在表单触发器中添加了这个脚本,如下所示:
我尝试提交表格,但没有任何结果。我怎么知道脚本 运行 或者有问题?
如果我在脚本编辑器中尝试 运行 :
它给我一个错误:
类型错误:无法调用 null 的方法 "getRange"。 (第 7 行,文件 "Code")
更新
我测试了电子邮件功能并且有效。所以问题必须在Spread Sheet值检索中。
function sendFormByEmail(e)
{
var email = "ownersemail@host.ca";
MailApp.sendEmail(email, "Test", "Test");
}
我还在我的 google 驱动器上创建了一个 excel 文件,其中包含来自 google 表单
的这些响应
最终解决方案
function testExcel() {
var email = "ownersemail@host.ca";
var s = SpreadsheetApp.openById("GoogleDocsID");
var sheet = s.getSheets()[0];
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
var datarow = sheet.getRange(sheet.getLastRow(),1,1,sheet.getLastColumn()).getValues()[0];
var message = "";
for(var i in headers)
{
message += "" + headers[i] + " : " + datarow[i] + "\n\n";
//Logger.log(message);
}
MailApp.sendEmail(email, "Submitted Data Test", message);
}
这里有一个 shell 供您开始使用。我出于非常相似的原因使用此代码。此 shell 包括从模板创建 Google 文档并将 sheet 中的数据添加到该文档中。您可以使用类似的方法设置变量并将它们添加到电子邮件中。我使用 html 个模板文件来准确管理每次发送的内容。
合并部分检查文档(您可以将其设置为查看 html 文件)并使用 RegEx 查找我的标签;结构如下:<<columnHeader>>
。这样,您就有了一个一致的模板,可以用该行的该列中的数据替换这些标签。根据您的需要进行修改。
这也会显示合并的进度。这样,它就不会重复您的电子邮件/合并。
注意:由于我删除了个人信息,因此缺少几个数据点;它不会 运行 直接来自这个样本。您将必须添加文档 ID、更正变量放置等。
function mergeApplication() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("");
var formSheet = ss.getSheetByName("");
var lastRow = formSheet.getLastRow();
var lastColumn = sheet.getMaxColumns();
function checkAndComplete() {
var urlColumn = lastColumn;
var checkColumn = (urlColumn - 1);
var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
var check = checkRange.getBackgrounds();
var red = "#ff0404";
var yellow = "#ffec0a";
var green = "#3bec3b";
for (var i = 0; i < check.length; i++) {
if (check[i] == green) {
continue;
} else {
var statusCell = sheet.getRange((i+2), checkColumn, 1, 1);
var urlCell = sheet.getRange((i+2), urlColumn, 1, 1);
var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2));
function mergeTasks() {
function docCreator() {
var docTemplate1 = DriveApp.getFileById("");
var docTemplate2 = DriveApp.getFileById("");
var folderDestination = DriveApp.getFolderById("");
var clientName = sheet.getRange((i+2), 2, 1, 1).getValue();
var rawSubmitDate = sheet.getRange((i+2), 1, 1, 1).getValue();
var submitDate = Utilities.formatDate(rawSubmitDate, "PST", "MM/dd/yy");
var typeCheck = sheet.getRange((i+2), (checkColumn - 1), 1, 1).getValue();
if (typeCheck == "Type 1") {
var docToUse = docTemplate1;
var emailBody = HtmlService.createHtmlOutputFromFile("").getContent();
} else {
var docToUse = docTemplate2;
var emailBody = HtmlService.createHtmlOutputFromFile("").getContent();
}
var docName = "" + clientName + " - " + submitDate;
var docCopy = docToUse.makeCopy(docName, folderDestination);
var docId = docCopy.getId();
var docURL = DriveApp.getFileById(docId).getUrl();
var docToSend = DriveApp.getFileById(docId);
var docInUse = DocumentApp.openById(docId);
var docBody = docInUse.getBody();
var docText = docBody.getText();
function tagReplace() {
var DOBCell = sheet.getRange((i+2), 3, 1, 1);
var rawDOB = DOBCell.getValue();
if (rawDOB !== "") {
var DOB = Utilities.formatDate(rawDOB, "PST", "MM/dd/yy");
} else {
var DOB = ""
}
var taggedArray = docText.match(/\<{2}[\w\d\S]+\>{2}/g);
var headerArray = sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues();
var dataArray = dataRow.getValues();
dataArray[0][2] = DOB;
var strippedArray = [];
function tagStrip() {
for (var t = 0; t < taggedArray.length; t++) {
strippedArray.push(taggedArray[t].toString().slice(2, -2));
}
}
function dataMatch() {
for (var s = 0; s < strippedArray.length; s++) {
for (var h = 0; h < headerArray[0].length; h++) {
if (strippedArray[s] == headerArray[0][h]) {
docBody.replaceText(taggedArray[s], dataArray[0][h]);
}
}
}
docInUse.saveAndClose();
}
tagStrip();
dataMatch();
}
function emailCreator() {
var emailTag = sheet.getRange((i+2), (checkColumn - 9)).getValue();
var emailSubject = "" + clientName;
MailApp.sendEmail({
to: emailTag,
subject: emailSubject,
htmlBody: emailBody,
attachments: [docToSend.getAs(MimeType.PDF)],
replyTo: "",
});
}
tagReplace();
statusCell.setBackground(yellow);
emailCreator();
urlCell.setValue(docURL);
}
statusCell.setBackground(red);
docCreator();
statusCell.setBackground(green);
}
mergeTasks();
}
}
}
checkAndComplete();
}
我刚开始 Google 表格。我需要在用户提交数据后立即通过电子邮件向表单所有者(我自己和其他一些人)发送回复。我需要电子邮件中的数据,其中包含用户在提交表单后立即提交的字段及其值。
我无法根据我的 google 帐户设置通过我的雇主使用附加组件,因为附加组件被阻止了。
我正在探索应用程序脚本,但收效甚微,因为我是新手。因为有一些示例代码可以帮助我开始创建一个基本脚本来发送电子邮件。
我有以下代码:
function sendFormByEmail(e)
{
var email = "ownersemail@host.ca";
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
var message = "";
var subject = "New Hire: ";
for(var i in headers)
message += headers[i] + ': '+ e.namedValues[headers[i]].toString() + "\n\n";
subject += e.namedValues[headers[2]].toString() + " - starts " + e.namedValues[headers[15]].toString();
MailApp.sendEmail(email, subject, message);
}
然后我在表单触发器中添加了这个脚本,如下所示:
我尝试提交表格,但没有任何结果。我怎么知道脚本 运行 或者有问题?
如果我在脚本编辑器中尝试 运行 :
它给我一个错误: 类型错误:无法调用 null 的方法 "getRange"。 (第 7 行,文件 "Code")
更新
我测试了电子邮件功能并且有效。所以问题必须在Spread Sheet值检索中。
function sendFormByEmail(e)
{
var email = "ownersemail@host.ca";
MailApp.sendEmail(email, "Test", "Test");
}
我还在我的 google 驱动器上创建了一个 excel 文件,其中包含来自 google 表单
的这些响应最终解决方案
function testExcel() {
var email = "ownersemail@host.ca";
var s = SpreadsheetApp.openById("GoogleDocsID");
var sheet = s.getSheets()[0];
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
var datarow = sheet.getRange(sheet.getLastRow(),1,1,sheet.getLastColumn()).getValues()[0];
var message = "";
for(var i in headers)
{
message += "" + headers[i] + " : " + datarow[i] + "\n\n";
//Logger.log(message);
}
MailApp.sendEmail(email, "Submitted Data Test", message);
}
这里有一个 shell 供您开始使用。我出于非常相似的原因使用此代码。此 shell 包括从模板创建 Google 文档并将 sheet 中的数据添加到该文档中。您可以使用类似的方法设置变量并将它们添加到电子邮件中。我使用 html 个模板文件来准确管理每次发送的内容。
合并部分检查文档(您可以将其设置为查看 html 文件)并使用 RegEx 查找我的标签;结构如下:<<columnHeader>>
。这样,您就有了一个一致的模板,可以用该行的该列中的数据替换这些标签。根据您的需要进行修改。
这也会显示合并的进度。这样,它就不会重复您的电子邮件/合并。
注意:由于我删除了个人信息,因此缺少几个数据点;它不会 运行 直接来自这个样本。您将必须添加文档 ID、更正变量放置等。
function mergeApplication() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("");
var formSheet = ss.getSheetByName("");
var lastRow = formSheet.getLastRow();
var lastColumn = sheet.getMaxColumns();
function checkAndComplete() {
var urlColumn = lastColumn;
var checkColumn = (urlColumn - 1);
var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
var check = checkRange.getBackgrounds();
var red = "#ff0404";
var yellow = "#ffec0a";
var green = "#3bec3b";
for (var i = 0; i < check.length; i++) {
if (check[i] == green) {
continue;
} else {
var statusCell = sheet.getRange((i+2), checkColumn, 1, 1);
var urlCell = sheet.getRange((i+2), urlColumn, 1, 1);
var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2));
function mergeTasks() {
function docCreator() {
var docTemplate1 = DriveApp.getFileById("");
var docTemplate2 = DriveApp.getFileById("");
var folderDestination = DriveApp.getFolderById("");
var clientName = sheet.getRange((i+2), 2, 1, 1).getValue();
var rawSubmitDate = sheet.getRange((i+2), 1, 1, 1).getValue();
var submitDate = Utilities.formatDate(rawSubmitDate, "PST", "MM/dd/yy");
var typeCheck = sheet.getRange((i+2), (checkColumn - 1), 1, 1).getValue();
if (typeCheck == "Type 1") {
var docToUse = docTemplate1;
var emailBody = HtmlService.createHtmlOutputFromFile("").getContent();
} else {
var docToUse = docTemplate2;
var emailBody = HtmlService.createHtmlOutputFromFile("").getContent();
}
var docName = "" + clientName + " - " + submitDate;
var docCopy = docToUse.makeCopy(docName, folderDestination);
var docId = docCopy.getId();
var docURL = DriveApp.getFileById(docId).getUrl();
var docToSend = DriveApp.getFileById(docId);
var docInUse = DocumentApp.openById(docId);
var docBody = docInUse.getBody();
var docText = docBody.getText();
function tagReplace() {
var DOBCell = sheet.getRange((i+2), 3, 1, 1);
var rawDOB = DOBCell.getValue();
if (rawDOB !== "") {
var DOB = Utilities.formatDate(rawDOB, "PST", "MM/dd/yy");
} else {
var DOB = ""
}
var taggedArray = docText.match(/\<{2}[\w\d\S]+\>{2}/g);
var headerArray = sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues();
var dataArray = dataRow.getValues();
dataArray[0][2] = DOB;
var strippedArray = [];
function tagStrip() {
for (var t = 0; t < taggedArray.length; t++) {
strippedArray.push(taggedArray[t].toString().slice(2, -2));
}
}
function dataMatch() {
for (var s = 0; s < strippedArray.length; s++) {
for (var h = 0; h < headerArray[0].length; h++) {
if (strippedArray[s] == headerArray[0][h]) {
docBody.replaceText(taggedArray[s], dataArray[0][h]);
}
}
}
docInUse.saveAndClose();
}
tagStrip();
dataMatch();
}
function emailCreator() {
var emailTag = sheet.getRange((i+2), (checkColumn - 9)).getValue();
var emailSubject = "" + clientName;
MailApp.sendEmail({
to: emailTag,
subject: emailSubject,
htmlBody: emailBody,
attachments: [docToSend.getAs(MimeType.PDF)],
replyTo: "",
});
}
tagReplace();
statusCell.setBackground(yellow);
emailCreator();
urlCell.setValue(docURL);
}
statusCell.setBackground(red);
docCreator();
statusCell.setBackground(green);
}
mergeTasks();
}
}
}
checkAndComplete();
}