新创建的 Google 任务省略了提供的 "TaskLink" 属性

Newly created Google Task omits the supplied "TaskLink" property

我正在尝试制作一个小 Google 脚本,它会在搜索我的 GMail 电子邮件后自动将 Google 任务添加到 "My List" TaskList

除了向生成 Task 的电子邮件添加 link 外,一切正常。尝试遵循 API 文档并没有真正帮助。

这是实际任务生成器函数的代码:

function addTask(taskListId, myTitle, myEmailLink) {
  var task = Tasks.newTask(); // effectively same as "= {}".
  task.title = myTitle
  task.notes = 'blank';

  task.links = [{}]
  task.links[0].description = 'Link to corresponding email';
  task.links[0].type = 'email';
  task.links[0].link = 'myEmailLink';

  task = Tasks.Tasks.insert(task, taskListId);
}

知道为什么我收到的任务没有 links 吗?

Per the Google Tasks API Documentation:

links[] list
Collection of links. This collection is read-only.

您不能通过修改任务资源(即您的代码)来设置这些链接

task.links = [{}]
task.links[0].description = 'Link to corresponding email';
task.links[0].type = 'email';
task.links[0].link = 'myEmailLink';

只是被服务器忽略了。

据我所知,

TaskLinks 在 Googleplex 之外无法使用且不可配置。 API 用户可能不存在它们。

我能够生成一个 Task 的唯一方法是使用 Gmail UI 并选择 "Add to Tasks"。生成的任务然后将此代码段包含在任务项的最后一行中:

正如其他人所指出的,根据 Google Tasks API Documentation ,不幸的是 links 集合是只读的。

作为一种可能的解决方法,您似乎可以将 link 添加到任务的注释部分,然后可以从 GMail 的任务窗格中直接单击 link。

Picture: Task with clickable link

您的函数可以修改为将 link 放在注释部分,如下所示:

function addTask(taskListId, myTitle, myEmailLink) {
  var task = Tasks.newTask(); // effectively same as "= {}".
  task.title = myTitle
  task.notes = 'link: ' + myEmailLink;

  task = Tasks.Tasks.insert(task, taskListId);
}

将此与 GmailApp 线程对象上的 getPermalink() 函数相结合,可以深入 link 获取您要查找的电子邮件。

Picture: Task with permalink to email

我正在编写一组脚本,除了其他一些事情外,还可以执行您正在谈论的一些事情:https://github.com/tedsteinmann/gmailAutoUpdate

在我的解决方案中,我有一个函数可以获取带有特定标签的 GMail 线程(在我的例子中是@Task),然后创建一个任务,将主题设置为 thread.getFirstMessageSubject(),将注释设置为 thread.getPermalink()

整个函数如下所示:

function processPending_() {

  var label_pending = GmailApp.getUserLabelByName(LABEL_PENDING);
  var label_done = GmailApp.getUserLabelByName(LABEL_DONE);

  // The threads currently assigned to the 'pending' label
  var threads = label_pending.getThreads();

  // Process each one in turn, assuming there's only a single
  // message in each thread
  for (var t in threads) {
    var thread = threads[t];

    // Grab the task data
    var taskTitle = thread.getFirstMessageSubject();
    var taskNote = 'Email: ' + thread.getPermalink();

    // Insert the task
    addTask_(taskTitle, taskNote, getTasklistId_(TASKLIST));

    // Set to 'done' by exchanging labels
    thread.removeLabel(label_pending);
    thread.addLabel(label_done);
  }

  // Increment the processed tasks count
  Logger.log('Processed %s tasks', threads.length);
}