当使用相同标签名称多次调用GmailApp.createLabel时,会发生什么情况?

时间:2019-05-06 07:25:40

标签: google-apps-script gmail

我尝试了以下代码。

function addLabel() {
  console.log(GmailApp.createLabel('FOO'));
  console.log(GmailApp.createLabel('FOO'));
}

运行此功能后,我看到只有一个标签FOO,并且保留了先前分配给FOO的线程。并且在运行时不会为“重复标签名称”引发异常。

这是有效的行为吗?可以依靠吗?官方documentation没有提及类似内容。

1 个答案:

答案 0 :(得分:1)

使用已经存在的标签名称调用GmailApp.createLabel()将返回已经存在的标签。它不会对您现有的标签进行任何更改。


根据文档,唯一通过create或获取label的方法是通过标签名称。重要的是,GmailLabel class中列出的唯一标识属性是name。因此,我的假设是Apps Script强制执行名称的唯一性,并防止覆盖现有标签。

我们可以尝试一个简单的测试。如果覆盖保护不存在,则创建新标签可能会删除标签和电子邮件之间的关联。因此,让我们看看哪些电子邮件出现在某个标签下,创建一个具有相同名称的新标签,并查看电子邮件列表是否相同。

function test() {
  var label1 = GmailApp.getUserLabelByName("test_label"); // Get existing label
  var threads = label1.getThreads();
  var label1_messages = [];
  for (var i in threads) {
    var messages = threads[i].getMessages();
    for (var j in messages) {
      label1_messages.push(messages[j].getId()); // Store the message IDs in label1_messages
    }
  }

  var label2 = GmailApp.createLabel("test_label"); // Create a new label with the same name
  var threads = label2.getThreads();
  var label2_messages = [];
  for (var i in threads) {
    var messages = threads[i].getMessages();
    for (var j in messages) {
      label2_messages.push(messages[j].getId()); // Store the message IDs in label2_messages
    }
  }
  Logger.log(JSON.stringify(label1_messages) == JSON.stringify(label2_messages)); // Quick, non-robust check of the arrays results in TRUE
}

结果是它们是相同的,因此可以确认createLabel()足够聪明,可以避免覆盖现有标签的假设。

不过,我们可以走得更远。 Gmail API清楚地表明标签具有ID。再说一遍,我没有看到标签名称必须唯一的要求(尽管我们可以假定最终用户只能与标签名称进行交互-如果存在多个具有相同名称的标签,这将是糟糕的UX)。

如果您在Advanced Google services中启用了Gmail API,我们可以测试API要求。尝试使用与我们已经知道的标签相同的名称创建一个新标签。

function createLabel() {
  Gmail.Users.Labels.create({name: "test_label"}, "me");
}

这将导致以下错误,然后确认标签名称必须唯一。

  

对gmail.users.labels.create的API调用失败,并出现以下错误:标签名称   存在或冲突

让我们再走一步。最初,我认为Apps Script可以防止覆盖现有标签。因此,让我们检查现有标签的ID,然后使用相同的标签名称调用GmailApp.createLabel(),然后查看是否创建了新标签/标签ID已更改。

function finalTest() {
  var response = Gmail.Users.Labels.list("me"); // Get labels
  for (var i in response.labels) {
    var label = response.labels[i];
    if (label.name == "test_label")
      Logger.log(label.id); // ID: Label_48
  }

  var newLabel = GmailApp.createLabel("test_label"); // Create a new label with the same name

  var response = Gmail.Users.Labels.list("me"); // Get labels again to see if any difference
  for (var i in response.labels) {
    var label = response.labels[i];
    if (label.name == "test_label")
      Logger.log(label.id); // ID: Label_48
  }
}

如您所见,标签ID保持不变,这意味着GmailApp.createLabel()确实可以防止覆盖现有标签。