我修改了此博客提供的脚本
How to have your spreadsheet automatically send out an email when a cell value changes
经过一些调试修改后,我可以通过手动输入位置C7的值来发送电子邮件。也就是说,根据脚本,如果值大于100,它将向我发送一封电子邮件。只有当我手动将数字输入单元格时才会发生这种情况。
问题是,如果值是由公式生成的,那么它就不起作用。 (假设单元格C7是公式= C4 * C5,其中乘积值> 100)
经过一些反复试验后,我认为编辑检测部分的代码会导致问题。
var rangeEdit = e.range.getA1Notation();
if(rangeEdit == "C7")
由于单元格C7是公式,公式本身不会改变,正在改变的是公式计算的值。所以我可能认为我没有编辑过细胞。
如何修改脚本,以便脚本在公式生成的C7值大于100
时发送电子邮件?供参考,以下是我正在使用的代码。
function checkValue(e)
{
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("sheet1");
var valueToCheck = sheet.getRange("C7").getValue();
var rangeEdit = e.range.getA1Notation();
if(rangeEdit == "C7")
{
if(valueToCheck >100)
{
MailApp.sendEmail("h********@gmail.com", "Campaign Balance", "Balance is currently at: " + valueToCheck+ ".");
}
}
}
答案 0 :(得分:3)
onEdit(e)触发器(简单和可安装)都不会触发,除非人明确编辑该文件。在您的情况下,您似乎从外部来源(特别是Google财务数据)获得了价值。
答案 1 :(得分:0)
为避免因其他地方的修改而导致重复通知,请仅在您跟踪的值与上一个值不同时发送电子邮件。将先前的值存储在脚本属性中。
df.registerTempTable('table')
q = "SELECT A, B FROM (SELECT *, MAX(B) OVER (PARTITION BY A) AS maxB FROM table) M WHERE B = maxB"
sqlCtx.sql(q).show()
#+---+---+
#| A| B|
#+---+---+
#| b| 3|
#| a| 8|
#+---+---+
此处仅在valueToCheck与存储值不同时才发送电子邮件。如果发生这种情况,则存储的值将由function checkValue(e) {
var sp = PropertiesService.getScriptProperties();
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("sheet1");
var valueToCheck = sheet.getRange("C7").getValue();
var oldValue = sp.getProperty("C7") || 0;
if (valueToCheck > 100 && valueToCheck != oldValue) {
MailApp.sendEmail("***v@gmail.com", "Campaign Balance", "Balance is currently at: " + valueToCheck+ ".");
sp.setProperty("C7", valueToCheck);
}
}
更新。