我尝试了以下代码。
function addLabel() {
console.log(GmailApp.createLabel('FOO'));
console.log(GmailApp.createLabel('FOO'));
}
运行此功能后,我看到只有一个标签FOO
,并且保留了先前分配给FOO
的线程。并且在运行时不会为“重复标签名称”引发异常。
这是有效的行为吗?可以依靠吗?官方documentation没有提及类似内容。
答案 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()
确实可以防止覆盖现有标签。