Гугл скрипт, чтобы удалять сообщения без файлов и оставлять остальные

Я написал скрипт, который удаляет сообщения почты.

Как отредактировать этот скрипт, чтобы он оставлял сообщения с вложениями?

const SPAMMEREMAIL = '[email protected]';

async function trigger() {
  if (SPAMMEREMAIL.length < 3)
    throw new Error('Danger of deleting all content!');

  const threads = Gmail.Users.Threads.list('me', {
    q: `(from:${SPAMMEREMAIL})`,
  });

  if (threads && threads.threads) {
    threads.threads.forEach(thread => Gmail.Users.Threads.remove('me', thread.id));
  }

  const trashThreads = Gmail.Users.Threads.list('me', {
    q: `(from:${SPAMMEREMAIL}) is:trash`,
  });

  if (trashThreads && trashThreads.threads) {
    trashThreads.threads.forEach(thread => Gmail.Users.Threads.remove('me', thread.id));
  }
}

Ответы (1 шт):

Автор решения: oshliaer

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

/**
 * Привязывается к триггеру по времени
 */
function triggerActionsDeleteMessagesWithoutAttacmentByQuery() {
  const QUERY = 'from:[email protected]';
  if (QUERY.length < 3)
    throw new Error('Danger of deleting all content!');
  const res = deleteMessagesWithoutAttacmentByQuery_(QUERY);
  res.forEach(s => console.log(s));
}

/**
 * Удаляет сообщения без вложений
 * 
 * @param {string} query
 * @returns {string[]}
 */
function deleteMessagesWithoutAttacmentByQuery_(query) {
  const messages = Gmail.Users.Messages.list('me', {
    q: `${query} -has:attachment`
  });

  if (!messages?.messages?.length) return [];

  const ids = messages.messages.map(message => message.id);

  Gmail.Users.Messages.batchDelete({
    ids
  }, 'me');

  return ids;
}

Немного добавлю:

  1. Разбил на две функции, как принято в языке - точка входа и параметризированный функционал
  2. Программа позволяет удалять сообщения из тредов. Например, пришло сообщение без вложения и в этот же тред, тут же, попало сообщение с вложением. Первое будет удалено.
→ Ссылка