email - 对 Google 表格中的特定数据进行更改时的电子邮件通知
问题描述
我有一个通用脚本,它将发送电子邮件通知对 Google 表格中的实时花名册所做的更改,并设置了一个触发器以使事件发生“更改时”。工作表中的所有数据都通过 IMPORTRANGE 检索。该脚本按预期执行,但是我希望进行一些不确定如何进行的更改。这是一个样本表:链接到表
希望仅在更改涉及名称“Craig”时发送电子邮件通知。例如,我的名字在排班日被添加或删除。该脚本当前会针对整个工作表所做的所有更改发送电子邮件。
标识发生此更改的行,以便在电子邮件正文中引用日期和地点。
感谢您的任何帮助和建议。
完整脚本:
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);
}
}
}
解决方案
我相信你的目标如下。
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 语句下面的脚本。如果您还想检查列和行,请告诉我。
参考:
推荐阅读
- c# - 如何正确地进行发布请求
- jquery - 在 td 上使用 data-id 参数过滤表
- typescript - 如何编写一个函数,通过类型检查将字段添加到对象数组?
- java - 使用哪种基于 Java 节点的数据结构?
- java - JPanel 的平滑运动和同时更新 JLabel
- python - 尝试在 Python 中对 .csv 文件进行排序(创建列表并删除重复项)
- elasticsearch - 在聚合中忽略查询中的“匹配”子句
- java - 如何最好地在 hadoop 上模拟用户帐户
- ios - Fastlane - 上传到 TestFlight 会返回错误,但仍显示构建可用于测试
- vue.js - 如何使用 vue.js 循环进行分组和操作