当 google 电子表格中的列值更改时发送电子邮件

Send Email when a column value changes in a google spreadsheet

我正在研究这个 spreadsheet 并且想做以下事情

  1. 编辑 G 列后发送电子邮件
  2. 电子邮件应通知收件人单元格已从该值更改为其他值,例如 G 列单元格 G490 已从 'undefined' 修改为 'August 2021'
  3. 电子邮件还应仅突出显示受影响的行和 headers 列,即 E3:H3

下面是电子邮件 body 的示例

我正在使用以下代码,但是 运行 出错了。

我遇到的错误之一是

“引用错误:未定义行”

我正在修改来自 this tutorial

的代码
function processEdit(e) {
  var sheet = SpreadsheetApp.getActive();
  var rows = sheet.getRangeByName("EmailChanges").getValues();
  var headerRow = rows.shift();
  var editedRow = e.range.getRow();

  var template = HtmlService.createTemplateFromFile("Template");
  template.headerRow = headerRow;
  template.editedRow = editedRow;
  
  
  var html = template.evaluate().getContent();
  if(row>=3 && row<=1339 && col>6 && col==7 && editedSheet.getName()=="Change Requests"){
    //Send email
  var message = "The Column G Cell "+editedCell.getA1Notation()+" was modified from '"+e.oldvalue+"' to '"+e.value+"'";
  MailApp.sendEmail({
    to: "example@gmail.com",
    subject: "Change",message,
    name:'GSD BI',
    htmlBody: html
  });
}
}

Html代码是

Please see the highlighted row below for information about the Changes.

<hr>
<br>
<table cellpadding='5'>
  <tr>
    <th bgcolor='#eaeaea'><?= headerRow[0] ?></th>
    <th bgcolor='#eaeaea'><?= headerRow[1] ?></th>
    <th bgcolor='#eaeaea'><?= headerRow[2] ?></th>
  </tr>
  <? var rowIndex = 3; ?>
  <? for(var i = 0; i < rows.length; i++) { ?>
  <?   var background = rowIndex === editedRow ? "#e06666" : "#ffffff";  ?>
  <tr>
    <td bgcolor='<?= background ?>'><?= rows[i][0] ?></td>
    <td bgcolor='<?= background ?>'><?= rows[i][1] ?></td>
    <td bgcolor='<?= background ?>'><?= rows[i][2] ?></td>
  </tr>
  <?    rowIndex = rowIndex + 1; ?>
  <? } ?>
</table>

我相信你的目标如下。

  • 当手动编辑“G”列时,您希望通过可安装的 OnEdit 触发器运行您的脚本。
  • 当脚本为 运行 时,您想要检索编辑的行并创建 message 并将它们作为电子邮件发送。

修改点:

  • 在您的脚本中,rows 未定义。这就是您 "ReferenceError: rows is not defined" 问题的原因。而且,col 未声明。
  • 当我看到您的示例电子表格时,命名范围的名称是 EmailChange。但是,您使用的名称是 EmailChanges.
  • e.oldvalue 总是 returns undefined。 属性 名称是 oldValue
  • 在您的模板中,rows 未放入。
  • 根据您显示的预期目标,message 未包含在模板中。
  • message of MailApp.sendEmail(message) 没有 属性 of message.

当这些点反映在你的脚本中,就变成了下面这样。

修改后的脚本:

Google 应用脚本:Code.gs

function processEdit(e) {
  var { source, range, value, oldValue } = e;
  var sheet = range.getSheet();
  var editedRow = range.rowStart;
  if (editedRow >= 3 && editedRow <= 1339 && range.columnStart == 7 && sheet.getSheetName() == "Change Requests") {
    var message = "The Column G Cell " + range.getA1Notation() + " was modified from '" + oldValue + "' to '" + value + "'";
    var namedRange = source.getRangeByName("EmailChange");
    var rows = namedRange.getValues();
    var headerRow = rows[0];
    var template = HtmlService.createTemplateFromFile("Template");
    var idx = editedRow - namedRange.getRow();
    template.message = message;
    template.rows = [rows[idx]];
    template.headerRow = headerRow;
    template.editedRow = editedRow;
    var html = template.evaluate().getContent();
    MailApp.sendEmail({
      to: "example@gmail.com",
      subject: "Change",
      name: 'GSD BI',
      htmlBody: html
    });
  }
}

HTML: Template.html

<p><?!= message ?></p>
<p>Please see the highlighted row below for information about the Changes.</p>

<hr>
<br>
<table cellpadding='5'>
  <tr>
    <th bgcolor='#eaeaea'><?= headerRow[0] ?></th>
    <th bgcolor='#eaeaea'><?= headerRow[1] ?></th>
    <th bgcolor='#eaeaea'><?= headerRow[2] ?></th>
  </tr>
  <? var rowIndex = 3; ?>
  <? for(var i = 0; i < rows.length; i++) { ?>
  <?   var background = rowIndex === editedRow ? "#e06666" : "#ffffff";  ?>
  <tr>
    <td bgcolor='<?= background ?>'><?= rows[i][0] ?></td>
    <td bgcolor='<?= background ?>'><?= rows[i][1] ?></td>
    <td bgcolor='<?= background ?>'><?= rows[i][2] ?></td>
  </tr>
  <?    rowIndex = rowIndex + 1; ?>
  <? } ?>
</table>

注:

  • 在您的脚本中,使用了 oldValue。在这种情况下,请直接手动输入值来编辑单元格。当您复制并粘贴该值时,不会返回 oldValue。请注意这一点。

  • 此修改后的脚本适用于您的示例电子表格。如果您的实际电子表格不同,请再次检查命名范围的名称。

  • 在这个脚本中,从您的显示脚本来看,它假设您的脚本是由安装的 OnEdit 触发器运行。如果直接用脚本编辑器运行脚本,会因为没有事件对象而出错。请注意这一点。

参考: