【问题标题】:How to get email alerts when a cell value changes (based on Formula) on Google sheets?当 Google 表格上的单元格值更改(基于公式)时,如何获取电子邮件警报?
【发布时间】:2021-05-16 07:36:30
【问题描述】:

当电子表格第 5 列中的单元格值更改为基于公式 =IF(AND(B2>D2),"Buy","Skip") 的“购买”时,我想要一个通知/电子邮件。下面提供的附件链接。表格会根据 Googlefinance 数据自动刷新。

我已经尝试了以下脚本,但它仅在我手动更改单元格时才会触发通知/电子邮件。我不是代码编写者,但设法找到了下面的脚本并添加了我自己的一些调整。 有人可以帮我解决这个问题或提供替代解决方案吗? 也欢迎在第三方应用程序上编写的脚本。

function triggerOnEdit(e)

{
  showMessageOnUpdate(e);
}

function showMessageOnUpdate(e)
{
  var range = e.range;
  
  SpreadsheetApp.getUi().alert("range updated " +   range.getA1Notation());  
}

function checkStatusIsBuy(e)
{
  var range = e.range;
  
  if(range.getColumn() <= 5 && 
     range.getLastColumn() >=5 )
  {
    var edited_row = range.getRow();
    
    var strongBuy = SpreadsheetApp.getActiveSheet().getRange(edited_row,5).getValue();
    if(strongBuy == 'Buy')
    {
      return edited_row;
    }
  }
  return 0;
}
function triggerOnEdit(e)
{
  showMessageOnBuy(e);
}
function showMessageOnBuy(e)
{
  var edited_row = checkStatusIsBuy(e);
  if(edited_row > 0)
  {
    SpreadsheetApp.getUi().alert("Row # "+edited_row+"Buy!");
  }
}

function sendEmailOnBuy(e)
{
  var buy_row = checkStatusIsBuy(e);
  
  if(buy_row <= 0)
  {
    return;
  }
  
  sendEmailByRow(buy_row);
}

function sendEmailByRow(row)
{
  var values = SpreadsheetApp.getActiveSheet().getRange(row,1,row,5).getValues();
  var row_values = values[0];
  
  var mail = composeBuyEmail(row_values);
  
  SpreadsheetApp.getUi().alert(" subject is "+mail.subject+"\n message "+mail.message);
}

function composeBuyEmail(row_values)
{
  var stock_name = row_values[0];
  
  var cmp = row_values[1];
  
  var volume = row_values[2];

  var message = "The Status has changed: "+stock_name+" "+cmp+
    " Volume "+volume;
  var subject = "Strong Buy "+stock_name+" "+cmp
  
  return({message:message,subject:subject});
}

function triggerOnEdit(e)
{
  sendEmailOnBuy(e);
}

var admin_email='sendemail@gmail.com';

function sendEmailByRow(row)
{
  var values = SpreadsheetApp.getActiveSheet().getRange(row,1,row,5).getValues();
  var row_values = values[0];
  
  var mail = composeBuyEmail(row_values);
  
  SpreadsheetApp.getUi().alert(" subject is "+mail.subject+"\n message "+mail.message);

[https://docs.google.com/spreadsheets/d/12k5DF8rvuKex77B8uRWpx1FoMmSNaMdGvhNEEbXKCFc/edit?usp=sharing][1]

【问题讨论】:

  • 我刚刚要求您访问您的 spearsheet。
  • 已授予访问权限! ??????????
  • stackoverflow.com/questions/48173483/… 的问题相同。事实上,我不知道我们如何自动检测函数的结果。 OnEdit 需要手动输入。
  • 没问题的兄弟,谢谢你的尝试!希望有人对此有解决方案。
  • 尚不清楚单元格 B2D2 中的值如何更新。如果它们是手动更新的,请使用 on edit installable trigger。如果这些单元格中的值是通过googlefinance() 获取的,您可以使用on change 触发器来运行您的代码。如果没有使用on change 触发器发送事件,则必须使用time-driven trigger

标签: javascript email google-apps-script google-sheets


【解决方案1】:

应用程序脚本触发器不能由documentation 中指定的非手动输入触发:

脚本执行和 API 请求不会导致触发器运行。例如,调用 Range.setValue() 编辑单元格不会导致电子表格的 onEdit 触发器运行。

您可以改为设置一个基于时间的触发器,该触发器会定期扫描您的第 5 列,并在单元格包含“购买”时向您发送电子邮件:

function sendEmailOnUpdate() {
      var range = SpreadsheetApp.getActive().getRange('E2:E').getValues();
      
      for (i = 0; i < range.length; i++) {
        var cell = range[i];
    
        if (cell == 'Buy') {
          // Send email using Gmail
        }
      }
    }

要设置触发器,请前往触发器并选择基于时间的:

如果您不想为收到警报的单元格接收更多电子邮件,请确保在发送电子邮件后让应用脚本更改其值。

【讨论】:

  • 非常感谢!我会试试这个方法。只有一个问题,一旦发送了电子邮件,如何让应用脚本更改其值?
  • 你可以在你的 if 中使用 .setValue() 方法:SpreadsheetApp.getActive().getActiveSheet().getRange(i + 2, 5).setValue('Sent')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多