【问题标题】:Google Sheets - Send Email when checkbox is changed to True [closed]Google表格-复选框更改为True时发送电子邮件[关闭]
【发布时间】:2021-09-01 13:02:32
【问题描述】:

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

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

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

【问题讨论】:

  • 您的目标似乎需要一个可安装的 onedit 触发器。
  • onEdit 触发器会起作用。我对类似的项目采取了不同的方法。我有一个按钮,用户可以单击以发送电子邮件,它将使用用户所在行的数据。脚本在发送之前确认它们位于正确的行。

标签: email google-apps-script google-sheets timestamp


【解决方案1】:

你可以参考这个示例代码:

代码.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. 使用Google Sheets onEdit event object获取当前电子表格的活动工作表和单元格区域
  2. 检查修改后的单元格是否在特定工作表中。
  3. 检查修改后的单元格是否在第一列(索引 9)中,以及是否使用Range.isChecked() 选中了复选框
  4. 使用Sheet.getRange(row, column, numRows, numColumns)Range.getValues() 获取A 列到G 列的当前行值。这将返回一个二维数组,我使用array.flat() 将其更改为一维数组。
  5. 使用特定索引获取行值中的特定信息。例如,订单号应该在数组值的索引 1 中
  6. 使用HtmlService.createTemplateFromFile(filename) 创建一个HtmlTemplate。更新必要的 html 内容变量。然后使用HtmlTemplate.evaluate() 创建一个HtmlOutput
  7. 使用HtmlOutput.getContent()获取html输出的内容
  8. 使用MailApp.sendEmail(message)发送电子邮件
  9. 最后,在 J 列(索引 10)中添加日期时间戳。我使用Utilities.formatDate(date, timeZone, format) 创建了一个日期字符串

注意:

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

输出:

【讨论】:

  • 那是正确的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多