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

    这是任务表的示例格式。

    谢谢!我一定会尝试一下。