google-apps-script - Google表格应用脚本:如何在下拉值更改时发送电子邮件?
问题描述
我们有两张纸:
- Sheet1 - 它有一列和 10,000 行的下拉值 - “已批准”和“未批准”。
- Sheet2 - 它具有与电子邮件相关的详细信息,即电子邮件、主题、已批准的消息、未批准的消息。
如果下拉值更改,我想发送一封自动电子邮件。如果有人将 Sheet1 下拉选择更改为“已批准”,我想发送消息批准,如果将其更改为“未批准”,我想发送消息未批准。
当我在脚本编辑器中运行它时,我已经能够成功发送电子邮件,但它没有在下拉更改时触发。我知道我需要使用 onedit 触发器,但不知道该怎么做。任何帮助表示赞赏。这是代码。
function sendEmail(){
var ss1 = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss1.getSheetByName('Sheet1');
var valueToCheck = sheet1.getRange("A2").getValue();
if(valueToCheck == "approved"){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet2=ss.getSheetByName('Sheet2');
var emailAddress = sheet2.getRange(2,1).getValue();
var subject = sheet2.getRange(2,2).getValue();
var message = sheet2.getRange(2,3).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
else{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet2=ss.getSheetByName('Sheet2');
var emailAddress = sheet2.getRange(2,1).getValue();
var subject = sheet2.getRange(2,2).getValue();
var message = sheet2.getRange(2,4).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
}
解决方案
解释:
确保充分利用事件对象
e
。因为您的函数使用
MailApp
的是需要授权的服务,所以您只能使用可安装onEdit
的触发器作为onEdit
函数执行。您可以手动或以编程方式创建可安装触发器。在下面的解决方案中,我向您展示了以编程方式执行它的方法。
解决方案:
只执行一次函数,然后create_onEdit
在用户对单元格A2
进行编辑时Sheet1
,脚本将发送电子邮件。
// execute create_onEdit only and once
function create_onEdit(){
ScriptApp.newTrigger('sendEmail')
.forSpreadsheet(SpreadsheetApp.getActive())
.onEdit()
.create();
}
// this function should never be executed manually!
function sendEmail(e){
const ss = e.source;
const arng = e.range;
const ash = arng.getSheet();
const row = arng.getRow();
const col = arng.getColumn();
// trigger upon edits in Sheet1 and A2 till A10000
if(ash.getName()=="Sheet1" && row>=2 && row<=10000 && col == 1){
if(arng.getValue() == "approved"){
const sheet2=ss.getSheetByName('Sheet2');
const emailAddress = sheet2.getRange(2,1).getValue();
const subject = sheet2.getRange(2,2).getValue();
const message = sheet2.getRange(2,3).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
else{
const sheet2=ss.getSheetByName('Sheet2');
const emailAddress = sheet2.getRange(2,1).getValue();
const subject = sheet2.getRange(2,2).getValue();
const message = sheet2.getRange(2,4).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
}
}
当心:
您永远不应该
sendEmail(e)
手动执行,因为它会丢弃未定义的错误。此功能是一个触发功能,它意味着在用户编辑时自动执行(触发)。该函数
create_onEdit
负责创建触发器,因此您只需执行一次即可。
推荐阅读
- php - 生成相同订单号的问题
- typescript - 异步函数或方法的返回类型必须是全局 Promise
类型 - c# - 在泛型函数中将类作为参数传递
- google-apps-script - Google App 脚本:无法保留前导零,因为它已被自动删除
- ruby-on-rails - Rails 5 - 理解新动作和渲染错误
- java - 如何解决android baab超时错误?
- linux - 在 grep 之后在同一行中打印 awk 输出
- image - 如何在 Keras 中处理 RGB 图像
- ruby-on-rails - pg_search_scope 按一张表中的两个不同列
- android - LinkedIn 登录 - 接收 null AccessToken