Google 表格 - 当复选框更改为 True 时发送电子邮件

Google Sheets - Send Email when checkbox is changed to True

抱歉,这可能有点基础,但我已经有一段时间没有使用 google 脚本了。

我正在尝试创建一个 sheet,当 I 列(完成)中的复选框标记为 true 时,它​​会向 E 列同一行中填充的地址发送一封电子邮件(电子邮件)。

如果它还在 J 列(完成日期)中添加时间戳以显示复选框被标记的时间,我会更喜欢。然后,如果可能,请将 B 列(订单号)中的文本包含在电子邮件的主题 header 中,并将 G 列(查询)中的文本包含在电子邮件的 body 中。当然,避免它循环,这样它只会在选中行中的相关单元格时触发电子邮件。

可以参考这个示例代码:

Code.gs

function onEdit(e){
  var sheet = e.source.getActiveSheet();
  var cell = e.range;

  Logger.log(cell.getColumn());
  Logger.log(cell.isChecked());
  //Check if the checkbox in column I(index 9) was checked
  if(sheet.getName() == "Sheet2" && cell.getColumn() == 9 && cell.isChecked()){

    //get current row values from column A to column G
    var values = sheet.getRange(cell.getRow(),1,1,7).getDisplayValues().flat();
    Logger.log(values);
    var orderNum = values[1];
    var agent = values[3];
    var email = values[4];
    var query = values[6];

    //create and update the email's hmtl body
    var templ = HtmlService.createTemplateFromFile('html_template');
    templ.receiver = agent;
    templ.query = query;
    var message = templ.evaluate().getContent();

    //Send email
    MailApp.sendEmail({
      to: email,
      subject: "Test Email Order Num: "+orderNum,
      htmlBody: message
    });

    //Add timestamp at column J(index 10)
    var timeZone = Session.getScriptTimeZone();
    var date = Utilities.formatDate(new Date(),timeZone, "MM-dd-yyyy");
    sheet.getRange(cell.getRow(),10).setValue(date);
  }
}

html_remplate.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <p>Hello <?= receiver ?>,</p>
    <p> <?= query ?></p>
    <p>Best Regards,</p>
    <p>Support,<br>Company.com</p>
    
  </body>
</html>

先决条件:

正如@Cooper 在评论中提到的,您的代码将需要一个 installable onEdit trigger,因为它可以调用需要授权的服务 (such as MailApp.sendEmail())

它有什么作用?

  1. 获取当前点差sheet的活动sheet和使用Google Sheets onEdit event object
  2. 的单元格范围
  3. 检查修改后的单元格是否在特定的sheet.
  4. 检查修改后的单元格是否在第 I 列(索引 9)中以及是否使用 Range.isChecked()
  5. 选中复选框
  6. 使用 Sheet.getRange(row, column, numRows, numColumns) and Range.getValues() 获取从 A 列到 G 列的当前行值。这将 return 一个二维数组,我用 array.flat() 将其更改为一维数组。
  7. 使用其特定索引获取行值中的特定信息。例如,订单号应该在数组 values
  8. 的索引 1 中
  9. 创建 HtmlTemplate using HtmlService.createTemplateFromFile(filename). Update the necessary html content variable. Then create an HtmlOutput using HtmlTemplate.evaluate()
  10. 使用 HtmlOutput.getContent()
  11. 获取 html 输出的内容
  12. 使用 MailApp.sendEmail(message)
  13. 发送电子邮件
  14. 最后,在 J 列(索引 10)中添加日期时间戳。我使用 Utilities.formatDate(date, timeZone, format)
  15. 创建了一个日期字符串

注:

  • 您可以根据自己的喜好更改日期格式,目前我使用"MM-dd-yyyy"。有关如何配置日期时间格式的更多详细信息,请参阅 here
  • 如果您计划使用脚本编辑器中的 Run 按钮 运行 onEdit(),请注意执行会失败,因为事件对象 e 未定义.如果您想调试 onEdit() 触发器,您可以在代码中添加日志,然后修改 sheet 中的单元格,然后在执行选项卡
  • 中检查执行日志

输出: