У меня есть Google Sheet, и я пытаюсь вывести дату или строку в зависимости от трех дат и трех логических значений, которые представляют задачу как выполненную.
Я пишу специальную функцию для этого, но не могу заставить работать логику, я работаю над ней уже несколько дней.
В моем листе у меня есть начальная дата. Три даты выполнения задач рассчитываются в столбцах D, F и H. Затем есть три логических значения «готово», которые показывают, была ли задача завершена.
Я хочу, чтобы это сводилось к одному выводу, где указана дата для «следующей даты выполнения задачи», или, если последняя задача выполнена, пометьте ее как «УДАЛИТЬ». Сложная часть возникает, когда более поздняя задача имеет приоритет над задачей, не завершенной ранее.
Но логика слишком сложна. Кажется, я не могу разбить это на способ, которым я могу решить, как это сделать.
В своем листе я указал ожидаемые результаты для каждого случая. (Я знаю, что я даже не исследовал все 64 случая, но на данный момент я не осмеливаюсь слишком сильно заморачиваться).
По сути, мне нужна функция, которая принимает dates
и dones
и затем получает результат.
function myFunction(date1,date2,date3,done1,done2,done3) {
var TODAY = new Date();
DATES = [date1,date2,date3]
var wait = []
for (var k of [date1,date2,date3]){
if (k > TODAY){
wait.push(1)
}else{
wait.push(0)
}
}
var done = []
for (var k of [done1,done2,done3]){
if (k){
done.push(1)
}else{
done.push(0)
}
}
var omega = []
for (var i = 0; i < wait.length; i++) {
omega.push(done[i] | wait[i])
}
Как видите, моя последняя попытка включала выполнение функции ИЛИ и взятие крайних правых нулей, но я проигнорировал это, потому что это не работает.
Кто-нибудь знает, как мне попробовать это так, чтобы это работало?
@MattMorgan Ожидаемые входные и выходные данные указаны в Google Sheet.
Лучшая практика в отношении переполнения стека — это когда вопросы стоят отдельно и включают минимальный код и данные, необходимые для воспроизведения задаваемой проблемы. Ссылки на внешние ресурсы могут устареть и сломаться, что сделает вопрос/ответ менее полезным для будущих читателей. stackoverflow.com/help/how-to-ask (см. «Помогите другим воспроизвести проблему»)
Попробуйте эту адаптированную версию кода @mplungjan.
Я заменил карту массива, которая устанавливает приоритет завершенных задач и закрывает незавершенные предшествующие задачи.
function myFunction(date1, date2, date3, done1, done2, done3) {
const today = new Date();
const dates = [new Date(date1), new Date(date2), new Date(date3)];
var dones = [done1, done2, done3];
// Completes earlier tasks if subsequent tasks are completed
var dones = dones.map((val,index) => { if (dones.lastIndexOf('x')>=index ) {return 'x'}});
// Filter for dates that are not done
const futureDates = dates.filter((date,index) => !dones[index]);
// Find the earliest date from the filtered future dates
const nextDueDate = futureDates.reduce((earliest, date) => {
return date < earliest ? date : earliest;
}, new Date('2999-12-31')); // initial date far in the future
// If the nextDueDate year is still in the far future then all tasks are done (on no dates)
return (nextDueDate.getFullYear() === 2999) ? 'DELETE' : nextDueDate.toLocaleDateString(); // Returns the next due date in a readable format
}
Спасибо, но все равно работает некорректно. Google Sheet показывает, какие результаты я ожидаю для каждой перестановки входных данных. Итак myFunction(02-June-2024, 03-June-2024, 04-June-2024, 0, 0, 0) = 02-June-2024
потому что это самая ранняя дата, которая не сделана. Но вместо этого код @mplungjan выводит «DELETE», как и ваш.
Игнорируй меня. Я не уверен, что сохранил его после вставки в ваш код, ха-ха. Теперь, похоже, это работает по-другому. Но есть еще несколько случаев, когда он работает неправильно. `myFunction(12-June, 13-June, 14-June,0,1,0) = 14-June, потому что в этом случае факт, что 13 июня наступило, переопределяет тот факт, что более ранняя дата не была выполнена.
Ох, это приоритет цепочки, позвольте мне настроить источник и я сообщу, когда он будет готов.
Вероятно, есть более чистый способ сделать это, но это работает :)
Было бы полезно, если бы вы добавили в свой вопрос примеры ожидаемых входных и выходных данных.