首页 > 解决方案 > 如果问题有特定答案,Google 表格会在提交新表单时发送电子邮件

问题描述

我希望你能提供帮助,我试图找到一个解决方案,但我无法找到一个解决我的问题的解决方案。如果学生要求更改他们的课程,我有一个表格可以收集信息,我们是一个多学校站点,并且根据站点的不同,需要不同的工作人员来批准更改。
收集的部分信息是站点代码 OAAd,例如,此信息保存在 F 列中。如果收到提交,则“在表单提交”触发器中,触发脚本。目前它似乎不起作用,但它触发没有错误。如果我更改触发器“编辑时”并编辑 F 列中的单元格,它工作正常。最终,我将使用 ifElse 为每个站点添加其他选项,但如果我能让它为一个站点工作,那就太好了。

function sendEmailapproval(e) {
if(e.range.getColumn()==6 && e.value=='OAAd'){
 var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email Addresses").getRange("B3");
 var recipent = emailRange.getValue();
 var html = HtmlService.createTemplateFromFile("Email1.html");
 var htmlText = html.evaluate().getContent();
 var subject = "New Change Log Request Post 16";
 var body = "";
 var options = { htmlBody: htmlText}
 MailApp.sendEmail(recipent, subject, body, options)
 }
}

标签: google-apps-script

解决方案


背景

onFormSubmit添加触发器有 2 个选项:

  1. 使用表单设置/脚本。
  2. 使用附加的电子表格脚本。

这两种方法都提供了一个event对象来与新提交的响应进行通信,但是这些对象之间存在差异,因此您需要提前决定选择哪种方法。您可以在此处阅读有关此主题的更多信息。

对于您的建议,更愿意使用电子表格脚本,因为它更容易从中提取特定值。

解决方案

首先,这是您的正确sendEmailapproval功能:

function sendEmailapproval(e) {
  const namedValues = e.namedValues
  const question = 'Question 3'; // copy-paste from the form
  switch (namedValues[question][0])
  {
    case 'OAAd':
      const emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email Addresses").getRange("B3");
      const recipent = emailRange.getValue();
      const html = HtmlService.createTemplateFromFile("Email1.html");
      const htmlText = html.evaluate().getContent();
      const subject = "New Change Log Request Post 16";
      const body = "";
      const options = { htmlBody: htmlText}
      MailApp.sendEmail(recipent, subject, body, options)
      break;
    // case 'SOMETHING_ELSE':
    // break;
    default:
  }
}

请注意,这e.namedValues是一个对象,其中每个键都映射到一个数组。所以namedValues[question][0]指的是字符串的值namedValues[question]

其次,将触发器添加到附加到表单的电子表格中。

function createTrigger() {
  const sheet = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID").getSheetByName("THE_SHEET_NAME");
  ScriptApp.newTrigger("sendEmailapproval")
    .forSpreadsheet(sheet)
    .onFormSubmit()
    .create();
}

推荐阅读