Google apps script e、 range.getA1Notation()无法跟踪公式更新引起的更改

Google apps script e、 range.getA1Notation()无法跟踪公式更新引起的更改,google-apps-script,google-sheets,triggers,Google Apps Script,Google Sheets,Triggers,我修改了这个博客提供的脚本 在调试了一些修改后,我可以通过在C7位置手动输入一个值来发送电子邮件。也就是说,根据脚本,如果值大于100,它将向我发送电子邮件。只有在我将数字手动输入单元格时才会发生这种情况 问题是,如果值是由公式生成的,那么它就不起作用。假设单元格C7为公式=C4*C5,其中乘积值大于100 经过一些尝试和错误,我认为是编辑检测部分的代码导致了问题 var rangeEdit = e.range.getA1Notation(); if(rangeEdit == "C7") 由

我修改了这个博客提供的脚本

在调试了一些修改后,我可以通过在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+ ".");
}
}
}

为了避免由于其他地方的编辑而重复通知,请仅在您跟踪的值与上一个值不同时发送电子邮件。将上一个值存储在脚本属性中

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);
  }
}

此处,仅当valueToCheck与存储值不同时,才会发送电子邮件。如果发生这种情况,存储的值将由setProperty更新

为避免由于其他地方的编辑而重复通知,请仅在您跟踪的值与上一个值不同时发送电子邮件。将上一个值存储在脚本属性中

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);
  }
}

此处,仅当valueToCheck与存储值不同时,才会发送电子邮件。如果发生这种情况,存储的值将由setProperty更新

onEdite触发器simple和Installable都不会触发,除非人工显式编辑该文件。在你的情况下,你的价值似乎来自外部来源,特别是谷歌金融数据

另外,对于谷歌金融数据

笔记: 话虽如此

如果更改是由formulalike=IF、=VLOOKUP而不是自动更改formulaslike=GOOGLEFINANCE、=IMPORTRANGE、=IMPORTXML等进行的,则通常人工需要编辑其他单元格-在这种情况下,您将能够捕获导致人工编辑的事件,并对公式单元格进行更改

在从sheets api进行更改的情况下,安装的onChange触发器可能能够捕获事件


onEdite触发器simple和Installable都不会触发,除非人工显式编辑该文件。在你的情况下,你的价值似乎来自外部来源,特别是谷歌金融数据

另外,对于谷歌金融数据

笔记: 话虽如此

如果更改是由formulalike=IF、=VLOOKUP而不是自动更改formulaslike=GOOGLEFINANCE、=IMPORTRANGE、=IMPORTXML等进行的,则通常人工需要编辑其他单元格-在这种情况下,您将能够捕获导致人工编辑的事件,并对公式单元格进行更改

在从sheets api进行更改的情况下,安装的onChange触发器可能能够捕获事件


根据你的例子,C7=C4*C5,谁/什么改变了C4和C5的值?如果它是由用户修改的,您可以检查C7的值是否随每次编辑而改变。基本上删除这个if块ifrangeEdit==C7C4和C5本身是一些if条件标志,由googlefinance更改,每分钟更新一次。例如,如果该股票上涨,则C4=11,否则为0,如果该股票未被列入黑名单,则C5=11,否则为0。此代码用于在电子表格每次更新时阻止电子邮件提交。如果没有这个代码,每次满足条件时,我都会收到大量电子邮件。但是,我只需要根据您的示例得到一次通知,C7=C4*C5,谁/什么改变了C4和C5的值?如果它是由用户修改的,您可以检查C7的值是否随每次编辑而改变。基本上删除这个if块ifrangeEdit==C7C4和C5本身是一些if条件标志,由googlefinance更改,每分钟更新一次。例如,如果该股票上涨,则C4=11,否则为0,如果该股票未被列入黑名单,则C5=11,否则为0。此代码用于在电子表格每次更新时阻止电子邮件提交。如果没有这个代码,每次满足条件时,我都会收到大量电子邮件。不过,我只需要在我相信这个脚本是我需要的时候得到通知,非常感谢!关于google sheet API不适用于google finance功能的问题,我将在几天后进行测试。当我删除on edit e的东西并将触发器更改为每分钟时间驱动时,它的效果非常好,非常感谢!我相信这个脚本是我需要的,非常感谢!关于google sheet API不适用于google finance功能的问题,我将在几天后进行测试。当我删除on edit e的东西并将触发器更改为每分钟时间驱动时,它就像一个魔咒一样工作, 非常感谢!