【问题标题】:How to set Google Tasks Due Date如何设置 Google Tasks 截止日期
【发布时间】:2018-09-20 15:42:05
【问题描述】:

如何在应用脚本中使用 google 任务服务设置任务的截止日期?

Tasks Service

尝试将此值设置为给定日期,但这似乎只更新本地值而不是更新服务器值,正如 tehhowch 所建议的那样

task.due = new Date();

如何更新服务器?这是我尝试过的

var x = {
    due: new Date()
};
Tasks.Tasks.update(x, "MDE2NzI3NTAzNjc5NTQ1ODY5MTY6MDow", task);

但它会引发错误

Invalid value for: Invalid format: "Tue Apr 10 20:45:26 GMT-04:00 2018"

已完成的项目

我使用这段代码创建了这个项目,以使 Google Tasks 保持最新状态:

Keep Google Tasks Updated

https://github.com/CTOverton/Keep-Google-Tasks-Updated

【问题讨论】:

  • “它不起作用”不是问题陈述。你得到什么错误?会发生什么行为?应该发生什么行为?你发现了什么具体的研究?还有其他人遇到过这个问题吗?运行以下行后,您如何处理 task 对象? stackoverflow.com/help/how-to-ask
  • 我的猜测是您成功地修改了资源的本地表示,但未能使用新资源更新服务器。见developers.google.com/google-apps/tasks/v1/reference/tasks/…
  • 谢谢,我已经修改了我的问题并尝试了你的建议。仍然不完全确定如何使用必须更新服务器的数据。你能举个例子吗?

标签: date google-apps-script google-tasks-api google-tasks


【解决方案1】:

根据Task resource 的 Google Tasks API 文档,due 参数必须是 RFC 3339 timestamp。所以应该是"2018-04-11T0:45:26.000Z",而不是"Tue Apr 10 20:45:26 GMT-04:00 2018"。查看相关问题:Generate an RFC 3339 timestamp similar to Google Tasks API?

这与任务的其他datetime 属性使用的格式相同,所以如果要记录任务:

console.log(Tasks.Tasks.get(listId, taskId));

那么duecompletedupdated 属性(如果存在)将指示所需的格式。

通过 Google Apps 脚本中的原生 Javascript Date,最简单的方法是:

function getExtension(listId, taskId) {
  var now = new Date();
  var deadline = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 7));
  var newTask = {
    due: Utilities.formatDate(deadline, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")
  };
  // Since we supply only a partial resource, call .patch() rather than .update()
  Tasks.Tasks.patch(newTask, listId, taskId);
}

【讨论】:

  • 感谢您提供的示例。这很有帮助
  • 完美!非常感谢!
  • 在写这篇文章的时候值得注意的是:“到期日只记录日期信息;设置到期日时,时间戳的时间部分被丢弃。无法读取或通过 API 写入任务到期的时间”。见developers.google.com/tasks/reference/rest/v1/tasks
【解决方案2】:

继续检查@tehhowch,但这是一个由 Task API 中的教程组成的例程,该 API 位于 here,它会遍历您的所有任务,如果当前到期,则在到期日上增加一天日期是过去的。我以前从未使用过 Task API,所以 tehhowch 的 getExtension 示例非常有帮助。

function addOneDayToDueDates(){
  var seconds=1000;
  var minutes=60*seconds;
  var hours=60*minutes;
  var days=24*hours;//this is just my simple minded way of get the millisecond in a day
  var nowValue=new Date().valueOf();
  var taskLists=Tasks.Tasklists.list();
  if(taskLists.items){//loop through all lists
    for(var i=0;i<taskLists.items.length;i++){
      var taskList=taskLists.items[i];
      var tasks=Tasks.Tasks.list(taskList.id);
      if(tasks.items){
        for(var j=0;j<tasks.items.length;j++){//loop through all task in list
          Logger.log('i=%s,j=%s\n',i,j);
          var task=tasks.items[j];
          var dueValue=new Date(task.due).valueOf();
          if(dueValue<nowValue){//date comparison
            var newDue = new Date(new Date(task.due).valueOf() + 1*days);
            Logger.log('newDue=%s,Due=%s',newDue,task.due);
            var newTask = {due: Utilities.formatDate(newDue, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")};
            Tasks.Tasks.patch(newTask, taskList.id, task.id);
          }
        }
      }
    }
  }
}

@tehhowch 我花了一些时间尝试使用您建议的 pageToken 想法。在分布在 35 个列表中的大约 350 个任务之后,我终于能够看到迭代转到两次。

这是我的代码:(顺便说一句,我希望 Apps 脚本文档对用户更友好一点。我正在使用 reference page 和 API Explorer 来尝试解决所有问题。如果您看到任何明显的错误,我感谢您的评论,因为我一直在努力了解更多信息)

 function listTasks() {
  var taskToken;
  var iteration=0;
  var opts={pageToken:taskToken,maxResults:100};
  do{
    iteration++;
    var myLists=Tasks.Tasklists.list(opts)
    if(myLists.items){
      for(var i=0;i<myLists.items.length;i++){
        var item=myLists.items[i];
        Logger.log(item.title + '\n' + item.id + '\n');
        var myTasks=Tasks.Tasks.list(item.id)
        if(myTasks.items){
          for(var j=0;j<myTasks.items.length;j++){
            Logger.log(myTasks.items[j].title + '\n');
          }
        }else{
          Logger.log('No tasks for ' + item.title + '\n');
        }
      }
    }
    Logger.log('Get Page Token ' + 'Iterations: ' + iteration);
    opts.pageToken=myLists.nextPageToken;
  }while(opts.pageToken);
  Logger.log('End of Function');
}

【讨论】:

  • 请注意,.list() 方法不会在一次调用中返回所有项目,仅返回第一页(除非您通过可选的 pageToken 参数请求不同的页面)。
  • @tehhowch 感谢您的评论。我自己不使用任务,所以我的示例总共只有两个任务。所以这会使代码变得相当复杂。
  • @Cooper 这还不错 - 在do {...} while (opts.pageToken); 循环中调用.list(opts),并将结果的.items 聚合到您选择的对象中。然后将opts.pageToken 设置为.nextPageToken
  • @tehhowch 我回来尝试实施您的建议,但一切都继续在循环中的一条路径中完成。我在 3 个不同的列表中创建了大约 30 个任务。也许我需要更多……不知道。如果你有时间,我会很感激的。
  • @Cooper 最大页面大小通常为 20-100 项。如果要测试循环,请将maxResults 设置为 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2013-05-30
  • 1970-01-01
  • 2014-01-06
  • 2020-05-09
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多