Отправка электронной почты с помощью скрипта из таблицы Google - нужен цикл - PullRequest
0 голосов
/ 12 октября 2018

У меня есть таблица, которая содержит разные события в разные дни.

В каждом мероприятии есть инструктор и ведущий.

Сценарий запрограммирован на отправку напоминания инструктору и ведущему в ночь перед назначением каждого события.

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

В настоящее время по электронной почте отправляется одно письмо в день - независимо от того, сколько дней или фасилитаторов.

Мне нужно отослать по одной электронной почте на строку, и у меня возникли проблемы с определением необходимого цикла.Буду признателен за помощь.Вот мой сценарий:

   function SGIDReminder() {
  //get the spreadsheet object
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //set the first sheet as active
  SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
  //fetch this sheet
  var sheet = spreadsheet.getActiveSheet();

  //figure out what the last row is
  var lastRow = sheet.getLastRow();

  //the rows are indexed starting at 1; first row is header row so start with 2
  var startRow = 2;

  //grab column 13; it contains the reminder days left
  var range = sheet.getRange(2,13,lastRow-startRow+1, 1);
  var numRows = range.getNumRows();
  var reminder_send_values = range.getValues();

  //grab column for name of reminder
  range = sheet.getRange(2,4,lastRow-startRow+1, 1);
  var course_values = range.getValues();

  //grab column for location
  range = sheet.getRange(2,3,lastRow-startRow+1, 1);
  var location_values = range.getValues();

  //grab column for time
  range = sheet.getRange(2,2,lastRow-startRow+1, 1);
  var time_values = range.getValues();

  //grab column for email
  range = sheet.getRange(2,10,lastRow-startRow+1, 1);
  var email_values = range.getValues();

  //grab column for instructor email
  range = sheet.getRange(2,7,lastRow-startRow+1, 1);
  var instructor_email_values = range.getValues();

  var warning_count = 0;
  var msg = "";

  //Loop over the reminder_send values
  //changed time to hour to avoid message formatting and date addition javascript wanted to add
  for (var i = 0; i <= numRows - 1; i++) {
    var reminder_send = reminder_send_values[i][0];
    if(reminder_send == 1) {
      //if it is 1, do something with the data
      var course = course_values[i][0];
      var location = location_values[i][0];
      var hour = time_values[i][0];
      var email =  email_values[i][0];
      var instructor = instructor_email_values[i][0];
      msg = msg + "Reminder: You have an SGID scheduled tomorrow  at "+hour+" in "+location+" for "+course+".\n Please remind students to bring a smartphone or web capable device with them to class.";
      warning_count++;
    }
  }
  //cc instructor - but could bcc or add other emails, from cte, reply to Gregg
  if(warning_count) {
    MailApp.sendEmail(email, "SGID Reminder Message", msg,
                      {bcc: "myemail@miamioh.edu", cc: instructor, name: "CTE", replyTo: "coordinator@miamioh.edu"});
   }                      
};

1 Ответ

0 голосов
/ 14 октября 2018

Это не решение «под ключ», но иллюстрирует, что вы можете сделать.

Чтобы отправить более одного электронного письма, вам необходимо собирать электронные письма для каждого случая, для которого требуется электронное письмо.Обычно это делается с использованием Object или Array, или, возможно, Array из Object с (например, для объединения более одного фрагмента информации).

Возможно, это стоитотправить только одно электронное письмо каждому инструктору, содержащему список всех событий, которые они имеют, и одно электронное письмо каждому фасилитатору, содержащему список всех событий, которые они имеют.

В этом примере объект используется для хранения объекта.instructor и facilitator информация для обработки электронной почты вне цикла данных электронной таблицы.Каждое релевантное электронное письмо используется как ключ объекта со значением, которое является массивом информации о событии.

const data = sheet.getDataRange().getValues();
const headers = data.shift();
const reminderColText = "Reminder Days Left", // Title of the header col
      compareCol = headers.indexOf(reminderColText),
      // If the row & column intersection has this value, an email is sent for the row's data
      sendIfDays = 1;
if (compareCol === -1)
  throw new Error("Did not find the header column titled '" + reminderColText + "'")

// Prune the sheet's data to only that which we care about.
const events = data.filter(function (row) { return row[compareCol] === sendIfDays; });

const infoIndices = { eventName: 0, // Event name in Col A
                      eventTime: 1,
                      eventLoc: 3, // Event location in Col D
                      instructorEmail: 4,
                      facilitatorEmail: 5 };
const emailInfo = { instructors: {}, facilitators: {} };
events.forEach(function (row) {
  var ins = row[infoIndices.instructorEmail],
      fac = row[infoIndices.facilitatorEmail],
      name = row[infoIndices.eventName],
      time = row[infoIndices.eventTime],
      loc = row[infoIndices.eventLoc];

  // Create an Array for each instructor / facilitator email
  if (!emailInfo.instructors[ins])
    emailInfo.instructors[ins] = [];
  if (!emailInfo.facilitators[fac])
    emailInfo.facilitators[fac] = [];

  // Add the event data to the relevant array
  var eData = { name: name, time: time, loc: loc };
  emailInfo.instructors[ins].push(eData);
  emailInfo.facilitators[fac].push(eData);
});

// Send emails based on the collected information.
[ {r: emailInfo.instructors,  f: getFormattedInstructorMessage_},
  {r: emailInfo.facilitators, f: getFormattedFacilitatorMessage_} 
].forEach( function (o) {
  var formatFunc = o.f;
  for (var email in o.r) {
    var recipientName = getNameFromEmailSomehow_(email);
    var msg = formatFunc(recipientName, o.r[email]);
    MailApp.sendEmail(email, "Subject", msg);
  }
});

Выше предполагается, что вы также написали некоторые фоновые функции:

  • функция getNameFromEmailSomehow_, которая преобразует электронную почту в имя (например, поиск в LDAP, или, может быть, вы написали имя инструктора / помощника в строке и включили его в eData
  • две функции форматирования getFormattedInstructorMessage_и getFormattedFaciliatorMessage_, которые берут имя получателя и список всех его событий на предстоящий день и используют список объектов для создания текста электронного письма. Вы можете вернуть HTML (и использовать другую версию MailApp.sendEmail) или простопростой текст, в зависимости от того, что вы предпочитаете.

Абсолютно примитивный пример форматера:

function basicFormattedMessage_(to, events) {
  var msg = "Hello " + to + ",\n";
  msg += "You have " + events.length + " events tomorrow:\n";
  events.forEach(function (e) {
    msg += "\nName: " + e.name;
    msg += "\nTime: " + e.time;
    msg += "\nRoom: " + e.loc;
    msg += "\n";
  });
  return msg;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...