google-apps-script - 替代使用触发器为创建的每个日历事件自动发送电子邮件
问题描述
我正在尝试自动化我的工作流程的某些部分,以便使用 Google 日历安排客户。我已经成功地使用检测更改并将Calendar.event.list
这些更改与电子表格同步的触发器来捕获 Google Apps 脚本中的新/编辑/删除事件。
我在所有客户的电子表格中创建新行或编辑现有行。我想做的是在与客户约会的前三天,自动生成一封包含他们所有详细信息的自定义电子邮件,作为约会提醒发送给他们。
我的计划是每次在电子表格中创建新行时(创建新日历事件时),都会创建一个新的电子邮件触发器。该触发器将执行代码以创建包含所有客户信息的电子邮件。
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.
显然,每个用户/脚本只能有 20 个触发器。这很不方便,因为我期望创建数百个触发器。
因此,我需要重新考虑如何去做。有什么建议么?我很感激。
解决方案
建议的解决方法
此脚本设计为在每天运行的时间驱动触发器上运行。
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."
)
}
})
}
这是基于这样的示例电子表格:
因此,您需要将其调整为您的特定格式。
脚本演练
- 它基于日期对象。
- 如果您的日期在电子表格中存储为格式化日期,则当您使用时
getValues
,Apps 脚本会自动将它们作为 Date 对象传递。或者,如果需要,您可以将它们转换为 Apps 脚本中的 Date 对象。 - 该脚本首先获取目标工作表中的所有值。
- 它初始化了一个表示现在时间的新 Date 对象。
- 然后,它遍历目标工作表的每一行,并获取距离约会多长时间的值。
- 如果该值介于 2 天和 3 天之间,则会发送一封电子邮件。
推荐阅读
- java - 如何通过 Spring Boot 查询区域内的点?
- angular - 在 Angular 8 中初始化嵌套对象的有效方法
- python - “依赖于安装的默认”目录布局背后的想法是什么?
- c++ - 在 C++ 中,struct 的内存结构是如何默认排列的?
- python - 如何从 Python 中执行 shell 命令获取输出
- azure - EventProcessorHost 方法 - 我是否需要用于事件中心的 azure blob 存储和租赁容器?
- r - 用R中的data.table按组提取n个最大值
- javascript - 角度库节点模块
- java - Flutter:Android许可证状态未知
- python - 无法理解来自 httpie 调用的错误