【问题标题】:How to use Google Scripts with Google Sheets to send an email 3 days before a defined date?如何在指定日期前 3 天使用 Google 脚本和 Google 表格发送电子邮件?
【发布时间】:2016-10-26 07:19:36
【问题描述】:

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

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

这里是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);
    }
  } 
}

【问题讨论】:

  • 你有没有试过转储objects来看看它的内部结构?我不是一个 JS 人,但我相信有一些库/sn-ps 可用于在 JS 中转储复杂的变量。

标签: java scripting google-sheets


【解决方案1】:

基于此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
            }
    }
};

【讨论】:

  • 嗯..这似乎不起作用我尝试将它与我当前的电子表格一起使用,但它什么也没做。你测试的时候效果好吗?
  • 我需要问你一些澄清。将对您之前共享的工作表发表一些评论,以便我可以帮助您。
  • 已为您修复。忘记了“For”循环后面的 {}。在 GMT+0800 上,将其更改为 GMT-0800。我根据我的时区使用 GMT+0800 测试它
  • 成功了!非常感谢你的帮助!我真的很感激。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2022-11-16
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多