Триггер проекта Google script не запущен?


Я довольно новичок в Javascript и работал над этим сценарием, чтобы взять самую последнюю запись в электронной таблице (созданной из формы Google), сопоставить адрес электронной почты пользователей, который собран в списке на втором листе, и отправить письмо родителям. Я учитель, и идея состоит в том, чтобы создать форму google, которая собирает информацию, которую вводят студенты, и отправляет ее по электронной почте своим родителям, как только они отправят форму/обновят лист.

Я знаю, что это довольно сумбурно...есть некоторые дополнительные переменные и прочее, но скрипт работает отлично/как и ожидалось, когда вы" запускаете " скрипт. Единственное, я пытался запустить скрипт на триггере, когда форма будет отправлена, но это не так. я что-то упустил с использованием триггеров?

Код ниже:

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>"

  });

}
2 3

2 ответа:

Вы знаете, что есть 2 типа триггера простой и устанавливаемый , но я думаю, что вы немного смущены относительно того, что они на самом деле означают/ делают. Я попытаюсь объяснить ключевые моменты из документации здесь.

Простой триггер используется путем простого присвоения функции имени триггера. Например, в случае листов / форм триггер onFormSubmit(e) срабатывает, когда пользователь отправляет форму. Параметр e содержит всю информацию, относящуюся к представлению, вы должны посмотрите на это, поскольку это гораздо более надежный, чем ваш текущий метод получения представленной информации. смотрите здесь: параметр' e '

Простые триггеры ограничены в своей функциональности, так как сценарий не должен быть авторизован для запуска триггера. Простой триггер не может получить доступ к другим файлам, отправлять электронные письма или выполнять любые действия, требующие авторизации. смотрите здесь

Установленный триггер-это триггер, который настраивается вручную пользователем или скриптом. Установленные триггеры обладают гораздо большей функциональностью, но все же имеют некоторые ограничения. смотрите здесь

Установленный триггер может вызывать любую именованную функцию, а параметр e работает так же, как и с простыми триггерами.

Из вашего кода выше установленный триггер должен выглядеть так. Введите описание изображения здесь

Когда вы нажмете кнопку Сохранить, вас попросят авторизоваться, если вы этого не сделаете, нажмите кнопку отладка/ запуск, чтобы авторизовать сценарий.

Если это все еще не работает проверьте транскрипт выполнения в поле зрения - > execution transcript, последняя строка будет указывать на ошибку.

Хорошо, Джеймс очень помог, но у меня, похоже, было много проблем с аутентификацией разрешений на отправку электронных писем. В конце концов я решил переписать все более четко, добавить некоторые функции, чтобы другие, с которыми я работаю, могли использовать тот же сценарий, и вести учет того, действительно ли письма были отправлены родителям. Эта окончательная версия использует оператор if для просмотра в столбце, было ли отправлено электронное письмо для каждого ответа, а затем отправляет электронное письмо, если это необходимо, и записывает, когда оно было отправлено. отправлено. Я также добавил функцию, чтобы настроить этот столбец "подтверждение" и создать лист реестра как отдельную функцию, так и отдельно. О, и он также ищет шаблон html для форматирования электронной почты. Я нашел эту информацию в прямом эфире Google developers: https://www.youtube.com/watch?v=U9Ej6PCeO6s

Спасибо всем!

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