当特定单元格的值发生变化时,如何让Google Sheet脚本发送电子邮件?

时间:2016-03-11 23:17:28

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

我正在尝试为我的Google表格设置一个脚本,该脚本会在特定单元格的值发生变化时发送电子邮件。我也想知道是否有办法设置脚本,以便每天只发送一次;例如,如果一天进行多次更改,我宁愿它在一天结束时只发送一封电子邮件,而不是每次都发送一封电子邮件。

为了提供一些背景知识,电子表格是在网络上发布的客户的声明。我希望在对声明中的剩余余额进行更新时通知客户。如果我可以将单元格的新值插入电子邮件消息,这样他们就可以在电子邮件中看到新的余额,这也很酷。

我目前正在使用以下脚本,但没有运气:

function myFunction(e) {

  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Statement");
  var valueToCheck = sheet.getRange("J13").getValue();
  var rangeEdit = e.range.getA1Notation();

  if(rangeEdit !== "J13")

    {

      MailApp.sendEmail("*****@gmail.com", "subject", "message");

    }

}

当前脚本设置为onChange事件触发器。

2 个答案:

答案 0 :(得分:1)

您需要在编辑时设置(可安装)触发器,而不是“在更改时”。由“on change”触发的事件对象触发does not contain range;它基本上只是告诉你发生了什么样的变化。

使用on edit trigger,您可以使用e.range(正如您所做的那样)以及e.value(输入新值),从而省去了调用getValue()的麻烦。

答案 1 :(得分:1)

您需要在文档(电子表格' s)和#34;属性"中存储值。文档属性只是Google文档的存储功能。

因此,代码必须存储电子表格单元格中的原始值,并存储上次发送电子邮件的日期。

function myFunction(e) {

  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Statement");
  var valueToCheck = sheet.getRange("J13").getValue();
  var rangeEdit = e.range.getA1Notation();

  if (didTheValueInCellChange(valueToCheck) === false) {return}; //The value didn't change, quit

  if (rangeEdit === "J13") {
    if (hasAnEmailBeenSentToday() === false) {
      MailApp.sendEmail("*****@gmail.com", "subject", "message");
      emailJustSent();
      setOriginalValue(valueToCheck);
    };
  };
};

function emailJustSent() {
  var docProps = PropertiesService.getDocumentProperties();
  var todaysDate = new Date();//Use date constructor, then convert date object to a string
  var scriptTimeZone = Session.getScriptTimeZone();

  var formatedDate = Utilities.formatDate(todaysDate, scriptTimeZone, "MM/dd/YYYY");

  docProps.setProperty(key, value)('dateSent');
};

function hasAnEmailBeenSentToday() {
  var docProps = PropertiesService.getDocumentProperties();
  var todaysDate = new Date();//Use date constructor, then convert date object to a string
  var scriptTimeZone = Session.getScriptTimeZone();

  var formatedDate = Utilities.formatDate(todaysDate, scriptTimeZone, "MM/dd/YYYY");

  var dateWhenEmailWasSent = docProps.getProperty('dateSent');

  if (dateWhenEmailWasSent === formatedDate) {
    return true;
  } else {
    return false;
  };
};


function didTheValueInCellChange(currentValue) {

  var docProps = PropertiesService.getDocumentProperties();  
  var theLastValueSaved = docProps.getProperty('originalValue');

  if (theLastValueSaved !== currentValue) {
    return true;
  } else {
    return false;
  };
};

function setOriginalValue(theValue) {
  docProps.setProperty('originalValue', theValue);
};