Google apps script 基于日期和名称的电子邮件通知
希望有人能把我引向正确的方向。 我有一张时间表和一张联系表 日程安排表是这样的Google apps script 基于日期和名称的电子邮件通知,google-apps-script,google-sheets,Google Apps Script,Google Sheets,希望有人能把我引向正确的方向。 我有一张时间表和一张联系表 日程安排表是这样的 4/11/16 John Front Desk 4/11/16 Chris Back Room 4/11/16 John Stage 4/11/16 Sarah Front Desk 4/12/16 Joe Back Room 4/12/16 Alex John john@gmail.com Chris chris@gmail.com Alex Sarah sarah@gmail.com Joe 联系人表
4/11/16 John Front Desk
4/11/16 Chris Back Room
4/11/16 John Stage
4/11/16 Sarah Front Desk
4/12/16 Joe Back Room
4/12/16 Alex
John john@gmail.com
Chris chris@gmail.com
Alex
Sarah sarah@gmail.com
Joe
联系人表看起来像这样
4/11/16 John Front Desk
4/11/16 Chris Back Room
4/11/16 John Stage
4/11/16 Sarah Front Desk
4/12/16 Joe Back Room
4/12/16 Alex
John john@gmail.com
Chris chris@gmail.com
Alex
Sarah sarah@gmail.com
Joe
因此,基本上,脚本将遍历工作表,如果date列中的日期距离今天还有3天,它将向当天分配任务的人员发送电子邮件提醒。它将比较日程表上的名称和联系人表中的名称,以查找电子邮件地址并将其添加到emailadd变量中
它可以工作,但由于我在脚本方面的知识有限,我觉得我在做这件事时效率非常低下。此外,例如,当约翰在同一天有三份工作时,他会收到三封不同的电子邮件,而不是一封。
此外,有些人没有电子邮件地址,因此脚本仍将尝试通过电子邮件发送消息,失败后继续下一个。虽然这对我来说很好,因为每天晚上不超过10-12封电子邮件,但我觉得有一种更有效的方法可以做到这一点。任何帮助都将不胜感激
这是密码
function checkReminder() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('Notification'));
var schedulesheet = spreadsheet.getActiveSheet();
var lastRow = schedulesheet.getLastRow();
var contactspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(contactspreadsheet.getSheetByName('Contacts'));
var contactsheet = contactspreadsheet.getActiveSheet();
var conlastRow = contactsheet.getLastRow();
var startRow = 2;
//Grab column of scheduled dates and number of rows in the schedule sheet
var schedulerange = schedulesheet.getRange(2,2,lastRow-startRow+1,1 );
var numRows = schedulerange.getNumRows();
var scheduledassigneddate = schedulerange.getValues();
var scheduledformatteddate = Utilities.formatDate(new Date(scheduledassigneddate), "GMT-4:00", "MM/dd/YYYY");
//Grab column of scheduled names in the schedule sheet
var schedulenamerange = schedulesheet.getRange(2, 3, lastRow-startRow+1, 1);
var schedulednames = schedulenamerange.getValues();
//Grab column of assignments
var scheduleassignmentrange = schedulesheet.getRange(2, 4, lastRow-startRow+1, 1);
var assignmentrange = scheduleassignmentrange.getValues();
//Grab column of names and number of rows in the contact sheet
var contactrange = contactsheet.getRange(2,2,conlastRow-startRow+1,1 );
var contactname = contactrange.getValues();
var numRows2 = contactrange.getNumRows();
//Grab column of email addresses in the contact sheet
var contactemailrange = contactsheet.getRange(2, 3, conlastRow-startRow+1, 1);
var assignedemail = contactemailrange.getValues();
// Format today's date to match lists of dates in schedule sheet
var today = new Date();
today = today.setDate(today.getDate()+3);
var threedaysaway = Utilities.formatDate(new Date(today), "GMT-4:00", "MM/dd/YYYY");
var emailadd ="";
// Loop over the column of date values in the schedule sheet
for (var i = 0; i <= numRows - 1; i++) {
var scheduleddate = scheduledassigneddate[i][0];
var scheduledformatteddate = Utilities.formatDate(new Date(scheduleddate), "GMT-4:00", "MM/dd/YYYY");
//if the scheduled date is three days away, start associating names to email.
if(scheduledformatteddate == threedaysaway)
{
var notify_name = schedulednames[i][0];
for (var j = 0; j <= numRows2 - 1; j++) {
// Set email variables to null
var email_value = 0;
var msg = "";
//compare names falling under date that is 3 days away from today
var comparenames = contactname[j][0];
var assignment = assignmentrange[i];
if(notify_name == comparenames)
//if the name in the schedule sheet matches the name in the contact sheet,
//grab the email address in the next colum "assignedemail" and add it to var emailadd.
emailadd = emailadd + assignedemail[j] +",";
assignment = assignmentrange[i];
}
msg = msg + "Hello "+notify_name+", \n\nYou are scheduled to cover " + assignment + " on " +threedaysaway;
email_value++;
Logger.log(emailadd);
Logger.log(msg);
//if email_value is not null, send email. Loop back to stop and start over until loop is finished.
if(email_value) {
MailApp.sendEmail(emailadd,
"Reminder Email", msg);
}
emailadd = "";
assignment = "";
}
}
};
功能检查提醒(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
电子表格app.setActiveSheet(电子表格.getSheetByName('Notification'));
var schedulesheet=spreadsheet.getActiveSheet();
var lastRow=schedulesheet.getLastRow();
var contactspreadsheet=SpreadsheetApp.getActiveSpreadsheet();
电子表格app.setActiveSheet(contactspreadsheet.getSheetByName('Contacts');
var contactsheet=contactspreadsheet.getActiveSheet();
var conlastRow=contactsheet.getLastRow();
var startRow=2;
//获取计划日期列和计划表中的行数
var schedulerange=schedulesheet.getRange(2,2,lastRow startRow+1,1);
var numRows=schedulerange.getNumRows();
var scheduledassigneddate=schedulerange.getValues();
var scheduledformatteddate=Utilities.formattedate(新日期(scheduledassigneddate),“GMT-4:00”,“MM/dd/YYYY”);
//获取明细表中明细表名称的列
var schedulenamerange=schedulesheet.getRange(2,3,lastRow startRow+1,1);
var schedulednames=schedulenamerange.getValues();
//抓取一列作业
var schedulesignmentrange=schedulesheet.getRange(2,4,lastRow startRow+1,1);
var assignmentrange=schedulesignmentrange.getValues();
//抓取联系人表中的姓名列和行数
var contactrange=contactsheet.getRange(2,2,conlastRow startRow+1,1);
var contactname=contactrange.getValues();
var numRows2=contactrange.getNumRows();
//抓取联系人表中的电子邮件地址列
var contactemailrange=contactsheet.getRange(2,3,conlastRow startRow+1,1);
var assignedemail=contactemailrange.getValues();
//设置今天日期的格式,以匹配明细表中的日期列表
var today=新日期();
today=today.setDate(today.getDate()+3);
var threedaysaway=Utilities.formatDate(新日期(今天),“GMT-4:00”,“MM/dd/YYYY”);
var emailadd=“”;
//在明细表中的日期值列上循环
对于(var i=0;i,您可以修改您的方法:
筛选日期符合通知条件的数据
筛选名称以删除重复项
准备发送通知功能
搜索“一个人”下的任务,并将其连接到电子邮件正文。要在此处搜索某行的特定值,将提供指导
下面是一个示例代码:
function findCell() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRange = sheet.getDataRange();
var values = dataRange.getValues();
for (var i = 0; i < values.length; i++) {
var row = "";
for (var j = 0; j < values[i].length; j++) {
if (values[i][j] == "User") {
row = values[i][j+1];
Logger.log(row);
Logger.log(i); // This is your row number
}
}
}
}
这是任务表的示例格式。谢谢!我一定会尝试一下。