如何使用 google app-script 在任务列表中查找特定日期的任务
How to find if the tasks for a particular date in a tasklist using 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()
}
}
}
您可以考虑将脚本写入另一个单元格(可能在另一列)以指示任务状态,例如 added 或 updated 然后写一个条件语句来检查该单元格以确定如何处理它。这是一个非常模糊的答案,但正如 Tanaike 在他们的评论 "provide your current script" 或它的通用版本中所说的那样,我们可以提供更大的帮助。
我设法找到了一个涉及过滤整个任务列表的解决方法。它似乎适用于我现在的少数任务。我不确定它将如何处理大量任务。欢迎任何进一步的贡献。
我在变通方法中使用的代码如下,并替换了以下行 //在我的原始代码中创建一个新任务:-
//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")
}
注意:- setStatus 没有按预期工作,但我会 post 对此提出一个单独的问题。
我正在使用安装的 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()
}
}
}
您可以考虑将脚本写入另一个单元格(可能在另一列)以指示任务状态,例如 added 或 updated 然后写一个条件语句来检查该单元格以确定如何处理它。这是一个非常模糊的答案,但正如 Tanaike 在他们的评论 "provide your current script" 或它的通用版本中所说的那样,我们可以提供更大的帮助。
我设法找到了一个涉及过滤整个任务列表的解决方法。它似乎适用于我现在的少数任务。我不确定它将如何处理大量任务。欢迎任何进一步的贡献。
我在变通方法中使用的代码如下,并替换了以下行 //在我的原始代码中创建一个新任务:-
//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")
}
注意:- setStatus 没有按预期工作,但我会 post 对此提出一个单独的问题。