e.range.getA1Notation()无法跟踪公式更新导致的更改

时间:2018-02-16 14:29:59

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

我修改了此博客提供的脚本

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+ ".");
}
}
}

2 个答案:

答案 0 :(得分:3)

答案 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); } } 更新。