Как узнать, есть ли задачи на определенную дату в списке задач с помощью google app-script

Я использую установленный триггер редактирования Google Таблиц для создания задач Google. Однако при редактировании строки, содержащей задачу, которая уже была создана как задача, для того же дня создается дубликат задачи.

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

Вот мой текущий код запуска:

function addTask(event){
  if (spreadsheet.getActiveSheet().getName() === "Task List") {
    var RowNum = event.range.getRow();
    var taskproperties = spreadsheet.getActiveSheet().getRange(RowNum, 1, 1, 5).getValues();

    var Title = taskproperties[0][1];
    var Frequency = taskproperties[0][2];
    var StartDate = taskproperties[0][3];
    var Recurrence = taskproperties[0][4];
    if (Title.trim().length !== 0 && Frequency.trim().length !== 0 &&
        StartDate.toString().trim().length !== 0 && Recurrence.toString().trim().length !== 0)
    {
      //Code to Create a new task
      //Code Get the task date                              
      //Some codes to set Date parameters for use in script functions
      //Some codes to set Date parameters for use in sheet functions
      //Set the task parameters
      //add task to list
      //--------------------------------------------------------------

      //Assign a cell in the spreadsheet for calculation of new dates for recurring task            
      var tempdatecell= spreadsheet.getSheetByName("Task List").getRange("F1")

      //Insert new tasks based on the number of recurrence
      for (i = 1; i < Recurrence; i++) {
        //Insert a formula in a cell the spreadsheet to calculate the new task date
        tempdatecell.setFormula('=WORKDAY.INTL("' + shTaskStartDate + '",' + i + '*VLOOKUP("' + Frequency + '",tasktype,2,false),"1000011")')

        //Get task date from the cell                  
        TaskDate = tempdatecell.getValue()

        //Date parameters for use in script functions                  
        var TaskDate = new Date(TaskDate);
        var taskmonth = Number(TaskDate.getMonth()) 
        var taskDay = TaskDate.getDate() + 1
        var taskyear = TaskDate.getYear()

        //Create a new task
        var task = Tasks.newTask();

        //Set the task parameters
        task.title = Title;
        task.due = new Date(taskyear, taskmonth, taskDay).toISOString()

        //add task to list
        task = Tasks.Tasks.insert(task, tasklistID);
      }

      tempdatecell.clearContent()
    }
  }  
}

person Sheils    schedule 11.04.2019    source источник
comment
Что такое контрольный список? И если вы можете предоставить свой текущий сценарий, это поможет пользователям придумать решение.   -  person Tanaike    schedule 11.04.2019


Ответы (2)


Вы можете рассмотреть возможность записи сценария в другую ячейку (возможно, в другой столбец), которая указывает статус задачи, например добавлено или обновлено, а затем записать в условном выражении который проверяет эту ячейку, чтобы определить, что с ней делать. Это действительно расплывчатый ответ, но, как заявил Танайке в своем комментарии, «предоставьте свой текущий сценарий» или его общую версию, и мы можем оказать большую помощь.

person Paul Murray    schedule 11.04.2019
comment
Привет, ребята, я добавил выдержку из моего скрипта в пост. @Paul добавление одного столбца в электронную таблицу не сработает, потому что функция создает повторяющуюся задачу. Мне нужен способ узнать, есть ли повторение для определенной даты в списке задач. Мне это также понадобится на следующем этапе кодирования, потому что каждый день я хотел бы вытаскивать задачу на день в лист сегодняшних задач. - person Sheils; 11.04.2019

Мне удалось найти обходной путь, который включает фильтрацию всего списка задач. Кажется, это работает с теми немногими задачами, которые у меня есть сейчас. Я не уверен, как он будет работать с большим объемом задач. Приветствуется любой дополнительный вклад.

Код, который я использую в работе, выглядит следующим образом и заменяет строку ниже //Создать новую задачу в моем исходном коде:-

  //Check if the task exist for the task date

  var listoftasks = Tasks.Tasks.list(tasklistID)

  var filtermonth="0" + shTaskStartMonth

  var filterdate=scTaskStartYear + "-" + filtermonth.substr(filtermonth.length-2) + "-" + shTaskStartDay + "T00:00:00.000Z"

  var filteredtask=listoftasks["items"].filter(function(item){

      return item["due"]== filterdate && item["title"]===Title

    })

    if(filteredtask.length==0){

        //Create a new task
        var task = Tasks.newTask()

        //Set the task parameters
        task.title = Title;
        task.due=new Date(scTaskStartYear,scTaskStartMonth,scTaskStartDay).toISOString()

        //add task to list
        task = Tasks.Tasks.insert(task, tasklistID)

    }

    else{

        //Get the existing task
        task = Tasks.Tasks.get(tasklistID, filteredtask[0].id)

        task.setStatus("completed")
    }

NB: - setStatus не работает должным образом, но для этого я задам отдельный вопрос.

person Sheils    schedule 13.04.2019