كيفية إنشاء مهام متكررة متقدمة وقوية في نوشن
إذا كنت طالباً، أو محترفاً، أو عاشقاً للإنتاجية وكنت تريد أن يتعامل مدير مهام نوشن مع المهام المتكررة حقاً—فكر في "كل خميس ثالث"، أو "آخر يوم عمل في الشهر"، أو "الاثنين/الأربعاء/الجمعة"—فإن هذا الدليل لك! سأرشدك خطوة بخطوة، من خصائص قاعدة البيانات إلى الأتمتة، حتى تتمكن من إعداد نظام مهام متكررة مرن وذكي في نوشن.
الخطوة ١: إعداد خصائص قاعدة البيانات
قبل أن نتعمق في المعادلات السحرية، تأكد من أن قاعدة البيانات تحتوي على الخصائص التالية (بهذه الأسماء الضبط حتى تعمل المعادلات):
| اسم الخاصية | النوع | | --- | --- | | الحالة | الحالة | | الموعد النهائي | التاريخ | | فترة التكرار | رقم | | وحدة التكرار | اختيار | | الأيام | اختيار متعدد | | مفتاح الترجمة | معادلة | | الموعد التالي | معادلة |
نصيحة: للحصول على شرح كامل، راجع أدلة الفيديو أو أقسام الأسئلة الشائعة (هناك صور رائعة، لكن هذه المقالة تعطيك ملخصاً مختصراً).
الخطوة ٢: إعداد خيارات التكرار
في خاصية "وحدة التكرار"، أضف هذه الخيارات:
- يوم(أيام)
- أسبوع(أسابيع)
- شهر(شهور)
- سنة(سنوات)
- شهر(شهور) في آخر يوم
- شهر(شهور) في أول يوم عمل
- شهر(شهور) في آخر يوم عمل
- يوم عمل رقم ن في الشهر
لخاصية "الأيام":
أضف كل يوم من أيام الأسبوع كخيارات (الاثنين، الثلاثاء، إلخ).
كيف تعمل هذه في الممارسة
- أيام متعددة: تريد أن تتكرر المهمة في الاثنين/الأربعاء/الجمعة؟ اختر "يوم(أيام)" وحدد أيامك.
- يوم عمل رقم ن: تريد "كل خميس ثالث"؟ اضبط فترة التكرار = ٣، وحدة التكرار = "يوم عمل رقم ن في الشهر"، الأيام = الخميس.
الخطوة ٣: الترجمة للاستخدام العالمي
أضف هذه المعادلة إلى خاصية مفتاح الترجمة، والتي تتيح لك تخصيص اللغة لأيام الأسبوع، والحالات، والوحدات:
[
/* أعد كتابة خيارات أيام الأسبوع ووحدة التكرار بلغتك الخاصة، حتى يعمل عقلك الثاني بشكل أفضل مع عقلك الأول. تأكد من إعداد نفس الخيارات في خصائص "وحدة التكرار" و"الأيام" بعد ذلك، حتى تتمكن من اختيارها. لا تتردد في إزالة الأسماء الأصلية بعد ذلك! */
/* ["الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"] */
["الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
/* ["يوم(أيام)", "أسبوع(أسابيع)", "شهر(شهور)", "سنة(سنوات)", "شهر(شهور) في آخر يوم", "شهر(شهور) في أول يوم عمل", "شهر(شهور) في آخر يوم عمل", "يوم عمل رقم ن في الشهر"] */
["يوم(أيام)", "أسبوع(أسابيع)", "شهر(شهور)", "سنة(سنوات)", "شهر(شهور) في آخر يوم", "شهر(شهور) في أول يوم عمل", "شهر(شهور) في آخر يوم عمل", "يوم عمل رقم ن في الشهر"],
/* هذه القائمة الأخيرة لأسماء خيارات الحالة. */
["لم تبدأ", "قيد التنفيذ", "مكتملة"]
]
خصص القيم إذا كنت تفضل لغة أو مصطلحات أخرى—فقط تأكد من مزامنة الأسماء مع خيارات خاصية الاختيار/الاختيار المتعدد.
الخطوة ٤: معادلة "الموعد التالي" المتقدمة
الصق هذه المعادلة المتقدمة في خاصية الموعد التالي. تحسب هذه المعادلة موعد التكرار التالي، بما في ذلك منطق المواعيد المتأخرة، والفترات المخصصة، والأنماط "الأنيقة" (مثل آخر يوم عمل في كل شهر).
lets(
version, "2.2.0",
dueProp, prop("الموعد النهائي"),
recurIntervalProp, prop("فترة التكرار"),
recurUnitProp, prop("وحدة التكرار"),
localizationKeyProp, prop("مفتاح الترجمة"),
daysProp, prop("الأيام"),
emptyDate, parseDate(""),
if(!empty(recurIntervalProp) and !empty(dueProp),
if(recurIntervalProp > 0 and recurIntervalProp == ceil(recurIntervalProp),
lets(
recurUnit,
ifs(
or(recurUnitProp == at(at(localizationKeyProp, 1), 0), recurUnitProp == "يوم(أيام)"), "days",
or(recurUnitProp == at(at(localizationKeyProp, 1), 1), recurUnitProp == "أسبوع(أسابيع)"), "weeks",
or(recurUnitProp == at(at(localizationKeyProp, 1), 2), recurUnitProp == "شهر(شهور)"), "months",
or(recurUnitProp == at(at(localizationKeyProp, 1), 3), recurUnitProp == "سنة(سنوات)"), "years",
or(recurUnitProp == at(at(localizationKeyProp, 1), 4), recurUnitProp == "شهر(شهور) في آخر يوم"), "monthsonthelastday",
or(recurUnitProp == at(at(localizationKeyProp, 1), 5), recurUnitProp == "شهر(شهور) في أول يوم عمل"), "monthsonthefirstweekday",
or(recurUnitProp == at(at(localizationKeyProp, 1), 6), recurUnitProp == "شهر(شهور) في آخر يوم عمل"), "monthsonthelastweekday",
or(and(!empty(at(at(localizationKeyProp, 1), 7)), recurUnitProp == at(at(localizationKeyProp, 1), 7)), recurUnitProp == "يوم عمل رقم ن في الشهر"), "nthweekday",
"days"
),
weekdays,
match(
[
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 1 - 1)), includes(daysProp, "الاثنين")), 1, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 2 - 1)), includes(daysProp, "الثلاثاء")), 2, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 3 - 1)), includes(daysProp, "الأربعاء")), 3, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 4 - 1)), includes(daysProp, "الخميس")), 4, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 5 - 1)), includes(daysProp, "الجمعة")), 5, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 6 - 1)), includes(daysProp, "السبت")), 6, false),
if(or(includes(daysProp, at(at(localizationKeyProp, 0), 7 - 1)), includes(daysProp, "الأحد")), 7, false)
],
"[1-7]"
),
dateDue, parseDate(formatDate(dueProp, "YYYY-MM-DD")),
timeNow, now(),
dateNow, parseDate(formatDate(timeNow, "YYYY-MM-DD")),
hasRange, dateEnd(dueProp) > dateStart(dueProp),
recurUnitLapseLength,
if(
includes(["days", "weeks", "months", "years"], recurUnit),
dateBetween(dateNow, dateDue, recurUnit) / recurIntervalProp,
false
),
lastDayBaseDate,
if(
includes(["monthsonthelastday", "monthsonthefirstweekday", "monthsonthelastweekday"], recurUnit),
if(
year(dateNow) * 12 + month(dateNow) - (year(dateDue) * 12 + month(dateDue)) > 0,
dateSubtract(dateAdd(dateSubtract(dateAdd(dateDue, ceil((year(dateNow) * 12 + month(dateNow) - (year(dateDue) * 12 + month(dateDue))) / recurIntervalProp) * recurIntervalProp, "months"), date(dateAdd(dateDue, ceil((year(dateNow) * 12 + month(dateNow) - (year(dateDue) * 12 + month(dateDue))) / recurIntervalProp) * recurIntervalProp, "months")) - 1, "days"), 1, "months"), 1, "days"),
dateSubtract(dateAdd(dateSubtract(dateAdd(dateDue, recurIntervalProp, "months"), date(dateAdd(dateDue, recurIntervalProp, "months")) - 1, "days"), 1, "months"), 1, "days")
),
emptyDate
),
firstDayBaseDate,
if(
lastDayBaseDate != emptyDate,
dateSubtract(lastDayBaseDate, date(lastDayBaseDate) - 1, "days"),
emptyDate
),
firstWeekdayBaseDate,
if(
lastDayBaseDate != emptyDate,
if(
test(day(firstDayBaseDate), "6|7"),
dateAdd(firstDayBaseDate, 8 - day(firstDayBaseDate), "days"),
firstDayBaseDate
),
emptyDate
),
lastWeekdayBaseDate,
if(
lastDayBaseDate != emptyDate,
if(
test(day(lastDayBaseDate), "6|7"),
dateSubtract(lastDayBaseDate, day(lastDayBaseDate) - 5, "days"),
lastDayBaseDate
),
emptyDate
),
nextLastBaseDate,
if(
lastDayBaseDate != emptyDate,
dateSubtract(dateAdd(dateSubtract(dateAdd(lastDayBaseDate, recurIntervalProp, "months"), date(dateAdd(lastDayBaseDate, recurIntervalProp, "months")) - 1, "days"), 1, "months"), 1, "days"),
emptyDate
),
nextFirstBaseDate,
if(
lastDayBaseDate != emptyDate,
dateSubtract(nextLastBaseDate, date(nextLastBaseDate) - 1, "days"),
emptyDate
),
nextFirstWeekday,
if(
lastDayBaseDate != emptyDate,
if(
test(day(nextFirstBaseDate), "6|7"),
dateAdd(nextFirstBaseDate, 8 - day(nextFirstBaseDate), "days"),
nextFirstBaseDate
),
emptyDate
),
nextLastWeekday,
if(
lastDayBaseDate != emptyDate,
if(
test(day(nextLastBaseDate), "6|7"),
dateSubtract(nextLastBaseDate, day(nextLastBaseDate) - 5, "days"),
nextLastBaseDate
),
emptyDate
),
firstWeekSpecificDayBaseDate,
lets(
baseMonthDate,
if(
timeNow > dueProp,
timeNow,
dueProp
),
weekday, toNumber(at(weekdays, 0)),
firstDayOfNextMonth, dateSubtract(dateAdd(baseMonthDate, 1, "months"), date(baseMonthDate) - 1, "days"),
ifs(
day(firstDayOfNextMonth) < weekday, dateAdd(firstDayOfNextMonth, weekday - day(firstDayOfNextMonth), "days"),
day(firstDayOfNextMonth) > weekday, dateAdd(firstDayOfNextMonth, weekday - day(firstDayOfNextMonth) + 7, "days"),
firstDayOfNextMonth
)
),
nthWeekdayBaseDate, dateAdd(firstWeekSpecificDayBaseDate, recurIntervalProp - 1, "weeks"),
nextDueStart,
ifs(
recurUnit == "days" and length(weekdays) > 0 and recurIntervalProp == 1,
if(
dateNow >= dateDue,
ifs(
includes(weekdays, format(day(dateAdd(dateNow, 1, "days")))), dateAdd(dateNow, 1, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 2, "days")))), dateAdd(dateNow, 2, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 3, "days")))), dateAdd(dateNow, 3, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 4, "days")))), dateAdd(dateNow, 4, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 5, "days")))), dateAdd(dateNow, 5, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 6, "days")))), dateAdd(dateNow, 6, "days"),
includes(weekdays, format(day(dateAdd(dateNow, 7, "days")))), dateAdd(dateNow, 7, "days"),
emptyDate
),
ifs(
includes(weekdays, format(day(dateAdd(dateDue, 1, "days")))), dateAdd(dateDue, 1, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 2, "days")))), dateAdd(dateDue, 2, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 3, "days")))), dateAdd(dateDue, 3, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 4, "days")))), dateAdd(dateDue, 4, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 5, "days")))), dateAdd(dateDue, 5, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 6, "days")))), dateAdd(dateDue, 6, "days"),
includes(weekdays, format(day(dateAdd(dateDue, 7, "days")))), dateAdd(dateDue, 7, "days"),
emptyDate
)
),
recurUnit == "nthweekday" and length(weekdays) == 1 and recurIntervalProp >= 1 and recurIntervalProp <= 5,
if(
month(nthWeekdayBaseDate) == month(firstWeekSpecificDayBaseDate),
nthWeekdayBaseDate,
dateSubtract(nthWeekdayBaseDate, 1, "week")
),
recurUnit == "monthsonthelastday",
if(
dateNow >= lastDayBaseDate,
nextLastBaseDate,
lastDayBaseDate
),
recurUnit == "monthsonthefirstweekday",
if(
dateNow >= firstWeekdayBaseDate,
nextFirstWeekday,
firstWeekdayBaseDate
),
recurUnit == "monthsonthelastweekday",
if(
dateNow >= lastWeekdayBaseDate,
nextLastWeekday,
lastWeekdayBaseDate
),
includes(["days", "weeks", "months", "years"], recurUnit),
if(
dateBetween(dateNow, dateDue, "days") >= 1,
if(
recurUnitLapseLength == ceil(recurUnitLapseLength),
dateAdd(dateDue, (recurUnitLapseLength + 1) * recurIntervalProp, recurUnit),
dateAdd(dateDue, ceil(recurUnitLapseLength) * recurIntervalProp, recurUnit)
),
dateAdd(dateDue, recurIntervalProp, recurUnit)
),
emptyDate
),
recurRange, dateBetween(nextDueStart, dateDue, "days"),
timeNextDueStart, dateAdd(dateStart(dueProp), recurRange, "days"),
timeNextDueEnd, dateAdd(dateEnd(dueProp), recurRange, "days"),
nextDue,
if(
hasRange,
dateRange(timeNextDueStart, timeNextDueEnd),
timeNextDueStart
),
nextDue
),
dueProp
),
emptyDate
)
)
هذه المعادلة طويلة لكنها ضرورية؛ تأكد من أن أسماء الخصائص مطابقة تماماً!
الخطوة ٥: أتمتة مهامك المتكررة
الآن، دعنا نعالج هذه المهام تلقائياً عند انتهائك منها.
١. أنشئ عرضاً مصفى يسمى "المهام المتكررة": - المرشح: الموعد النهائي غير فارغ و فترة التكرار >= ١ ٢. أنشئ أتمتة قاعدة البيانات: - المحفز: الحالة تُضبط على مكتملة - الإجراء ١: اضبط الحالة مرة أخرى على "لم تبدأ" - الإجراء ٢: اضبط خاصية الموعد النهائي على معادلة:
```jsx
context("Trigger page").prop("الموعد التالي")
```
- هذا يشير إلى خاصية "الموعد التالي"، محدثاً موعد مهمتك تلقائياً باستخدام معادلتك الضخمة.
نصيحة محترف: استخدم دائماً خصائص المعادلة للمنطق المعقد حتى تتمكن من مراجعة المخرجات واستكشاف الأخطاء بسهولة!
لماذا هذا مهم
مع هذا النظام، يتعامل مساحة عمل نوشن مع أي سيناريو مهام متكررة تقريباً—مفيد سواء كنت طالباً، أو محترفاً مع مواعيد نهائية معقدة، أو تبني متتبع عادات روحية. يمكنك ضبط المهام لتتكرر في أي نمط قد تحتاجه تقريباً—تلقائياً!
كمطور نوشن ومهندس مدني، أعرف كم من الوقت يمكن أن توفر التصميم الذكي. مع هذا الإعداد، يمكنك قضاء وقت أقل في العبث بالتواريخ، والمزيد من الوقت في التركيز على المهام المهمة.
الأفكار النهائية والخطوات التالية
هذا مجرد الأساس! فكر في إضافة سجل تاريخ المهام، المزيد من الأتمتة (للإشعارات، على سبيل المثال)، أو ربط إعداد التكرار الخاص بك بلوحات المعلومات لعمل تدفق إنتاجية شامل.
فضولي حول حالات استخدام محددة، أو تحتاج مساعدة في استكشاف أخطاء المعادلات أو الأتمتة؟ اطرح أسئلتك في التعليقات، أو راجع موارد الإنتاجية في نوشن للحصول على قوالب مصممة للطلاب، والمحترفين، والمسلمين الذين يريدون التنظيم، والتعلم، والنمو—كل ذلك في مكان واحد.
تنظيم سعيد،
مصطفى ياسر
ابدأ اليوم
طريق الوضوح والنجاح يبدأ من قالب واحد. انقر أدناه لفتح تجربة العقل الثاني الكاملة: