首页 > 解决方案 > Google表格应用脚本:如何在下拉值更改时发送电子邮件?

问题描述

我们有两张纸:

  1. Sheet1 - 它有一列和 10,000 行的下拉值 - “已批准”和“未批准”。
  2. 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);
}

}

标签: google-apps-scriptgoogle-sheets

解决方案


解释:

  • 确保充分利用事件对象 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负责创建触发器,因此您只需执行一次即可。


推荐阅读