基于电子表格中的日期,对多个工作表定时发送邮件通知(指定邮箱)
我给公司项目经理准备了一个任务管理表格。每个人都有自己的标签页,用来添加他们的项目、到期日等信息。当某个任务距离到期日还有一定天数时,就会发送邮箱通知。最初在设置表格时,用只有一个标签页并设好时间触发器的方案就能成功发送通知。
但在我添加了新标签页后,时间触发器虽运行成功,但通知不再发送。每天早上,我都会在每个标签页下运行代码,通知就能正确发送。我相当确定问题出在这段代码:
var sheet = SpreadsheetApp.getActiveSpreadsheet(). getActiveSheet();
但每次我把它改动来修复问题,整段代码就会失效,通知也就发送不出去了。
除了时间触发器不起作用外,我的脚本没有其它错误或问题。
想把一切都自动化,这样就不用每天早晨手动运行代码了。
我对编程经验不多。如果你能解释问题出在哪里,以及为什么做出这些改动就能修复它。我也希望能把这份表格在其他场景中复用。
这是我目前手动运行时效果很好的代码开头部分。
function sendReminders() {
var sheet = SpreadsheetApp.getActiveSpreadsheet(). getActiveSheet();
var data = sheet.getDataRange() .getValues ();
var today = new Date();
today.setHours(0, 0, 0, 0);
for (var i = 1; i < data.length; i++) {
var task = data[i][1];
var dueDate = new Date(data[i][4]);
var email1 = data[i][10];
var email2 = data[i][11];
dueDate.setHours(0, 0, 0, 0);
var diffInDays = Math.floor((dueDate - today) / (1000 * 60 * 60 * 24));
if (diffInDays === 28) {
if (email1) {
MailApp.sendEmail(email1, "Upcoming Task Reminder: " + task,
"Hi! The internal due date of '" + task + "' is in one (1) month (" + dueDate.toDateString() + ").");
if (email2) {
MailApp.sendEmail(email2, "Upcoming Task Reminder: " + task,
"Hi! The internal due date of '" + task + "' is in one (1) month (" + dueDate.toDateString() + ").");
}
}
// ...
解决方案
当一个函数通过一个 time-driven trigger 运行时,没有用户界面会话可供函数引用,因此也没有真正意义上的“活动工作表”。在这种情境下,Spreadsheet.getActiveSheet() 方法总是返回第一个工作表,也就是标签栏中最左边的那个。
如果要处理多个工作表,可以把它们列在一个 数组 中,并用 forEach 来遍历该数组。如果存在同名的工作表,就按你现有的代码发送邮件,像这样:
function sendReminders() {
const ss = SpreadsheetApp.getActive();
['Shannon', 'Jane', 'Dweezil',].forEach(sheetName => {
const sheet = ss.getSheetByName(sheetName);
if (sheet) {
sendReminders_(sheet)
} else {
console.log(`Cannot find sheet '${sheetName}'`);
}
})
}
function sendReminders_(sheet) {
const data = sheet.getDataRange().getValues();
// ...
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。