【问题标题】:Google Apps Script Email Notification Not Functioning CorrectlyGoogle Apps 脚本电子邮件通知无法正常运行
【发布时间】:2015-05-04 16:44:21
【问题描述】:

我真的可以使用一些帮助,我非常感谢任何人可以提供的任何指点。我知道还有其他一些类似的问题,但据我所知,没有其他人有这个特定问题/要求。

我有一个由三个不同的人协作处理的 Google 表格。我有这个通知脚本,它将通过电子邮件通知特定用户关于 F 列中任何单元格的 任何 更改。重要的是,此电子邮件通知还包含该行中已更改其 F 单元格值的 A 单元格的值。

但是,我真正想要实现的是一个通知脚本,当 F 列中的任何单元格在主表的 Sheet2 中具有“是”的新值时,它将向指定的人发送电子邮件仅表。

我目前的代码是(当 F 列发生任何变化时发送通知):

function sendNotification(e) {
  var received = e.value; //Gets the value of the edited cell
};
    function sendNotification() {
          var ss = SpreadsheetApp.getActiveSpreadsheet();
          var sheet = ss.getSheetByName("Sheet 2");
          var cell = ss.getActiveCell().getA1Notation();
          var row = sheet.getActiveRange().getRow();
          var cellvalue = ss.getActiveCell().getValue().toString();
          var received = ss.getRange('F2:F').getValue();
          var recipients = "example@gmail.com";
          var message = '';
          if(received==="Yes"){ 
            message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue()
            var subject = 'A cell value '+ sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + ' has been received';
            var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + ' to view the changes on row: «' + row + '». New comment: «' + cellvalue + '». For message: «' + message + '»';
           MailApp.sendEmail(recipients, subject, body)};
        Logger.log('received value: ' + received);
        };

【问题讨论】:

  • 使用Logger.log('received value: ' + received); 语句检查received 变量的值。运行代码,然后在 VIEW 菜单中,选择 LOGS。
  • 我刚刚添加并检查了日志并看到了这个:[15-05-04 10:59:50:200 MDT] received value: No 然后我更改了工作表中的值,日志显示为:[15-05-04 10:57:49:470 MDT] received value: Yes

标签: google-apps-script google-apps


【解决方案1】:

如果有帮助,下面是在我的测试中有效的代码:(设置一个可安装的触发器以使其工作)

注意:我在这里和那里添加了几个Logger.log 来检查变量和一个Browser 消息以避免在测试时发送邮件。

function sendNotification() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet 2");
  var cell = ss.getActiveCell();
  var row = sheet.getActiveRange().getRow();
  var col = cell.getA1Notation().replace(/[0-9]/g,'').toLowerCase();
  Logger.log('col = '+col);
  var cellValue = cell.getValue().toString().toLowerCase();
  Logger.log(cellValue);
  var recipients = "example@gmail.com";
  var message = '';
  Logger.log(cellValue=="yes" && col=='f');
  if(cellValue=="yes" && col=='f' ){ 
    message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue()
    var subject = 'A cell value '+ sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + ' has been received';
    var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + ' to view the changes on row: «' + row + '». New comment: «' + cellValue + '». For message: «' + message + '»';
//    MailApp.sendEmail(recipients, subject, body)
    Browser.msgBox('mail sent');
  }
    Logger.log('message body: ' + body);
};

【讨论】:

  • 做到了!非常感谢你,塞尔吉!在我能正确编码之前,我显然还有很长的路要走。 =(
【解决方案2】:

要设置事件对象,请使用:

function sendNotification(e) {
  var received = e.value; //Gets the value of the edited cell
};

发送电子邮件的代码在if 正文的之外。因此,无论如何都会发送电子邮件。

改成这样:

if(received==="Yes"){ 
  message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue()

  var subject = 'A cell value '+ sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + ' has been received';
  var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + ' to view the changes on row: «' + row + '». New comment: «' + cellvalue + '». For message: «' + message + '»';
  MailApp.sendEmail(recipients, subject, body);
};

在这行代码中:

if(received="Yes"){ 

您正在使用赋值运算符来检查相等性。相等性检查使用双等号或三等号完成。

应该是:

if(received==="Yes"){ 

【讨论】:

  • 谢谢!我刚刚添加了三个等号,但不幸的是,只要 K 列的单元格中的值发生更改,它仍然会发送电子邮件,而不是仅在值等于“是”时发送电子邮件。
  • 谢谢。我将它更改为您的建议(我必须在您的代码中添加一个结束“}”)。但是,无论列中发生什么变化,它仍然只是发送消息。我好难过...
  • 我会使用event object 和您的触发器来获取已编辑单元格的值。我假设您正在使用触发器。例如。 onChange()
  • 我正在使用一个基本触发器,它在事件“来自电子表格”“编辑时”运行“脚本名称”。不幸的是,我不知道如何使用触发器设置事件对象。=(
  • 感谢您抽出宝贵时间提供帮助。所以,我更新了 OP 以反映代码。我将事件对象放在 sendnotification 函数上方,并删除了通过转到“当前项目的触发器”设置的简单触发器。不幸的是,当对工作表进行任何更改时,它仍然只是向我发送通知。我应该建立一个可以在这里分享的模板表吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多