【问题标题】:Create a recurring event that repeats Monthly on the third Tuesday创建一个在第三个星期二每月重​​复的定期事件
【发布时间】:2017-08-13 18:29:18
【问题描述】:

使用Google Apps Script Calendar Service(而不是Calendar API Advanced Service)是否可以创建一个在星期几每月重复的重复事件?例如,该系列中的第一个事件是 3 月 21 日,星期二。我希望这个活动在每个月的第三个星期二重复。我能做到的最接近的方法如下:

var recurrence = CalendarApp.newRecurrence();
recurrence = recurrence.addMonthlyRule()
    .interval(this.repeatMonths)
    .onlyOnWeekday(CalendarApp.Weekday[dayOfWeek]);

有谁知道这样做的方法吗?

【问题讨论】:

  • 您可以在每个星期二触发它,然后检查代码中的日期。

标签: google-apps-script google-calendar-api recurring-events


【解决方案1】:

这将创建一个在每个月的第三个星期二从上午 10 点到下午 12 点重复发生的事件。第一个事件是 2018 年 9 月 11 日,最后一个事件是 2019 年 3 月 12 日。您显然需要从数据中构建字符串参数的关键部分。

var recurringEvent = myCal.createEventFromDescription("Event Title, the third Tuesday of each Month, 10-12, 2018-09-11 until 2019-03-13");

【讨论】:

    【解决方案2】:

    这似乎是最糟糕的一种肮脏的黑客行为。必须有更好的方法来处理生成数字序列。为什么没有动态方法来获取 Weekday 对象之一?抛开恐怖片不谈,这似乎确实有效。

    var start = new Date();  // The event start date
    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
    var days = [
      CalendarApp.Weekday.SUNDAY,
      CalendarApp.Weekday.MONDAY,
      CalendarApp.Weekday.TUESDAY,
      CalendarApp.Weekday.WEDNESDAY,
      CalendarApp.Weekday.THURSDAY,
      CalendarApp.Weekday.FRIDAY,
      CalendarApp.Weekday.SATURDAY
    ];
    var weekday = days[start.getDay()];
    var monthday = start.getDate();
    var mod = monthday % 7 - 1;
    var good_days = numbers.slice(monthday-mod, monthday-mod+7)
    
    var recurrence = CalendarApp.newRecurrence();
    recurrence.addWeeklyRule().onlyOnWeekday(weekday).onlyOnMonthDays(good_days);
    

    一般的想法是通过日期确定它是一个月中的哪一周。 1-7 必须是第一周,8-14 必须是第二周,等等。然后创建每月重复,仅限于一周中的适当日期。最后,将一个月中的天数限制为可能导致同一周的天数。

    如果addMonthlyRule() 有一个标志来设置每月每周的重复,那肯定会很好。

    【讨论】:

      【解决方案3】:

      我尝试过这种方式并且我工作了,希望这对任何人都有效 还在迷茫中

       Calendar calendar = GregorianCalendar.getInstance();
                  calendar.set(calendar.get(Calendar.YEAR),
                          calendar.get(Calendar.MONTH),
                          calendar.get(Calendar.DAY_OF_MONTH),
                          calendar.get(Calendar.HOUR_OF_DAY),
                          calendar.get(Calendar.MINUTE),
                          calendar.get(Calendar.SECOND));
      
      
      
      calendar.set(Calendar.DAY_OF_WEEK, calendar.get(Calendar.DAY_OF_WEEK)); // Thursday
                  calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 3); // third day of month
      
                  alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * (7*4) ,pendingIntent);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-10
        • 2020-06-21
        • 2015-12-05
        • 2016-11-30
        • 2019-02-12
        相关资源
        最近更新 更多