替代使用触发器为创建的每个日历事件自动发送电子邮件
Alternative to using triggers to automatically send email for each calendar event created
我正在尝试自动化工作流程的某些部分,以便使用 Google 日历安排客户。我已经使用检测更改的触发器成功地捕获了 new/edited/deleted Apps 脚本中的 new/edited/deleted 事件,并 Calendar.event.list
将这些更改与电子表格同步。
我在包含所有客户的电子表格中新建一行或编辑现有行。我想做的是在与客户约会前三天,自动生成一封包含他们所有详细信息的自定义电子邮件,作为约会提醒发送给他们。
我的计划是每次在电子表格中创建新行时(当创建新的日历事件时),都创建一个新的电子邮件触发器。该触发器将执行代码以创建包含所有客户信息的电子邮件。
function createEmailTrigger(event) {
var today = new Date();
today.setHours(0,0,0,0); // Don't care about time
// Create Email Trigger three days before
const sendDaysBefore = 3;
var daysBefore = new Date(event.start);
daysBefore.setDate(daysBefore.getDate() - sendDaysBefore);
var trigger = ScriptApp.newTrigger('sendEmail')
.timeBased()
.at(daysBefore)
.create();
associateEventWithTrigger(trigger.getUniqueId(), event);
return trigger.getUniqueId();
}
associateEventWithTrigger
将触发器 ID 与日历事件联系起来。 sendEmail
然后会创建一封新电子邮件,其中包含来自日历事件的所有客户信息。当触发器被执行时,它会删除触发器,因为它不会被再次使用。
所有这些都运行良好,因为我一次测试一个日历事件。然而,一旦我决定同步所有今年的日历事件,脚本很快就会抛出这个错误:
Exception: This script has too many triggers. Triggers must be deleted from the script before more can be added.
显然你可以 only have 20 triggers per user/script。这非常不方便,因为我期望创建数百个触发器。
因此,我需要重新考虑如何去做这件事。有什么建议么?我很感激。
建议的解决方法
此脚本被设计为 运行 时间驱动触发器 运行s daily .
function sendReminderEmails() {
let file = SpreadsheetApp.getActive();
let sheet = file.getSheetByName("Sheet1");
let range = sheet.getDataRange();
let values = range.getValues();
// removing headers
values.shift()
values.forEach(row => {
let name = row[0]
let email = row[1]
let date = row[2]
// Date object representing time now
let now = new Date();
// helper variables
let second = 1000;
let minute = second * 60;
let hour = minute * 60;
let day = hour * 24;
// gets time to appointment in milliseconds
let timeToApp = date.getTime() - now.getTime()
if (timeToApp > 2 * day && timeToApp < 3 * day) {
MailApp.sendEmail(
email,
"Remember Your Appointment",
"Hello " + name + ",\nYou have an appointment coming up soon."
)
}
})
}
这是基于这样的示例传播sheet:
因此您需要根据您的特定格式对其进行调整。
脚本演练
- 它基于date object。
- 如果您的日期在您的传播sheet 中存储为格式化日期,当您
getValues
时,Apps 脚本将自动将它们作为 Date 对象传递。或者,如果需要,您可以将它们转换为 Apps 脚本中的 Date 对象。
- 脚本首先获取目标 sheet 中的所有值。
- 它初始化了一个代表现在时间的新日期对象。
- 然后它遍历目标的每一行 sheet 并获取约会前的时间值。
- 如果该值介于 2 天和 3 天之间,则会发送一封电子邮件。
我想你可以制作一个脚本来每天搜索事件,提前 3 天的事件,select 然后发送电子邮件。所以每天只会触发一个脚本,使用日期触发方式。
我正在尝试自动化工作流程的某些部分,以便使用 Google 日历安排客户。我已经使用检测更改的触发器成功地捕获了 new/edited/deleted Apps 脚本中的 new/edited/deleted 事件,并 Calendar.event.list
将这些更改与电子表格同步。
我在包含所有客户的电子表格中新建一行或编辑现有行。我想做的是在与客户约会前三天,自动生成一封包含他们所有详细信息的自定义电子邮件,作为约会提醒发送给他们。
我的计划是每次在电子表格中创建新行时(当创建新的日历事件时),都创建一个新的电子邮件触发器。该触发器将执行代码以创建包含所有客户信息的电子邮件。
function createEmailTrigger(event) {
var today = new Date();
today.setHours(0,0,0,0); // Don't care about time
// Create Email Trigger three days before
const sendDaysBefore = 3;
var daysBefore = new Date(event.start);
daysBefore.setDate(daysBefore.getDate() - sendDaysBefore);
var trigger = ScriptApp.newTrigger('sendEmail')
.timeBased()
.at(daysBefore)
.create();
associateEventWithTrigger(trigger.getUniqueId(), event);
return trigger.getUniqueId();
}
associateEventWithTrigger
将触发器 ID 与日历事件联系起来。 sendEmail
然后会创建一封新电子邮件,其中包含来自日历事件的所有客户信息。当触发器被执行时,它会删除触发器,因为它不会被再次使用。
所有这些都运行良好,因为我一次测试一个日历事件。然而,一旦我决定同步所有今年的日历事件,脚本很快就会抛出这个错误:
Exception: This script has too many triggers. Triggers must be deleted from the script before more can be added.
显然你可以 only have 20 triggers per user/script。这非常不方便,因为我期望创建数百个触发器。
因此,我需要重新考虑如何去做这件事。有什么建议么?我很感激。
建议的解决方法
此脚本被设计为 运行 时间驱动触发器 运行s daily .
function sendReminderEmails() {
let file = SpreadsheetApp.getActive();
let sheet = file.getSheetByName("Sheet1");
let range = sheet.getDataRange();
let values = range.getValues();
// removing headers
values.shift()
values.forEach(row => {
let name = row[0]
let email = row[1]
let date = row[2]
// Date object representing time now
let now = new Date();
// helper variables
let second = 1000;
let minute = second * 60;
let hour = minute * 60;
let day = hour * 24;
// gets time to appointment in milliseconds
let timeToApp = date.getTime() - now.getTime()
if (timeToApp > 2 * day && timeToApp < 3 * day) {
MailApp.sendEmail(
email,
"Remember Your Appointment",
"Hello " + name + ",\nYou have an appointment coming up soon."
)
}
})
}
这是基于这样的示例传播sheet:
因此您需要根据您的特定格式对其进行调整。
脚本演练
- 它基于date object。
- 如果您的日期在您的传播sheet 中存储为格式化日期,当您
getValues
时,Apps 脚本将自动将它们作为 Date 对象传递。或者,如果需要,您可以将它们转换为 Apps 脚本中的 Date 对象。 - 脚本首先获取目标 sheet 中的所有值。
- 它初始化了一个代表现在时间的新日期对象。
- 然后它遍历目标的每一行 sheet 并获取约会前的时间值。
- 如果该值介于 2 天和 3 天之间,则会发送一封电子邮件。
我想你可以制作一个脚本来每天搜索事件,提前 3 天的事件,select 然后发送电子邮件。所以每天只会触发一个脚本,使用日期触发方式。