首页 > 解决方案 > 对 Google 表格中的特定数据进行更改时的电子邮件通知

问题描述

我有一个通用脚本,它将发送电子邮件通知对 Google 表格中的实时花名册所做的更改,并设置了一个触发器以使事件发生“更改时”。工作表中的所有数据都通过 IMPORTRANGE 检索。该脚本按预期执行,但是我希望进行一些不确定如何进行的更改。这是一个样本表:链接到表

  1. 希望仅在更改涉及名称“Craig”时发送电子邮件通知。例如,我的名字在排班日被添加或删除。该脚本当前会针对整个工作表所做的所有更改发送电子邮件。

  2. 标识发生此更改的行,以便在电子邮件正文中引用日期和地点。

感谢您的任何帮助和建议。

完整脚本:

function onEdit() {

    var getProps = PropertiesService.getUserProperties();

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

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

    var data = sheet.getRange('E4:ACB562').getValues().toString().length;

    if (data != lenProp) {
        getProps.setProperty('Len', data );
        MailApp.sendEmail('email@gmail.com', 'Changes have been made to your live roster', 'Previous value: ' + lenProp + ' New value: ' + data);
    }
}

新修订的脚本:

function installedOnEdit(e) {
  var range = e.range;
  var value = range.getValue();
  if (value == "Craig" || (e.oldValue == "Craig" && value == "")) {
    var rowNumber = range.getRow(); // You can retrieve the row number of the editor cell.
    console.log(rowNumber)
    var [colA, colB] = e.source.getActiveSheet().getRange(rowNumber, 1, 1, 2).getValues()[0];

    var getProps = PropertiesService.getUserProperties();
    var lenProp = getProps.getProperty('Len');
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Roster_LIVE');
    var data = sheet.getRange('E4:ACB562').getValues().toString().length;
    if (data != lenProp) {
      getProps.setProperty('Len', data);
      MailApp.sendEmail('email@gmail.com', 'Changes have been made to your roster!', 'Your live roster has been edited. These changes concern ' + colB + ' on ' + colA);
    }
  }
}

标签: emailgoogle-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • Craig当值被放入单元格时,您希望使用 OnEdit 触发器发送电子邮件。
  • 您要检索已编辑的行号。
  • 您希望在Craig删除 的值时运行脚本。

修改点:

  • I have a general script that will send email notification of changes made to a live roster in Google sheets and have set up a trigger for the event to occur 'On change'.,我了解到您正在使用可安装的 OnChange 触发器。如果是这样,在您的情况下,我建议您使用可安装的 OnEdit 触发器。
  • 而且,当我看到您的脚本时,函数名称是onEdit. 如果可安装的 OnEdit 触发器安装到onEdit,则在编辑单元格时,onEdit由简单触发器和可安装触发器以异步过程运行 2 次。参考因此,请将函数名称从重命名onEdit为 other 并将可安装的 OnEdit 触发器重新安装为重命名的函数名称。
  • 为了检索已编辑单元格的行号,您可以使用事件对象。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

脚本修改后,请将 OnEdit 触发器安装到installedOnEdit. 在此脚本中,当您将值放入Craig单元格时,将运行 if 语句下方的脚本。

从:
function onEdit() {

    var getProps = PropertiesService.getUserProperties();

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

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

    var data = sheet.getRange('E4:ACB562').getValues().toString().length;

    if (data != lenProp) {
        getProps.setProperty('Len', data );
        MailApp.sendEmail('email@gmail.com', 'Changes have been made to your live roster', 'Previous value: ' + lenProp + ' New value: ' + data);
    }
}
至:
function installedOnEdit(e) {
  var range = e.range;
  var value = range.getValue();
  if (value == "Craig" || (e.oldValue == "Craig" && value == "")) {
    var rowNumber = range.getRow(); // You can retrieve the row number of the editor cell.
    console.log(rowNumber)

    var getProps = PropertiesService.getUserProperties();
    var lenProp = getProps.getProperty('Len');
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Roster');
    var data = sheet.getRange('E4:ACB562').getValues().toString().length;
    if (data != lenProp) {
      getProps.setProperty('Len', data);
      MailApp.sendEmail('email@gmail.com', 'Changes have been made to your live roster', 'Previous value: ' + lenProp + ' New value: ' + data);
    }
  }
}
  • 在这个修改后的脚本中,当将 的值Craig放入单元格时,运行 if 语句下面的脚本。如果您还想检查列和行,请告诉我。

参考:


推荐阅读