java - 如何使用 Google 脚本和 Google 表格在指定日期前 3 天发送电子邮件?

标签 java scripting google-sheets

我修改了 Google 的邮件合并示例,以创建一个 Google 电子表格/脚本,我希望在客户租赁到期日之前 3 天发送电子邮件。我设置了一个单元格,用于获取用户输入的租金到期日并减去今天的日期。

然后,我运行一个 if 语句来检查该单元格是否等于 3,如果是,则使用 MailApp 发送电子邮件。但由于某种原因,它似乎不起作用,当我尝试 Logger.log 时,变量返回未定义。我对 Google 脚本和表格还很陌生,所以如果我的表述含糊不清或不理解一些基本内容,我深表歉意。

这里是a link to the sheet ,您只需转到工具/脚本编辑器即可查看脚本。

function sendEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheets()[0];
  var dataRange = dataSheet.getRange(2, 1, dataSheet.getMaxRows() - 1, 7);

  var templateSheet = ss.getSheets()[1];
  var emailTemplate = templateSheet.getRange("A1").getValue();

  // Create one JavaScript object per row of data.
  var objects = getRowsData(dataSheet, dataRange);

  // For every row object, create a personalized email from a template and send
  // it to the appropriate person.
  for (var i = 0; i < objects.length; ++i) {
    // Get a row object
    var rowData = objects[i];

    // Generate a personalized email.
    // Given a template string, replace markers (for instance ${"First Name"}) with
    // the corresponding value in a row object (for instance rowData.firstName).
    var emailText = fillInTemplateFromObject(emailTemplate, rowData);
    var emailSubject = "Your Renty Rental is Due Soon!";
    var timeTill = objects[i][6];
    Logger.log(timeTill);
    if (timeTill == 3) {
      MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText);
    }
  } 
}

最佳答案

基于此link

假设您只是想向收件人发送简单的电子邮件,我为您制作了一个更简单的电子邮件功能;

function sendMail(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();   //Get the active Spreadsheet
  var sheet = ss.getSheetByName('Sheet1');     //Get the sheet by name, Sheet1 as example
  var startRow = 2;     //We start process things from row 2
  var lastRow = sheet.getLastRow();    //Get the last row of data to be processed
  var lastCol = sheet.getLastColumn();  // Get the last column of data to be processed
  var range = sheet.getRange(2,1,lastRow,lastCol);  //Fetch the range
  var data = range.getValues();   //Get the values inside the range
      for (var i = 0;i<data.length;i++)   //Iterate values
        var row = data[i];   //Set up variable for easier retrieve data to be processed and more understandable by human
        var FirstName = row[1];  //Column B
        var LastName = row[2];   //Column C
        var emailAddress = row[3];  //Column D
        var dueDate = Utilities.formatDate(new Date(row[4]),'GMT+0800','MM/dd/yyyy');   //Column E. Utilities format so the date won't be in long values
        var timer = row[6];  //Column G
        var msg = 'Hello '+FirstName+' '+LastName+'<br><br>'   // Your templates
                 +'This is a test mail '+dueDate+'<br><br>'
                 +'Bla bla bla<br>'
                 +'Another lines of texts<br><br>'
                 +'Another lines of texts<br><br>'
                 +'Thank You<br><br>'
                 +'OH!! I like Banana.';
            if(timer == 3){   //Set up the condition
            GmailApp.sendEmail(emailAddress,'Your Renty Rental is Due Soon!',msg,{htmlBody:msg});   //Send the email to the recipient
            sheet.getRange(startRow+i,7).setNote('Email Sent');  //Set note on column 'G' 
            }
}

要让触发器每天运行,请转到“资源”,单击“当前项目触发器”。使用“函数 sendMail”、“时间驱动”、“日计时器”、“您希望脚本运行的时间”设置新项目触发器。

如果有任何疑问,请在此处评论。

<小时/>

已修复: 我忘记了“For”循环后面的 {};

function sendMail(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();   //Get the active Spreadsheet
  var sheet = ss.getSheetByName('Sheet1');     //Get the sheet by name, Sheet1 as example
  var startRow = 2;     //We start process things from row 2
  var lastRow = sheet.getLastRow();    //Get the last row of data to be processed
  var lastCol = sheet.getLastColumn();  // Get the last column of data to be processed
  var range = sheet.getRange(2,1,lastRow,lastCol);  //Fetch the range
  var data = range.getValues();   //Get the values inside the range
      for (var i = 0;i<data.length;i++){   //Iterate values
        var row = data[i];   //Set up variable for easier retrieve data to be processed and more understandable by human
        var FirstName = row[1];  //Column B
        var LastName = row[2];   //Column C
        var emailAddress = row[3];  //Column D
        var dueDate = Utilities.formatDate(new Date(row[4]),'GMT+0800','dd/MM/yyyy');   //Column E. Utilities format so the date won't be in long values
        var timer = row[6];  //Column G
        var msg = 'Hello '+FirstName+' '+LastName+'<br><br>'   // Your templates
                 +'This is a test mail '+dueDate+'<br><br>'
                 +'Bla bla bla<br>'
                 +'Another lines of texts<br><br>'
                 +'Another lines of texts<br><br>'
                 +'Thank You<br><br>'
                 +'OH!! I like Banana.';
            if(timer ==3){   //Set up the condition
            GmailApp.sendEmail(emailAddress,'Your Renty Rental is Due Soon!',msg,{htmlBody:msg})   //Send the email to the recipient
            sheet.getRange(startRow+i,7).setNote('Email Sent');  //Set note on column 'G' 
            SpreadsheetApp.flush
            }
    }
};

关于java - 如何使用 Google 脚本和 Google 表格在指定日期前 3 天发送电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000386/

相关文章:

javascript - 使用 GAS 在 Google 工作表选项卡之间附加数据

google-sheets - 在 Google 表格中如何引用列中的无限行?

google-apps-script - 在 Google 表格中自动生成唯一的顺序 ID

java - java中Vector和Collections.synchronizedList都是同步的,有什么区别?

java - 如何动态地将 fragment 添加到现有 fragment ?

javascript - "truthy"和 "falsey"的结果在 JavaScript 中很困惑

python - 如何在纯 Python 中对 Python 进行沙箱处理?

java - 在 hibernate 中创建自定义 ID 生成器时出现问题

java - 完成一个功能;返回无效或中断循环?

shell - 从文本文件读取时如何在 korn shell 中分配包含 * 的变量