【问题标题】:Email Notification if the IMPORTED DATA in sheet changes. [Triggers not working]如果工作表中的导入数据发生更改,则发送电子邮件通知。 [触发器不起作用]
【发布时间】:2017-05-27 11:22:03
【问题描述】:

我不知道 GAS,我尝试搜索了很多代码,找到了一个非常接近的代码。

我希望在当前工作表中的数据发生更改时收到电子邮件通知。 现在,当我进行更改时,我会收到一封电子邮件。这很好但实际上我不会对工作表进行更改,因为数据是从另一个工作表/网站导入的

基本上我希望

  1. 在导入的数据发生变化时收到通知。没有人会编辑这个。
  2. 在电子邮件中附加永久 Excel 工作表
  3. 在电子邮件末尾,受影响的总行数 = +-4

虚拟表:https://docs.google.com/spreadsheets/d/1BTdA7Rx16W6la_gri4uP079yIzzgKfZKO610yfQ6724/edit?usp=sharing [触发器不适用于导入的数据]

当前脚本:

function sendNotification() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var cell = ss.getActiveCell().getA1Notation();
  var row = sheet.getActiveRange().getRow();
  var cellvalue = ss.getActiveCell().getValue().toString();
  var to = "ashwendra10625@gmail.com";
  var message = '\n\nSignature';
  if(cell.indexOf('G')!=-1){ 
    message = sheet.getRange('D'+ sheet.getActiveCell().getRowIndex()).getValue()
  }
  var subject = 'Data Updated';
  var body = 'Hi there,\n\nThe data on website was updated recently.\n\nKindly refresh the previous excel sheet or click ' + 'https://docs.google.com/spreadsheets/d/1BTdA7Rx16W6la_gri4uP079yIzzgKfZKO610yfQ6724/edit#gid=0' + ' to see changes.\n\n\nThe changes are:\nTotal Rows affected: ' + row + '\n' + message;
  MailApp.sendEmail(to, subject, body);
};

【问题讨论】:

  • 我认为 onEdit() 仅在用户进行更改时发生。我会考虑使用侧边栏和 javascript setTimeout() 函数每隔几秒轮询一次该值,并跟踪 PropertiesService 中的过去值,或者一个单独的文件,甚至可能是一个带有 JDBC 的数据库。
  • @cooper 我们可以在工作表中使用 =counta() 并在数字更改时发送通知。但我不确定我将如何制作这个程序。我实际上不知道 Gas
  • 好吧,您仍然必须使用触发器来启动发送,并且大多数简单的触发器都需要一些用户操作才能发生。检查文档。阅读Getting Started Section。如果您从表单提交中获得更改,那么您可以使用 onFormSubmit 事件。
  • @Cooper 是正确的,onChange()/onEdit() 是由用户进行编辑/更改(经过测试)触发的。这个简单或可安装的触发器不会检测到脚本所做的任何编辑/更改。而且 AFAIK,没有可用的方法来计算受影响/更新的单元格。对于受影响的细胞,您可能想要遵循 Cooper 的想法。您还可以查看Time-driven triggers 以获取解决方法。希望这会有所帮助。
  • Cooper's 不错,但无法正常工作。此外,如果数据的行数减少,它不会通知

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


【解决方案1】:

遵循库珀的想法:

使用属性服务将数据长度的值存储在 col A 中(例如)。创建一个基于时间的触发器,每 X 分钟检查一次工作表。如果数据发生变化,则使用新值更新属性并发送电子邮件。

根据您的数据,您可以选择要测试的任何范围,或者如果您有时间戳,您可以更改代码以测试时间的变化。

function onEdit() {

    var getProps = PropertiesService.getUserProperties();

    var lenProp = getProps.getProperty('Len');

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('-------');

    var data = sheet.getRange('A1:A').getValues().toString().length;

    if (data != lenProp) {
        getProps.setProperty('Len', data);
        MailApp.sendEmail('-------------', 'Sheet Has Changed', 'Previous value: ' + lenProp + ' New value: ' + data);
    }
}

【讨论】:

  • 嘿@James,这段代码只工作了一次,不能再次工作,我不知道发生了什么
  • 您正在测试的列中的数据类型是什么?如果是时间和/或日期,则 about 代码将不起作用。可以分享一个示例电子表格吗?
  • 我在上面附上了一个虚拟表,有导入数据的行和列。数据是字母数字,根本没有时间戳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多