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()
)
它有什么作用?
- 获取当前点差sheet的活动sheet和使用Google Sheets onEdit event object
的单元格范围
- 检查修改后的单元格是否在特定的sheet.
- 检查修改后的单元格是否在第 I 列(索引 9)中以及是否使用 Range.isChecked()
选中复选框
- 使用 Sheet.getRange(row, column, numRows, numColumns) and Range.getValues() 获取从 A 列到 G 列的当前行值。这将 return 一个二维数组,我用
array.flat()
将其更改为一维数组。
- 使用其特定索引获取行值中的特定信息。例如,订单号应该在数组 values
的索引 1 中
- 创建 HtmlTemplate using HtmlService.createTemplateFromFile(filename). Update the necessary html content variable. Then create an HtmlOutput using HtmlTemplate.evaluate()
- 使用 HtmlOutput.getContent()
获取 html 输出的内容
- 使用 MailApp.sendEmail(message)
发送电子邮件
- 最后,在 J 列(索引 10)中添加日期时间戳。我使用 Utilities.formatDate(date, timeZone, format)
创建了一个日期字符串
注:
- 您可以根据自己的喜好更改日期格式,目前我使用
"MM-dd-yyyy"
。有关如何配置日期时间格式的更多详细信息,请参阅 here
- 如果您计划使用脚本编辑器中的
Run
按钮 运行 onEdit(),请注意执行会失败,因为事件对象 e
未定义.如果您想调试 onEdit() 触发器,您可以在代码中添加日志,然后修改 sheet 中的单元格,然后在执行选项卡 中检查执行日志
输出:
抱歉,这可能有点基础,但我已经有一段时间没有使用 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()
)
它有什么作用?
- 获取当前点差sheet的活动sheet和使用Google Sheets onEdit event object 的单元格范围
- 检查修改后的单元格是否在特定的sheet.
- 检查修改后的单元格是否在第 I 列(索引 9)中以及是否使用 Range.isChecked() 选中复选框
- 使用 Sheet.getRange(row, column, numRows, numColumns) and Range.getValues() 获取从 A 列到 G 列的当前行值。这将 return 一个二维数组,我用
array.flat()
将其更改为一维数组。 - 使用其特定索引获取行值中的特定信息。例如,订单号应该在数组 values 的索引 1 中
- 创建 HtmlTemplate using HtmlService.createTemplateFromFile(filename). Update the necessary html content variable. Then create an HtmlOutput using HtmlTemplate.evaluate()
- 使用 HtmlOutput.getContent() 获取 html 输出的内容
- 使用 MailApp.sendEmail(message) 发送电子邮件
- 最后,在 J 列(索引 10)中添加日期时间戳。我使用 Utilities.formatDate(date, timeZone, format) 创建了一个日期字符串
注:
- 您可以根据自己的喜好更改日期格式,目前我使用
"MM-dd-yyyy"
。有关如何配置日期时间格式的更多详细信息,请参阅 here - 如果您计划使用脚本编辑器中的
Run
按钮 运行 onEdit(),请注意执行会失败,因为事件对象e
未定义.如果您想调试 onEdit() 触发器,您可以在代码中添加日志,然后修改 sheet 中的单元格,然后在执行选项卡 中检查执行日志