【问题标题】:Google Sheets app script : How to send email on change in dropdown values?Google表格应用脚本:如何在下拉值更改时发送电子邮件?
【发布时间】:2021-05-13 00:52:52
【问题描述】:

我们有两张纸:

  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-script google-sheets


    【解决方案1】:

    解释:

    • 确保充分利用 event object e

    • 由于您的函数使用MailApp,这是一个需要授权的服务,您只能使用可安装 onEdit 触发器作为onEdit 函数执行。

    • 您可以手动或以编程方式创建可安装触发器。在下面的解决方案中,我将向您展示以编程方式执行它的方法。

    解决办法:

    执行only一次函数create_onEdit,然后当用户在Sheet1中的单元格A2上编辑时,脚本将发送电子邮件。

    // 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负责创建触发器,因此您只需执行一次即可。

    【讨论】:

    • 这是有效的。只有 1 个挑战 - 它仅适用于 A2,我希望它适用于所有 As,即 A2 到 A10000。我该怎么办?
    • @SahilSharma 很抱歉造成误解。我更新了我的答案。确认它是否对您有用:)
    • 工作,完美。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多