google-apps-script - 尝试创建一个脚本,如果工作表中的特定单元格/范围为空白,则发送电子邮件
问题描述
如果某些单元格留空,我希望每天在一天结束时发送一封电子邮件(我可以为此使用触发器)。
换句话说,某些单元格需要在每天结束时填写,如果没有填写,我想发送一封电子邮件(如果可能,发送到多个地址)以提醒经理。
例如,我有兴趣检查 ANY VALUE 的单元格是:B18:B19、C24(我要检查更多范围和单个单元格)
有了我所拥有的,我收到了一个错误代码
“在对象中找不到函数 isBlank”
我对 Scripts 非常陌生,这是我在其他论坛上找到的一小段代码
function myFunction() {
var ui = SpreadsheetApp.getUi();
var sheet = SpreadsheetApp.getActive().getSheetByName("Routes & Hours"); //this is the sheet that the data to be checked is in
var sunCells = [
[sheet.getRange("B18:B19").getValue(),
sheet.getRange("C24").getValue()
]
];
if(sunCells.isBlank()){
MailApp.sendEmail("XXXXX@gmail.com", "incomplete required cells", "message");
}
}
另外,有没有办法确定哪些单元格是空白单元格并在电子邮件警报中发送?
任何帮助是极大的赞赏
解决方案
- 您想分别检查“B18”、“B19”和“C24”是否为空。
- 如果包含空单元格,您想发送一封电子邮件,其中包含空单元格的 a1Notation。
如果我的理解是正确的,那么这个修改呢?我认为您的情况有几个答案,因此请将此视为其中之一。
修改点:
- 在您的脚本中,
sunCells
是一个包含单元格值的数组。并且sheet.getRange("B18:B19").getValue()
只检索“B18”的值。 isBlank()
可用于范围。
反映以上几点的脚本如下。
修改脚本1:
如果将“B18:B19”用作“B18”和“B19”,则可以使用以下脚本。在此修改中,a1Notation 仅由一个单元格分隔,如“B18:B19”到“B18”和“B19”。这样,可以检查每个单元格。在此脚本中,当“B18:B19”用于 时isBlank()
,如果“B18”和“B19”都为空,则为真。
var sunCells = [
[sheet.getRange("B18:B19").getValue(),
sheet.getRange("C24").getValue()
]
];
if(sunCells.isBlank()){
MailApp.sendEmail("XXXXX@gmail.com", "incomplete required cells", "message");
}
到:
var sunCells = ["B18", "B19", "C24"]; // Modified
var ranges = sheet.getRangeList(sunCells).getRanges(); // Added
var res = sunCells.filter(function (_, i) {return ranges[i].isBlank()}); // Added
if (res.length > 0) { // Modified
MailApp.sendEmail("XXXXX@gmail.com", "incomplete required cells " + res, "message"); // Modified
}
修改脚本2:
如果要按原样使用“B18:B19”的a1Notation,可以使用以下脚本。在此脚本中,“B18:B19”被解析为“B18”和“B19”。这样,可以检查每个单元格。当你使用它时,请运行myFunction()
.
// This method is from https://stackoverflow.com/a/21231012/7108653
function columnToLetter(column) {
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}
function myFunction() {
var ui = SpreadsheetApp.getUi();
var sheet = SpreadsheetApp.getActive().getSheetByName("Routes & Hours");
var sunCells = ["B18:B19", "C24"];
// The following script was modified.
var cells = sunCells.map(function(e) {
var temp = [];
var range = sheet.getRange(e);
var r = {
startRowIndex: range.getRow(),
endRowIndex: range.getRow() + range.getNumRows(),
startColumnIndex: range.getColumn(),
endColumnIndex: range.getColumn() + range.getNumColumns(),
}
for (var i = r.startRowIndex; i < r.endRowIndex; i++) {
for (var j = r.startColumnIndex; j < r.endColumnIndex; j++) {
temp.push(columnToLetter(j) + i);
}
}
return temp;
})
cells = Array.prototype.concat.apply([], cells);
var ranges = sheet.getRangeList(cells).getRanges();
var res = cells.filter(function (_, i) {return ranges[i].isBlank()});
if (res.length > 0) {
MailApp.sendEmail("XXXXX@gmail.com", "incomplete required cells " + res, "message");
}
}
笔记:
- 这是一个简单的修改。所以请根据您的情况进行修改。
- 如果要添加和修改要检查的单元格,请将它们添加到
sunCells
.
参考:
如果我误解了你的问题,请告诉我。我想修改它。
推荐阅读
- c# - 如何在 IActionFilter 中获取类型化的响应对象。ASP 核心 2.2
- python - 当我尝试将 JSON 转换为 Pandas Dataframe 时出现错误“AttributeError: 'list' object has no attribute 'values'”
- asp.net - Webhook 调用失败。错误:DEADLINE_EXCEEDED | 请求超时
- twitter-bootstrap-3 - 如何在这个垂直轮播的第一个和最后一个项目上隐藏引导 3 个轮播箭头?
- python - 从 MySQL 数据库获取后如何将 python 字符串转换为其原始类型
- laravel - 无法登录到 Gitlab CI 中的 MSSQL docker 以开始测试迁移
- javascript - 从对象有键返回对象的条件为真
- php - 使用 php 获取图像时的结果排序
- saml-2.0 - 为多个身份提供者使用 1 个 SAML2.0 服务提供者
- c++ - 使用 C++ 查找树的最深叶子总和的程序