Швидке поліпшення координації ваших заходів за допомогою Airtable та no-code

Швидке поліпшення координації ваших заходів за допомогою Airtable та no-code

Наша команда розробників зіткнулася з необхідністю знайти no-code або low-code рішення, яке допомогло б мінімізувати ризики та оптимізувати процес планування виступів спікерів в EdTech компанії. Ми виявили, що стандартні інструменти та методи управління не завжди здатні впоратися з поставленим завданням, особливо коли справа доходить до складності та динамічності змін у розкладі заходів. Це призвело до розробки власного рішення, заснованого на технології no/low-code платформи Airtable і програмуванні на JavaScript.

У цій статті ми поділимося нашим досвідом вирішення проблеми перетину розкладів спікерів, розповімо про виклики, з якими ми зіткнулися, та опишемо, як технологічний low-code підхід дозволив нам створити ефективну систему для управління заходами. Також ми розповімо як саме користуватися Airtable в рамках цойго завдання так що таки Airtable та йоги скрипти та автоматизації у порівнянні.

Поліпшення координації заходів: автоматизація розкладу спікерів за допомогою Airtable та JavaScript

Скріншот фрагменту коду на JavaScript, де показано ініціалізацію модуля Airtable. В коді використовується вимагання модуля 'airtable' за допомогою функції require, а потім створюється новий екземпляр Airtable з використанням API ключа.
Куратори курсів наших курсів періодично стикалися з ситуацією, коли одному й тому ж спікеру призначалися лекції або івенти на той самий день. Часто ця проблема виявлялася вже в останній момент, що змушувало негайно переплановувати заходи.

Корінь проблеми полягав у тому, що при плануванні заходів ми не враховували можливості участі одного спікера у різних сесіях, які проводяться одночасно. Це означало, що без належного контролю та координації ми ризикували опинитися в ситуації, коли спікер фізично не міг бути присутнім у двох місцях одночасно. На практиці це призводило до необхідності останній момент змінювати розклад, що могло негативно вплинути на враження учасників та загальне сприйняття організації заходу.

#1. Головне завдання – уникнення конфліктів розкладу спікерів

Інтерфейс веб-додатку для відстеження подій, із зосередженням на двох подіях у таблиці.

Вирішення проблеми вимагало від нас впровадження no-code системи, яка б дозволила уникнути подібних перетинів у розкладі. Ми усвідомлювали, що для ефективного управління часом спікерів необхідний комплексний підхід, який включав як ретельне планування, так і можливість гнучкого реагування на зміни в розкладі.

#2. Розробка рішення: автоматизація за допомогою Airtable та власних скриптів, тобто no-code + low-code

Для вирішення проблеми з перетином розкладів ми визначили, що ключ до успіху лежить в автоматизації процесів управління часом спікерів. Початковою точкою нашого шляху ефективного рішення стала база даних, розміщена Airtable. Airtable надав нам зручну платформу для зберігання та управління даними про заходи, включаючи інформацію про спікерів та їх розклади. Ця система була обрана за її гнучкість та можливість інтеграції з різними автоматизованими процесами.

Однак незабаром стало ясно, що стандартні засоби no-code автоматизації, доступні в Airtable, не здатні повністю вирішити наше завдання. Вони не змогли забезпечити достатню глибину аналізу і не надавали необхідну гнучкість для обробки специфічних сценаріїв, з якими ми стикалися. В результаті було прийнято рішення про розробку власного скрипту, який був би спеціально налаштований під наші унікальні вимоги.

Розроблений нами скрипт використовує JavaScript та взаємодіє безпосередньо з базою даних в Airtable. Він автоматично запускається під час кожного оновлення інформації про спікерів, проводячи детальний аналіз майбутніх заходів.

const table = await input.tableAsync('Pick a table');
const timeField =  await input.fieldAsync("Pick a date/time field", table);
const linkField =  await input.fieldAsync("Pick a linked records field", table);
const issueTableName = "Errors log";
let issuesTable;
const issueFieldName = "Error text";
const issueLinkedName = table.name;
const dateOptions = {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
};
const issuesForDeletingArr=[];
const issuesForCreatingArr = [];
function dataFormating(dataString){
    const oldDate = new Date(dataString);
    const newDateWithoutTime = new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate());
    return newDateWithoutTime;
}
const dateNow = new Date();
// @ts-ignore
const isIssuesTableInclude = base.tables.filter(table => table.name === issueTableName);
if(isIssuesTableInclude.length===0){
    
    const issuesTableID = await base.createTableAsync(issueTableName, [{name: issueFieldName, type: "singleLineText"}]);
    issuesTable = base.getTable(issuesTableID);
    await issuesTable.createFieldAsync(issueLinkedName, "multipleRecordLinks", {linkedTableId: table.id});
} else {
    issuesTable = base.getTable(issueTableName);
}
const allEventsFetch = await table.selectRecordsAsync({fields: [timeField.name, linkField.name, issueTableName]});
const allEvents = allEventsFetch.records.map(evt=>({
    id: evt.id,
    start:dataFormating(evt.getCellValue(timeField.name)),
    linkedRecord: evt.getCellValueAsString(linkField.name).split(', '),
    issues: evt.getCellValue(issueTableName)
}))
.filter(evt=>evt.start.getTime()>dateNow.getTime());
const issueText = "❌ The linked record already has an event scheduled for the same date";
const issuesFetch = await issuesTable.selectRecordsAsync({fields: issuesTable.fields});
let issuesArr = issuesFetch.records.map(rec=>({
    id: rec.id,
    name: rec.getCellValueAsString(issueFieldName),
    event: rec.getCellValueAsString(issueLinkedName)
}));
function deleteIssues(arrIssuesForDeleting){
    const newArr = arrIssuesForDeleting.filter(rec=>rec!==null).flat().map(rec=>rec.id);
    issuesTable.deleteRecordsAsync(newArr);
}
async function createIssue(issuesArr){
    const newIssue = await issuesTable.createRecordsAsync(issuesArr);
                return newIssue;
}
//foreach all events
allEvents.forEach(event=>{
    //push all issues with the conflict in arr
    issuesForDeletingArr.push(event.issues);
    //filter all events with each linked rcords of the event and same date
    event.linkedRecord.forEach(linkedRec=>{
        // @ts-ignore
        let filteredEvents = allEvents.filter(rec=>event.start.getTime()===rec.start.getTime()&&rec.linkedRecord.includes(linkedRec)&&rec.id!==event.id&&!rec.linkedRecord.includes(''));
        if(filteredEvents.length!==0){
            issuesForCreatingArr.push({
                    fields: {
                        [issueFieldName]: `${issueText} filter events by ${linkedRec} linked record and date for details`,
                        [issueLinkedName]: [{ id: event.id }]
                    },
                });
        } else {
        }
    })
})
deleteIssues(issuesForDeletingArr);
createIssue(issuesForCreatingArr);
output.text('The script has finished working. If errors were found, you will find them in the Errors log table or in the linked records of event. If the errors were corrected, the error records were deleted.')]

script

Скрипт перевіряє наявність перетинів у розкладах та, у разі їх виявлення, фіксує дані ситуації для подальшого коригування. Такий підхід дозволив нам не лише своєчасно виявляти потенційні конфлікти у розкладі, а й значно спростити процес їхнього вирішення.

Скрипт написаний JavaScript і автоматично запускає no-code автоматизацію, коли змінюється інформація у полі спікера.

Знімок екрану інтерфейсу автоматизації Airtable завдань з активним тригером.

Вбудована автоматизація не підійшла, бо має обмежені можливості. Тобто ми можемо, наприклад, або лише if-else перевіряти, або проводити перебір записів. Тобто одночасно в автоматизації робити і перебір і перевірку на if-else неможливо. Саме тому ми звернули увагу на скрипти як наступний крок переходу з повного no-code рішення на low-code.

Фактор

Автоматизація в Airtable

Скрипти в Airtable

Складність завдання

Підходять для простих завдань, таких як перенесення даних між таблицями, надсилання повідомлень тощо.

Краще підходять для складніших завдань, які потребують умовної логіки, обробки великих обсягів даних тощо.

Користувальницьке введення

Можуть включати обмежене введення через форми Airtable

Можуть обробляти складне введення, включаючи обробку даних із зовнішніх джерел

Швидкість та масштабованість

Автоматизації добре масштабуються для простих операцій, але можуть бути обмежені за швидкістю виконання та обсягом оброблюваних даних

Скрипти можуть бути оптимізовані для високої швидкості виконання та обробки великих обсягів даних

Рівень контролю та гнучкості

Надають обмежений контроль та гнучкість, оскільки залежать від визначених шаблонів автоматизації

Надають високий рівень контролю та гнучкості, дозволяючи реалізовувати складну логіку та інтеграцію із зовнішніми API

Вимоги до технічних навичок

Мінімальні підходять для користувачів без досвіду програмування

Вимагають знання JavaScript та розуміння програмування для створення та налагодження скриптів

Час на розробку та підтримку

Швидке створення автоматизацій із використанням графічного інтерфейсу, низькі витрати на підтримку

Може знадобитися більше часу на розробку та підтримку, особливо для складних скриптів

#3. Принцип роботи рішення: деталізація механізму

Давайте докладніше розберемо який принцип роботи скрипта:

  1. Аналіз та фільтрація подій

Наша система розпочинає роботу з аналізу майбутніх подій. Основна увага приділяється датам проведення, що дозволяє нам зосередитись виключно на майбутніх заходах та уникнути непотрібної обробки минулих івентів. Це значно прискорює роботу скрипта, що критично важливо з огляду на обмеження часу виконання операцій в Airtable, що становить 30 секунд.

  1. Звіряння розкладів спікерів

Далі система переходить до звірки розкладів спікерів. Ми беремо інформацію про кожного спікера, призначеного на подію, та перевіряємо, чи не заплановані на той же день інші заходи за його участю. У випадку, якщо спікерів кілька, процес повторюється для кожного з них, забезпечуючи ретельну перевірку та запобігання можливим перетинам у розкладі.

  1. Обробка помилок та повідомлення щодо конфліктів

Ключовим аспектом нашого рішення є не лише виявлення конфліктів у розкладі, а й ефективне керування помилками. Помилки записуються в спеціальне поле no-code бази даних, що полегшує їхню візуалізацію та подальше вирішення проблем. У разі виправлення помилки, пов'язаної з певним спікером та подією, інформація про помилку видаляється. Таким чином, вся команда має доступ до актуального статусу завдань і може оперативно реагувати на проблеми, що виникають.

Alt-текст: Скріншот таблиці з логами подій, де більшість записів позначено червоним хрестиком і мають однаковий коментар "Подія того самого типу запланована за 5 днів". Записи в колонці подій мають різні назви, такі як "Майстер-клас", "Вебінар" і "Семінар". В останніх рядках вказано "Спікер вже має запланований вебінар".
  1. Поліпшення та перспективи

Наше рішення активно використовується командою, задля эффективного розпізнавання типів конфліктів вони налаштували собі також кастомізоване за допомогою no-code функцій Airtable колірне рішення. Це дозволяє швидко ідентифікувати та виправляти проблеми, що виникають, значно спрощуючи процес управління заходами та розкладом спікерів.

#4. Що допомогло розробити скрипт: корисні посилання

У процесі роботи над проєктом особливо цінними виявилися знання, пов'язані з роботою з об'єктами в Airtable та застосуванням методів JavaScript для перебору та фільтрації даних. Використання методів map та filter дозволило нам ефективно обробляти великі обсяги інформації, спрощуючи та прискорюючи роботу скрипту. Такий підхід демонструє міць програмування та автоматизації у вирішенні конкретних завдань управління та планування.

Для розробки та оптимізації нашого рішення ми спиралися на різні джерела інформації, включаючи документацію та навчальні матеріали з Airtable та JavaScript. Статті та посібники, такі як "Working with Objects", "Airtable Basics", та ресурси за методами JavaScript, виявилися неоціненними у процесі навчання та розробки нашого скрипту.

У самому редакторі AirTable є приклади коду об'єктів:

Скріншот редактора скриптів у веб-додатку Airtable з панелями "Input variables", "Code" та "Test output". У розділі коду виділено JavaScript-код, що здійснює вибірку записів з таблиці подій і таблиці логування проблем. В коді присутні коментарі про збір подій із спікерами та проблемами, а також строка з текстом помилки "Спікер уже має запланований вебінар на ту саму дату". Поруч з кодом знаходиться вікно документації

#5. Філософія вирішення проблем

Важливим аспектом нашого підходу до вирішення проблем є фокус на запобігання їх повторному виникненню. Ця філософія допомагає нам залишатися зосередженими на постійному покращенні процесів та систем, а також нагадує про те, що для будь-якої проблеми існує рішення.

Відлуння цієї думки знаходимо в словах Альберта Ейнштейна:

«Якби я мав лише одну годину, щоб врятувати світ, я б витратив п'ятдесят п'ять хвилин, щоб визначити проблему, і тільки п'ять хвилин, щоб знайти рішення».

Цей принцип нагадує нам про значення глибокого розуміння проблеми перед тим, як розпочинати її вирішення. Особливо коли ви намагаєтесь зрозуміти чи потрібен вам шлях до no-code, або до low-code, бо кожне невірне рішення - це ваш час.

ВИСНОВКИ

Підсумуємо, що у процесі роботи з проблемою перетинів у розкладі лекторів ми виявили, що стандартні інструменти не підходять для вирішення проблеми. Найбільш підходящим інструментом рішення виявилася платформа Airtable.

Щоб спростити роботу з заходами, що перетинаються, ми створили власний скрипт, який не тільки спростив роботу команди, але й виявився доступним для подальших поліпшень та може бути використаний на інших проєктах та продуктах наших клієнтів. зіткнулася з необхідністю знайти рішення, яке допомогло б мінімізувати ризики та оптимізувати процес планування виступів спікерів в EdTech компанії.

Ми виявили, що стандартні інструменти та методи управління не завжди здатні впоратися з поставленим завданням, особливо коли справа доходить до складності та динамічності змін у розкладі заходів. Це призвело до розробки власного рішення, заснованого на технології Airtable і low-code програмуванні на JavaScript.

En