Create repeating events from existing events:
- Daily
- Monthly (third Tuesday of every month)
- Weekly ( every ‘Monday’)
*Note: No source link was provided for this script.
Create repeating events from existing events:
*Note: No source link was provided for this script.
/* Base specific */
const table = base.getTable('Events');
function assignDate(existingRecord, date) {
return {fields: {
Name: existingRecord.getCellValue('Name'),
Date: date,
Notes: existingRecord.getCellValue('Notes'),
}};
}
/* And this is just the working bit */
const daysOfWeek = [
{label: 'Sunday', value: '0'},
{label: 'Monday', value: '1'},
{label: 'Tuesday', value: '2'},
{label: 'Wednesday', value: '3'},
{label: 'Thursday', value: '4'},
{label: 'Friday', value: '5'},
{label: 'Saturday', value: '6'},
];
const months = [
{label: 'January', value: '0'},
{label: 'February', value: '1'},
{label: 'March', value: '2'},
{label: 'April', value: '3'},
{label: 'May', value: '4'},
{label: 'June', value: '5'},
{label: 'July', value: '6'},
{label: 'August', value: '7'},
{label: 'September', value: '8'},
{label: 'October', value: '9'},
{label: 'November', value: '10'},
{label: 'December', value: '11'},
];
const freq = [];
for (let i = 1; i <= 50; i++) {
freq.push(i.toString());
}
output.markdown(`# ? Let's make some recurring events!`);
const record = await input.recordAsync('Select Event', table);
let eventDate = record.getCellValue('Date');
output.clear();
output.markdown(`## ? You selected '**${record.name}**'`);
const repeatFreq = await input.buttonsAsync(`How frequently does ${record.name} occur?`, ['Daily', 'Weekly', 'Monthly',]);
const newRecords = [];
switch (repeatFreq) {
case 'Weekly': {
const repeatDay = await input.buttonsAsync('Repeats every...', daysOfWeek);
const repeatWeeks = await input.buttonsAsync('for X weeks.', freq);
const niceDay = dayOfWeekNumberToString(repeatDay);
output.clear();
output.markdown(`# ? We will make '**${record.name}**' an event every **${niceDay}** for **${repeatWeeks}** weeks. On these dates:`);
/* Add events to newRecords array */
eventDate = shiftDay(eventDate, parseInt(repeatDay, 10));
for (let i = 1; i <= parseInt(repeatWeeks, 10); i++) {
const newDate = addDays(eventDate, (7 * i));
newRecords.push(assignDate(record, newDate));
output.text(newDate.toLocaleString());
}
break;
}
case 'Daily': {
const repeatWeeks = await input.buttonsAsync('For how many days?', freq);
output.clear();
output.markdown(`# ? We will make '**${record.name}**' an event every day. On these dates:`);
/* Add events to newRecords array */
for (let i = 1; i <= parseInt(repeatWeeks, 10); i++) {
const newDate = addDays(eventDate, i);
newRecords.push(assignDate(record, newDate));
output.text(newDate.toLocaleString());
}
break;
}
case 'Monthly': {
const repeatTiming = await input.buttonsAsync('Which week of the month?', ['First', 'Second', 'Third', 'Last']);
const repeatDay = await input.buttonsAsync(`on the ${repeatTiming}...`, daysOfWeek);
const repeatStartMonth = await input.buttonsAsync('Starting in...', months);
const repeatWeeks = await input.buttonsAsync('For how many months?.', freq);
const niceDay = dayOfWeekNumberToString(repeatDay);
output.clear();
eventDate = shiftYear(eventDate,parseInt(repeatStartMonth, 10));
output.markdown(`# ? We will make '**${record.name}**' an event every **${niceDay}** for **${repeatWeeks}** months starting **${eventDate.toLocaleString()}**. On these dates:`);
/* Add events to newRecords array */
const r = parseInt(repeatWeeks, 10);
const m = parseInt(repeatStartMonth, 10);
for (let i = 0; i day.value === v);
return result.label;
}
function addDays(date, days) {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
function shiftDay(date, newDay) {
const d = new Date(date);
const day = d.getDay();
const dif = newDay - day;
return addDays(date, dif);
}
function shiftYear(date, month) {
let result = new Date(date);
if((month - result.getMonth()) < 0 ){
result.setFullYear(result.getFullYear() + 1);
}
return result;
}
function shiftMonthly(date, month, dy, timing) {
let result = new Date(date);
let modifier = 0;
result.setDate(1);
result.setMonth(month);
switch (timing) {
case 'First':
break;
case 'Second':
modifier = 7;
break;
case 'Third':
modifier = 14;
break;
case 'Last':
modifier = -7;
result.setMonth(month + 1);
break;
default:
throw new Error('Unexpected timing');
}
let firstday = result.getDay() === dy;
while (firstday === false) {
result = addDays(result, 1);
firstday = result.getDay() === dy;
}
return addDays(result, modifier);
}