Извлечение потоков электронной почты из ярлыков Gmail в Google Sheet

Продолжение моего предыдущего поста Извлечение писем из ярлыка Gmail в Google Sheet

Я пытаюсь извлечь электронные письма с одной метки Gmail на лист Google, используя Google App Script, данные в листе Google должны иметь метку времени, из электронной почты, в электронную почту, тему и тело электронной почты, сценарий ниже кредитует @Cooper

Приведенный ниже сценарий работает, и я могу извлечь 527 электронных писем из ярлыка Gmail, но я не могу извлечь все электронные письма из этого ярлыка, поскольку у меня в нем около 5000+ электронных писем. Может ли Google Appscript сделать это за один раз?

function ExtractingEmails(query = "Label:Test") {
  let o = [["TimeStamp", "From", "To", "Subject", "Body"]];
  const ts = GmailApp.search(query);
  ts.forEach(t => {
    let ms = t.getMessages();
    ms.forEach(m => {
      o.push([m.getDate(), m.getFrom(), m.getTo(), m.getSubject(), m.getPlainBody()])
    })
  })
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet0");
  if (o && o.length > 1) {
    sh.clearContents();
    sh.getRange(1, 1, o.length, o[0].length).setValues(o);
    ss.toast(`${o.length - 1} messages found for Query: ${query}`)
  } else {
    ss.toast(`No messages found for Query: ${query}`)
  }
}

Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять extract all emails from the label approximately 5000 emails. В вашем вопросе вы хотите получить электронные письма с 5000 ярлыков? Или вы хотите получить 5000 писем с одного ярлыка? Кстати, в вашей ситуации вы можете предоставить сообщение об ошибке?

Tanaike 11.11.2022 07:05

Привет @Tanaike Мне нужно получить около 5000+ писем с одного ярлыка. Извините за мою плохую английскую грамматику, я отредактировал свой пост, чтобы исправить это.

Maximus 11.11.2022 07:22

Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. Если в вашем скрипте возникает ошибка, можете ли вы предоставить сообщение об ошибке?

Tanaike 11.11.2022 07:43

@Tanaike Предоставленный скрипт хорошо работает для извлечения до 527 электронных писем на лист Google, но я не могу понять, как получить все 5000+ электронных писем на лист Google, текущий скрипт после извлечения 527 электронных писем выдает сообщение об ошибке [Исключение: невозможно вызвать SpreadsheetApp.showNotification() из этого контекста]

Maximus 11.11.2022 07:52

Спасибо за ответ. Что касается вашего сообщения об ошибке [Exception: Cannot call SpreadsheetApp.showNotification() from this context], к сожалению, я не могу понять связь между вашим сообщением об ошибке и вашим сценарием показа. Могу я спросить вас о деталях этого?

Tanaike 11.11.2022 07:58

@Tanaike Какие детали вам потребуются?

Maximus 11.11.2022 08:26

Если вы вызываете свою функцию непосредственно из редактора сценариев приложений, я предлагаю вам заменить ss.toast на console.info, чтобы вы видели журналы на том месте, где вы находитесь. Вы на 100 % уверены, что у вас более 500 писем с этим ярлыком?

ValLeNain 11.11.2022 08:29

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

Tanaike 11.11.2022 12:11
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в документации для GmailApp.search, это не работает, когда нужно получить много потоков.

Поэтому вам нужно перебирать их, пока с вариантом search больше не останется.

Адаптация вашей функции, что бы сделать

function ExtractingEmails(query = "Label:Test") {
  let o = [["TimeStamp", "From", "To", "Subject", "Body"]];
  const PAGE_SIZE = 500;
  let index = 0;
  console.info(`Getting threads from ${index} to ${index + PAGE_SIZE}`)
  let ts = GmailApp.search(query, index, PAGE_SIZE);
  while(ts.length > 0) {
    console.info(`Retrieved ${ts.length} threads`)
    ts.forEach(t => {
      let ms = t.getMessages();
      ms.forEach(m => {
        o.push([m.getDate(), m.getFrom(), m.getTo(), m.getSubject(), m.getPlainBody()])
      })
    })
    index += PAGE_SIZE
    console.info(`Getting threads from ${index} to ${index + PAGE_SIZE}`)
    ts = GmailApp.search(query, index, PAGE_SIZE);
  }
  
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet0");
  if (o && o.length > 1) {
    sh.clearContents();
    sh.getRange(1, 1, o.length, o[0].length).setValues(o);
    console.info(`${o.length - 1} messages found for Query: ${query}`)
  } else {
    console.info(`No messages found for Query: ${query}`)
  }
}

Это сработало!!!! он извлек все 5000+ электронных писем, спасибо

Maximus 12.11.2022 14:08

Другие вопросы по теме