I am trying to create a recurring booking system. The added booking needed to be repeated based on the days selected. Eg: Monday & Thursday is selected then every week Monday & Thursday will be booked for the same client with all the same details as the first booking added. I don’t want the bookings to be generated years in advance but a couple of weeks and then if the system detect that the booking is still active then it will generate more later. I also want to be able to adjust some info as needed and update the future bookings accordingly. Basically I want something like Calendar event where events are auto generated and can be edited at any point “just one event or this & future events” type, while leaving the past bookings as it is without any change.
Hello, It’s often best to use at least two tables for this:
RecurringPatterns Table (or MasterBookings): This table will define the recurrence rule.
- Assumed Columns:
- [PatternID] (Type: Text, Key) - Unique ID for the pattern.
- [ClientName] (Type: Text, or Ref to a Clients table)
- [ServiceDetails] (Type: Text, or Ref to a Services table)
- [DefaultStartTime] (Type: Time)
- [DefaultEndTime] (Type: Time)
- [DaysOfWeek] (Type: EnumList, Base Type: Text, with allowed values: “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”)
- [RecurrenceStartDate] (Type: Date) - When the recurrence begins.
- [RecurrenceEndDate] (Type: Date, optional) - When the recurrence stops.
- [IsActive] (Type: Yes/No) - To control if new bookings should still be generated.
- Other details common to all recurring instances.
IndividualBookings Table: This table will store each actual booking instance.
- Assumed Columns:
- [BookingID] (Type: Text, Key) - Unique ID for each specific booking.
- [LinkedPatternID] (Type: Ref, referencing RecurringPatterns) - Links this booking to its recurrence rule.
- [BookingDate] (Type: Date) - The specific date of this booking.
- [StartTime] (Type: Time) - Can be copied from the pattern or adjusted for this instance.
- [EndTime] (Type: Time) - Can be copied from the pattern or adjusted for this instance.
- [ClientName] (Type: Text or Ref) - Copied from pattern, can be useful for display.
- [Status] (Type: Text, e.g., “Scheduled”, “Completed”, “Cancelled”)
- Any other details specific to this one instance.
- Generating Initial Recurring Bookings (e.g., for the next few weeks)
When a new row is added to RecurringPatterns (or an existing one is set to [IsActive] = TRUE), you’ll want to generate the first set of IndividualBookings.
- Logic:
- Determine the start date ([RecurrenceStartDate]).
- Determine the days of the week selected ([DaysOfWeek]).
- Loop for a defined period (e.g., 4 weeks from the start date).
- For each day in this period, if its weekday matches one of the selected [DaysOfWeek], create a new row in IndividualBookings.
-
AppSheet Implementation:
-
This typically involves an Action (or a set of actions) on the RecurringPatterns table, perhaps triggered on “Form Save”.
-
AppSheet doesn’t have direct loops in actions. Common strategies: Helper Action to Add One Booking: An action that calculates the next valid booking date and adds it. This action might then be called multiple times or trigger itself under certain conditions (this can get complex).
-
Calculating a List of Dates: More advanced, but you could use a virtual column to calculate a list of the first N booking dates, and then an action could iterate through this list to add rows.
-
Key Formula Concepts for Calculating Dates:
-
TODAY(): Gets the current date.
-
WEEKDAY([Date]): Returns a number for the day of the week (Sunday=1, Monday=2, …, Saturday=7). To find the date of the next occurrence of a specific weekday (e.g., next Monday) on or after* a [GivenDate]:
// Assuming TargetWeekdayNumber is 2 for Monday
// [GivenDate] + MOD((TargetWeekdayNumber - WEEKDAY([GivenDate]) + 7), 7)
I hope it’s help