#javascript #loops #google-apps-script
#javascript #циклы #google-apps-script
Вопрос:
Я нашел много полезного на этом форуме. Я новичок в GAS и JS-кодировании в целом, и я не могу найти способ решить то, в чем я уверен, это NBD.
Сначала я прикрепляю код:
function emailAlert() {
// today's date information
var today = new Date();
var todayMonth = today.getMonth() 1;
var todayDay = today.getDate();
var todayYear = today.getFullYear();
// getting data from spreadsheet
var url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("Assignments");
var resultssn = SpreadsheetApp.openByUrl(url).getName();
//Emails addresses
var emailJonDoe = "example@example.com"
var emailEmilyDoe = "example@example.com"
var duedatesRange = sheet.getRange("H5:H9");
var duedates = duedatesRange.getValues();
var actionitRange = sheet.getRange("C5:C9");
var actionit = actionitRange.getValues();
var prjsRange = sheet.getRange("B5:B9");
var prjs = prjsRange.getValues();
var whosRange = sheet.getRange("D5:D9");
var whos = actionitRange.getValues();
//looping through all of the rows
for (var i = 0; i < duedates.length; i) {
var row = duedates[i];
for (var i = 0; i < actionit.length; i) {
var assignmenttext = actionit[i];
for (var i = 0; i < prjs.length; i) {
var project = prjs[i];
for (var i = 0; i < whos.length; i) {
var user = whos[i];
var expireDateFormat = Utilities.formatDate(
new Date(row[i]),
'ET',
'MM/dd/yyyy'
);
// email information
var subject = '';
var message =
" One of your action items is due today. "
'n'
'n'
' Project: '
project[i]
'n'
'n'
' Action Item: '
assignmenttext[i]
'n'
'n'
'Check the Tracker now !!'
'n'
url;
//expiration date information
var expireDateMonth = new Date(row[i]).getMonth() 1;
var expireDateDay = new Date(row[i]).getDate();
Logger.log("Expire date is:" expireDateDay);
//check for JD and send email to him if true
if (
user[i] === "JD" amp;amp;
expireDateMonth === todayMonth amp;amp;
expireDateDay === todayDay
) {
var subject =
'FEG AAAAAAManagement - An action item is due today!! : ' assignmenttext[i];
MailApp.sendEmail(emailJonDoe, subject, message);
Logger.log('todayyyy!');
}
//check for ED and send email to him if true
if (
user[i] === "ED" amp;amp;
expireDateMonth === todayMonth amp;amp;
expireDateDay === todayDay
) {
var subject =
'FEG DDDDDManagement - An action item is due today!! : ' assignmenttext[i];
MailApp.sendEmail(emailEmilyDoe, subject, message);
Logger.log('todayyyy!');
}
}
}
}
}
}
введите описание изображения здесь
Это простой фрагмент, который отправляет электронные письма для каждой строки, содержащей сегодняшнюю дату в столбце H.
У меня уже работает аналогичный, но я хотел бы реализовать функцию «user». Короче говоря, я хочу, чтобы код:
- Проверьте для каждой строки, содержащей сегодняшнюю дату в столбце H.
- Для каждой из приведенных выше строк проверьте содержимое соответствующей ячейки в столбце D. Если он содержит JD, отправьте электронное оповещение на электронную почту JD. Если он содержит ED, отправьте электронное оповещение на электронную почту ED.
- Электронное письмо должно содержать соответствующую ячейку строки для столбца C (assignmenttext) и столбца B (project).
AFAIK, этот код не слишком тяжелый на стороне сервера, поскольку я только «getRange» в начале, и большая часть кода выполняется на стороне клиента (это правильно?).
Я не уверен, какую функцию цикла использовать в этом случае и как реализовать ее с помощью моего кода.
Я открыт для любых комментариев или предложений. Заранее спасибо всем, кто потратит некоторое время, чтобы помочь мне. (:
Комментарии:
1. Забавно, что вы должны сказать, что вы не можете найти такое решение в Stack Overflow, потому что вопросы электронной почты являются одними из самых распространенных в Stack Overflow. Мое первое впечатление было бы, что вы, вероятно, не слишком усердствовали.
2. Привет, Купер. Я просмотрел темы функций электронной почты на этом форуме. Проблема скорее в циклах, а не в функции отправки электронной почты.
Ответ №1:
Это то, что я бы сделал. По общему признанию, вам должно быть удобно работать с массивами, но это создает приятный компактный код.
Два объекта email и prefix предоставляют место для ввода новых пользователей в одном месте и упрощают код, позволяя использовать одну команду отправки.
function emailAlert() {
const sentcolumn=45;//I recommend adding some column to contain and indication of when an email is already been sent.
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName("Assignments");
const vA=sh.getRange(5,1,5,sentcolumn).getValues();//your data went from row 5 to row 9 that is five rows
const dt=new Date();
const today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//this is a number
const emails={"JD":"jd@example.com","ED":"ed@example.com"};//emails
const prefix={"JD":"FEG AAAAAAManagement - An action item is due today!! : ","ED":"FEG DDDDDManagement - An action item is due today!! : "};//subject prefixes
vA.forEach(function(r,i){
let x=new Date(r[7]);
let duedate=new Date(x.getFullYear(),x.getMonth() 1,x.getDate()).valufOf();//this is a number
var body=Utilities.formatString('One of your action items is due today. nn Project: %s nn Action Item: %snnCheck the Tracker now !!n%s',r[1],R[2],ss.getUrl());
let subject=prefix[r[3]] r[2];
if(today==duedate amp;amp; r[sentcolumn-1]!='Sent') {
GmailApp.sendEmail(emails[r[3]],subject,body);
sh.getRange(i 5,sentcolumn).setValue('Sent');//adding something like this would keep you from sending duplicate emails by mistake
}
});
}
Ответ №2:
Это можно сделать с помощью одного цикла for, проверяя данные в каждой строке:
function sendEmail() {
// today's date information
var today = new Date();
var todayMonth = today.getMonth() 1;
var todayDay = today.getDate();
var todayYear = today.getFullYear();
Logger.log(todayDay);
// getting data from spreadsheet
var url = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var sheet = SpreadsheetApp.openByUrl(url).getSheetByName("Assignments");
var resultssn = SpreadsheetApp.openByUrl(url).getName();
//Emails addresses
var emailJonDoe = "example@example.com"
var emailEmilyDoe = "example@example.com"
var lastRow = sheet.getLastRow();
var dataRange = sheet.getRange(2,1,lastRow,8).getValues();
//looping through all of the rows
for (var i = 0; i < lastRow-1; i ) {
var project = dataRange[i][1];
var assignmenttext = dataRange[i][2];
var user = dataRange[i][3];
var row = dataRange[i][7];
//expiration date information
var expireDateFormat = Utilities.formatDate(new Date(row),'ET','MM/dd/yyyy');
var expireDateMonth = new Date(row).getMonth() 1;
var expireDateDay = new Date(row).getDate();
Logger.log("Expire date is:" expireDateDay);
//check for expiry date
if (expireDateMonth === todayMonth amp;amp; expireDateDay === todayDay) {
var subject =
'FEG AAAAAAManagement - An action item is due today!! : ' assignmenttext;
// email information
var message =
" One of your action items is due today. "
'n'
'n'
' Project: '
project
'n'
'n'
' Action Item: '
assignmenttext
'n'
'n'
'Check the Tracker now !!'
'n'
url;
if (user === 'JD') {
MailApp.sendEmail(emailJonDoe, subject, message);
}
if (user === 'ED') {
MailApp.sendEmail(emailEmilyDoe, subject, message);
}
}
}
}
Выполнение этого на листе примеров возвращает:
Обратите внимание, что я не отправлял электронные письма, вместо этого я просто регистрировал значения в своем тестовом коде.