【问题标题】:Google Form Send Email to Owner after Response Submission提交回复后 Google 表单向所有者发送电子邮件
【发布时间】:2016-09-09 15:30:06
【问题描述】:

我刚刚开始使用 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); 

}

然后我在表单触发器中添加了这个脚本,如下所示:

我尝试提交表单,但没有任何结果。我怎么知道脚本运行了还是有问题?

如果我尝试在脚本编辑器中运行它:

它给了我一个错误: TypeError:无法调用 null 的方法“getRange”。 (第 7 行,文件“代码”)

更新

我测试了电子邮件功能,它工作正常。所以问题必须在电子表格值检索中。

function sendFormByEmail(e) 
{    

  var email = "ownersemail@host.ca"; 
  MailApp.sendEmail(email, "Test", "Test"); 
}

我还在我的谷歌驱动器上创建了一个 excel 文件,其中包含来自谷歌表单的这些响应

最终解决方案

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

【问题讨论】:

    标签: google-apps-script google-forms


    【解决方案1】:

    这是一个供您开始使用的 shell。我出于非常相似的原因使用此代码。此外壳程序包括从模板创建 Google Doc 并将工作表中的数据添加到该 Doc 中。您可以使用类似的方法来设置变量并将它们添加到电子邮件中。我使用一个 html 模板文件来准确管理每次发送的内容。

    合并部分检查 Doc(您可以将其设置为查看 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();
    }
    

    【讨论】:

    • 另外,为了澄清,我使用了一个基于时间的触发器,它每 5 分钟运行一次。这可确保代码自上次运行以来在所有提交中运行 1 次。我发现在我自己的代码中,如果我有快速的表单提交,在 Form submit 上使用会过于频繁地调用它。
    • 感谢您的回复,它非常详细,但我似乎一开始就被打动了 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("");它说 TypeError:无法调用 null 的方法“getSheetByName”。 (第 2 行,文件“SpreadSheet1”
    • 在哪里可以找到工作表的名称?我的表单称为 SharedFolderApp,这就是我所说的
    • 是的,我在帖子的注释部分中提到我已经删除了个人标签、ID 和模板名称。您将不得不自己添加这些内容。获取这些错误是找到我删除必要信息的位置的好方法。特别是对于该变量,您将需要添加工作表的名称。我之所以与众不同,是因为我有一个表单提交被转储的工作表和一个我使用=QUERY 提取数据并进一步处理的页面。
    • 工作表的名称位于页面底部。每张纸都有标签,您可以根据需要重命名它们。此方法对您设置的名称区分大小写。万一这不是很清楚,我已经设置了谷歌表单以将提交的内容发送到谷歌表格中。这并不总是默认选项,但我的代码要求您提交的内容填充电子表格。
    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2015-03-28
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多