Каково будет поведение GmailApp.createLabel при многократном вызове с одним и тем же именем метки? - PullRequest
0 голосов
/ 06 мая 2019

Я попробовал следующий код.

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

После запуска этой функции я вижу, что есть только одна метка FOO, и потоки, которые ранее были назначены для FOO, сохраняются. И не возникает исключение во время выполнения для «дублированного имени метки».

Это правильное поведение? На что можно положиться? Официальная документация ничего подобного не упоминает.

1 Ответ

1 голос
/ 07 мая 2019

Вызов GmailApp.createLabel() с именем метки, которое уже существует, вернет уже существующую метку. Он не внесет никаких изменений в ваш существующий ярлык.


Согласно документации, единственный способ создать или получить метку - через имя метки. Важно отметить, что единственным идентифицирующим свойством, перечисленным в классе GmailLabel , является имя . Таким образом, я предполагаю, что 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 четко указывает на то, что метки имеют идентификатор. Здесь снова, я не вижу никаких требований, чтобы имена меток были уникальными (хотя мы можем предположить, что это, учитывая, что конечные пользователи могут взаимодействовать только с именами меток - это будет ужасный UX, если существует несколько с одним и тем же именем).

Если вы включите Gmail API в Расширенные службы Google , мы сможем протестировать требования API. Попробуйте создать новый ярлык с тем же именем, которое, как мы уже знаем, существует.

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

Это приводит к ошибке ниже, которая затем подтверждает, что имена меток должны быть уникальными.

API-вызов gmail.users.labels.create завершился ошибкой: имя метки существует или конфликтует

Давайте сделаем еще один шаг. Сначала я предполагал, что Apps Script защищает от перезаписи существующих меток. Итак, давайте проверим идентификатор существующей метки, затем вызовем GmailApp.createLabel() с тем же именем метки и посмотрим, была ли создана новая метка / изменился идентификатор метки.

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
  }
}

Как видите, идентификатор метки остается прежним, что означает, что GmailApp.createLabel() действительно защищает от перезаписи существующих меток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...