Javascript Google脚本项目触发器未运行?

Javascript Google脚本项目触发器未运行?,javascript,google-apps-script,google-sheets,triggers,Javascript,Google Apps Script,Google Sheets,Triggers,我对Javascript非常陌生,一直在编写这个脚本,以获取电子表格(从谷歌表单创建)中的最新条目,将收集到的用户电子邮件地址匹配到第二张表格中的花名册,并向家长发送电子邮件。我是一名教师,我的想法是能够创建一个谷歌表单,编辑学生输入的信息,并在他们提交表单/更新表单后通过电子邮件发送给他们的父母 我知道这是相当混乱的…有一些额外的变量和东西,但是当你“运行”脚本时,脚本工作得非常完美/如预期的那样。唯一的问题是,我曾尝试在提交表单时让脚本在触发器上运行,但没有。我是否缺少使用触发器的功能 代码

我对Javascript非常陌生,一直在编写这个脚本,以获取电子表格(从谷歌表单创建)中的最新条目,将收集到的用户电子邮件地址匹配到第二张表格中的花名册,并向家长发送电子邮件。我是一名教师,我的想法是能够创建一个谷歌表单,编辑学生输入的信息,并在他们提交表单/更新表单后通过电子邮件发送给他们的父母

我知道这是相当混乱的…有一些额外的变量和东西,但是当你“运行”脚本时,脚本工作得非常完美/如预期的那样。唯一的问题是,我曾尝试在提交表单时让脚本在触发器上运行,但没有。我是否缺少使用触发器的功能

代码如下:

function createEmail() {
  // Sets variables for both sheets
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet1 = ss.getSheets()[0];
  var sheet2 = ss.getSheets()[1];

  // This gathers information from the most recent entry and write it to an array called newReflectionValues
  var reflectionLastRow = sheet1.getLastRow();
  var reflectionLastColumn = sheet1.getLastColumn();
  var reflectionLastCell = sheet1.getRange(reflectionLastRow, reflectionLastColumn).getValue();
  var reflectionRange = sheet1.getRange(reflectionLastRow, 1, 1, reflectionLastColumn);  
  var newReflectionValues = reflectionRange.getValues();

  var studentEmail = newReflectionValues[0][3];

    Logger.log("NEW REFLECTION VALUES")
    Logger.log(newReflectionValues);

    Logger.log("Email will send to student email:")
    Logger.log(studentEmail)

  // Makes an array of the parent email addresses
  var rosterLastRow = sheet2.getLastRow();
  var rosterLastColumn = sheet2.getLastColumn();
  var rosterEmails = sheet2.getSheetValues(2, 1, rosterLastRow, rosterLastColumn);

  Logger.log("PARENT EMAILS")
  Logger.log(rosterEmails);  

  // Cross check emails - if a match, write emails to variable
  var parentEntriesLength = rosterLastRow;

  for (i = 0; i < parentEntriesLength; i++) {
    var currentRange = rosterEmails[i];

    if (currentRange[2] == studentEmail) {
      var toParents = String(currentRange[3]) + ", " + String(currentRange[4]);
      var studentName = String(currentRange[0]);
      var countOfReflections = currentRange[6];
      break;
    } else {
    var toParents = "NO PARENT EMAILS FOUND";
    }
  } 

// FINISH EMAIL BELOW

  MailApp.sendEmail({
     to: toParents,
     bcc: "rdoyle@rafos.org" + ", " + String(studentEmail),
     subject: "Behavior Reflection Notification",

    htmlBody: "<p>Hello,</p>" +
    "<p>Today studentName received a behavior reflection for the following action:</p>" +
    "<p>newReflectionValues</p>" +
    "<p>They took a short break in class and completed the following reflection:</p>" +
    "<p>reflectionInformation</p>" +
   "<p>" + String(studentName) + " has recieved " + countOfReflections + " reflections this year." + "</p>" +
    "<p>This email has been sent with information that the student completed directly on the reflection form and has been bcc'd to them as well as myself. If you have any questions regarding this behavior or incident, please feel free to ask.</p>"

  });

}
函数createEmail(){
//为两张图纸设置变量
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet1=ss.getSheets()[0];
var sheet2=ss.getSheets()[1];
//这将从最近的条目中收集信息,并将其写入名为newReflectionValues的数组
var reflectionAstrow=sheet1.getLastRow();
var reflectionLastColumn=sheet1.getLastColumn();
var reflectionLastCell=sheet1.getRange(reflectionLastRow,reflectionLastColumn).getValue();
var reflectionRange=sheet1.getRange(ReflectionAstrow,1,1,reflectionLastColumn);
var newReflectionValues=reflectionRange.getValues();
var studentEmail=newReflectionValues[0][3];
Logger.log(“新反射值”)
Logger.log(newReflectionValues);
Logger.log(“电子邮件将发送给学生电子邮件:”)
Logger.log(studentEmail)
//生成父电子邮件地址的数组
var rosterLastRow=sheet2.getLastRow();
var rosterLastColumn=sheet2.getLastColumn();
var rosterEmails=sheet2.getSheetValues(2,1,rosterLastRow,rosterlast列);
Logger.log(“父电子邮件”)
Logger.log(名册邮件);
//交叉检查电子邮件-如果匹配,将电子邮件写入变量
var parentrieslength=rosterLastRow;
对于(i=0;i“+
“今天,studentName收到以下操作的行为反射:

”+ “newReflectionValues

”+ “他们在课堂上短暂休息,完成了以下反思:

”+ “反射信息”+ “”+String(studentName)+”今年收到了“+countOfReflections+”反射。“+”

”+ “此电子邮件已发送,其中包含学生直接在反思表上填写的信息,并以密件传给他们和我本人。如果您对此行为或事件有任何疑问,请随时提问。

” }); }
您知道触发器有两种类型,但我认为您对它们的实际含义/作用有点困惑。我将尝试在这里解释文档中的要点

使用简单触发器时,只需使用触发器名称命名函数。例如,对于工作表/表单,当用户提交表单时会触发触发器
onFormSubmit(e)
。参数
e
包含与提交相关的所有信息,您应该对此进行研究,因为它比当前获取提交信息的方法更可靠

简单触发器的功能受到限制,因为触发触发器不需要授权脚本。简单触发器无法访问其他文件、发送电子邮件或执行任何需要授权的操作

已安装的触发器是由用户或脚本手动设置的触发器。已安装的触发器具有更多的功能,但仍有一些限制

安装的触发器可以调用任何命名函数,
e
参数的工作方式与使用简单触发器的工作方式相同

从上面的代码来看,您安装的触发器应该是这样的。

单击“保存”时,应要求您进行授权,如果未要求,请单击“调试/运行”按钮对脚本进行授权


如果仍然不起作用,请检查查看->执行记录中的执行记录,最后一行将指示错误。

好的,James帮了很多忙,但我似乎在验证发送电子邮件的权限时遇到了很多问题。最后,我决定将所有内容写得更清楚,添加一些功能,以便与我一起工作的其他人可以使用相同的脚本,并记录电子邮件是否真的发送给家长。此最终版本使用if语句在列中查看是否为每个响应发送了电子邮件,然后根据需要发送电子邮件并记录发送时间。我还添加了一个函数来设置“确认”列,并将花名册作为一个单独的函数创建。哦,它还寻找一个html模板来格式化电子邮件。我在Google开发者直播流中发现了以下信息:

谢谢大家

function createConfirmationColumn() {
var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet1 = ss.getSheets()[0];

var lastColumn = sheet1.getLastColumn();
var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();

// Creates the final column to log the time that emails are sent
if (lastColumnValue != "Email Sent On:") {
    sheet1.insertColumnsAfter(lastColumn, 1);
    var emailSentOnColumn = sheet1.getRange(1,lastColumn+1).setValue("Email Sent On:");
}
}

function createRosterSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  ss.insertSheet("Roster & Parent Emails", 1);
  var rosterSheet = ss.getSheets()[1];

  rosterSheet.getRange(1,1).setValue("First Name")
  rosterSheet.getRange(1,2).setValue("Last Name")
  rosterSheet.getRange(1,3).setValue("Student Email")
  rosterSheet.getRange(1,4).setValue("Parent Email 1")
  rosterSheet.getRange(1,5).setValue("Parent Email 2")
  rosterSheet.getRange(1,6).setValue("Notes")
  rosterSheet.getRange(1,7).setValue("Total Reflections")

}

function formSetup() {
var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet1 = ss.getSheets()[0];

var lastColumn = sheet1.getLastColumn();
var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();

// Creates the final column to log the time that emails are sent
if (lastColumnValue != "Email Sent On:") {
    sheet1.insertColumnsAfter(lastColumn, 1);
    var emailSentOnColumn = sheet1.getRange(1,lastColumn+1).setValue("Email Sent On:");
}

ss.insertSheet("Roster & Parent Emails", 1);
  var rosterSheet = ss.getSheets()[1];

   rosterSheet.getRange(1,1).setValue("First Name")
   rosterSheet.getRange(1,2).setValue("Last Name")
  rosterSheet.getRange(1,3).setValue("Student Email")
  rosterSheet.getRange(1,4).setValue("Parent Email 1")
  rosterSheet.getRange(1,5).setValue("Parent Email 2")
  rosterSheet.getRange(1,6).setValue("Notes")
  rosterSheet.getRange(1,7).setValue("Total Reflections")
}

function sendEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet1 = ss.getSheets()[0];
var sheet2 = ss.getSheets()[1];

var lastColumn = sheet1.getLastColumn();
var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();

var allFormEntries = sheet1.getDataRange().getValues();
var allRosterValues = sheet2.getDataRange().getValues()

  for (e = 1; e < sheet1.getLastRow(); e++) {
var formRange = allFormEntries[e];

var studentEmailInForm = formRange[1];
var emailSentOn = formRange[4];

if (emailSentOn == "") {

for (i = 1; i < sheet2.getLastRow(); i++) {
  var individualRosterEntry = allRosterValues[i];

  if (studentEmailInForm == individualRosterEntry[2]) {
    var parentEmails = String(individualRosterEntry[3]) + ", " + String(individualRosterEntry[4]);

    var emailTemplate = HtmlService.createTemplateFromFile("emailTemplate");
    emailTemplate.studentName = individualRosterEntry[0];
    emailTemplate.reflectionCount = individualRosterEntry[6];
    emailTemplate.reason = formRange[2];

    MailApp.sendEmail({
      to: parentEmails,
      bcc: "rdoyle@rafos.org" + ", " + String(studentEmailInForm),
      subject: "Behavior Reflection Notification",
      htmlBody: emailTemplate.evaluate().getContent(),
    })

    sheet1.getRange((e+1), lastColumn).setValue(new Date());
    break;
  } else {
   sheet1.getRange((e+1), lastColumn).setValue("No valid email found") ;
  }

} // for i loop

} //if email sent == ""

  } //for e loop

} //function
函数createConfirmationColumn(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet1=ss.getSheets()[0];
var lastColumn=sheet1.getLastColumn();
var lastColumnValue=sheet1.getRange(1,lastColumn.getValue();
//创建最后一列以记录发送电子邮件的时间
如果(lastColumnValue!=“电子邮件发送日期:”){
活页1.插入柱后(最后一列,1);
var emailSentOnColumn=sheet1.getRange(1,lastColumn+1).setValue(“电子邮件