我正在尝试为我的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事件触发器。
答案 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);
};