当 google 电子表格中的列值更改时发送电子邮件
Send Email when a column value changes in a google spreadsheet
我正在研究这个 spreadsheet 并且想做以下事情
- 编辑 G 列后发送电子邮件
- 电子邮件应通知收件人单元格已从该值更改为其他值,例如 G 列单元格 G490 已从 'undefined' 修改为 'August 2021'
- 电子邮件还应仅突出显示受影响的行和 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 触发器运行。如果直接用脚本编辑器运行脚本,会因为没有事件对象而出错。请注意这一点。
参考:
我正在研究这个 spreadsheet 并且想做以下事情
- 编辑 G 列后发送电子邮件
- 电子邮件应通知收件人单元格已从该值更改为其他值,例如 G 列单元格 G490 已从 'undefined' 修改为 'August 2021'
- 电子邮件还应仅突出显示受影响的行和 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
总是 returnsundefined
。 属性 名称是oldValue
。- 在您的模板中,
rows
未放入。 - 根据您显示的预期目标,
message
未包含在模板中。 message
ofMailApp.sendEmail(message)
没有 属性 ofmessage
.
当这些点反映在你的脚本中,就变成了下面这样。
修改后的脚本:
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 触发器运行。如果直接用脚本编辑器运行脚本,会因为没有事件对象而出错。请注意这一点。