首页 > 解决方案 > 替代使用触发器为创建的每个日历事件自动发送电子邮件

问题描述

我正在尝试自动化我的工作流程的某些部分,以便使用 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 个触发器。这很不方便,因为我期望创建数百个触发器。

因此,我需要重新考虑如何去做。有什么建议么?我很感激。

标签: google-apps-scripttriggers

解决方案


建议的解决方法

此脚本设计为在每天运行的时间驱动触发器上运行。

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 天之间,则会发送一封电子邮件。

推荐阅读