Страница 1 из 3

Макросы для подсчета письмодней

Добавлено: Ср фев 13, 2019 8:37 pm
Максим Дорофеев
Концепция письмодней рассказывается вот в этом видео:


Вот макрос для Outlook:

Код: Выделить всё

Attribute VB_Name = "CountMailDays"
Const Multiplier = 1000

Sub CountEmailDays()

    Dim objOutlook As Object, objnSpace As Object, objFolder As MAPIFolder
    Dim EmailCount As Integer
    Set objOutlook = CreateObject("Outlook.Application")
    Set objnSpace = objOutlook.GetNamespace("MAPI")

    On Error Resume Next
    
    'Get active folder
    Set objFolder = Application.ActiveExplorer.CurrentFolder
    
    If Err.Number <> 0 Then
        Err.Clear
        MsgBox "No such folder."
        Exit Sub
    End If

    EmailCount = objFolder.Items.Count

    Dim emailDays, delta As Long
    Dim myItems As Outlook.Items
    Dim msg As String
    
    Set myItems = objFolder.Items
    myItems.SetColumns ("ReceivedTime")
    
    ' Determine date of each message:
    emailDays = 0
    For Each myItem In myItems
	delta = Multiplier * (Now - myItem.ReceivedTime)
        emailDays = emailDays + delta
    Next myItem

    ' Output results:
    MsgBox objFolder.FullFolderPath & ":" & vbCrLf & vbCrLf & emailDays / Multiplier & " письмодней инбокса, всего " & EmailCount & " писем."

    Set objFolder = Nothing
    Set objnSpace = Nothing
    Set objOutlook = Nothing
End Sub
Вот версия для GMail, появившаяся на свет благодаря одному хорошему человеку:
(оригинал здесь)

Код: Выделить всё

function unreadEmailReport() {
  //Переменная для сбора входящих
  var threads = GmailApp.getInboxThreads();
  
  //Проверка наличия непрочитанных писем
  if(GmailApp.getInboxUnreadCount()>0){
    
    //Переменные для сбора информации о письмах
    var messages = threads[0].getMessages();
    var senderEmail = messages[0].getFrom();
    
    //Задаем адрес назначения для отправки собранной статистики
    var emailAddress = "хх@хх.хх" ;
    
    //Переменные для получения текущего времени
    var datenow = new Date;
    var currentTime = datenow.toTimeString();
  
    //Переменную, где будет храниться собираемая информация
    var Content = ContentService.createTextOutput();
  
    //переменные письмодней
    var emailDays = 0;
    var delta = 0;
    var Multiplier = 86400000; //количество миллисекунд в сутках, т.к. скрипт обрабатывает даты в мс и результат, тоже в мс
    var messageTime;
  
    //Обработка папки "Входящие"
    for (var i = 0; i < threads.length; i++) {
        messages = threads[i].getMessages();
        senderEmail = messages[0].getFrom();
        messageTime = messages[0].getDate();
      
        //Считаем письмодни
        delta = (datenow - messageTime)/Multiplier;
        emailDays = emailDays + delta;
      
        Content.append(i + ".  " + threads[i].getFirstMessageSubject() + "    от:" + senderEmail + '\n');
      } 
    
   Content.append("Итого письмодней: " + emailDays.toFixed(4) + '\n');
    
   //Отправка самого письма
   GmailApp.sendEmail(emailAddress,"Тема письма " + currentTime, Content.getContent());
  }
}


Есть еще одна версия для GMail от Рашита Азизбаева

А еще @VPetukhov написал для этого дела аддон для Thunderbird:
https://github.com/VPetukhov/MailDayExtension

А вот отзывы и развитие идеи:

Re: Макросы для подсчета письмодней

Добавлено: Ср фев 13, 2019 10:01 pm
Lomelind
1. А как сделать, чтобы макрос для Gmail работал? Куда его нужно воткнуть?

2. и как его допилить, если я хочу не только папку входящие, а ещё некоторые конкретные папки (мммм... кажется оно "ярлыки" называется) (но не все) задать?

Re: Макросы для подсчета письмодней

Добавлено: Ср фев 13, 2019 11:54 pm
Рашит Азизбаев
Lomelind писал(а):
Ср фев 13, 2019 10:01 pm
1. А как сделать, чтобы макрос для Gmail работал? Куда его нужно воткнуть?
https://developers.google.com/apps-scri ... s_manually - так можно настроить триггер (ежедневный к примеру)
В целом, скрипты надо втыкать в https://script.google.com (через New script)

Re: Макросы для подсчета письмодней

Добавлено: Чт фев 14, 2019 12:07 am
Рашит Азизбаев
Lomelind писал(а):
Ср фев 13, 2019 10:01 pm
2. и как его допилить, если я хочу не только папку входящие, а ещё некоторые конкретные папки (мммм... кажется оно "ярлыки" называется) (но не все) задать?
Я там накидал комментариев в скрипте про то, как добавить еще папок-лейблов

Re: Макросы для подсчета письмодней

Добавлено: Чт фев 14, 2019 5:57 am
Lomelind
Вроде повтыкала всё куда надо - но что-то явно не так пошло.

Во первых, всего 7 письмодней получилось - при том что в списке нужных ярлыков есть такой (!!Инкубатор), где у меня сотня писем маринуется, и среди них есть вообще прошлогодние.
Во вторых, при ритуальном удалении одного прошлогоднего письма число письмодней не уменьшилось, а подросло на 0.007

Вот такое получилось в том блоке куда втыкать надо
остальное не трогала, только подставила ид гуглотаблицы

var threads = GmailApp.getInboxThreads();
//Добавляем еще других лейблов
//threads.push.apply(GmailApp.getUserLabelByName("имя_лейбла").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("!!Инкубатор").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("жж").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/Киев").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/магазины").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/обучение").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/Петиции").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("соцсети").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("Фриланс").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("Шаттер").getThreads());

Re: Макросы для подсчета письмодней

Добавлено: Чт фев 14, 2019 5:58 am
Lomelind
А вот стоило убрать одно письмо из входящих, как письмодней уже стало 6,9
т.е. получается что именно ярлыки не подтянулись

Re: Макросы для подсчета письмодней

Добавлено: Чт фев 14, 2019 9:26 am
Рашит Азизбаев
Lomelind писал(а):
Чт фев 14, 2019 5:57 am
Вроде повтыкала всё куда надо - но что-то явно не так пошло.

Во первых, всего 7 письмодней получилось - при том что в списке нужных ярлыков есть такой (!!Инкубатор), где у меня сотня писем маринуется, и среди них есть вообще прошлогодние.
Во вторых, при ритуальном удалении одного прошлогоднего письма число письмодней не уменьшилось, а подросло на 0.007

Вот такое получилось в том блоке куда втыкать надо
остальное не трогала, только подставила ид гуглотаблицы

var threads = GmailApp.getInboxThreads();
//Добавляем еще других лейблов
//threads.push.apply(GmailApp.getUserLabelByName("имя_лейбла").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("!!Инкубатор").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("жж").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/Киев").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/магазины").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/обучение").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("рассылки/Петиции").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("соцсети").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("Фриланс").getThreads());
threads.push.apply(GmailApp.getUserLabelByName("Шаттер").getThreads());
Да, там была ошибочка, поправил, заодно исправил, чтобы не было проблем, если больше 500 тредов получается

Re: Макросы для подсчета письмодней

Добавлено: Чт фев 14, 2019 5:47 pm
Lomelind
о, теперь в письмодни верю

зато заметила другой глюк (который и вчера был)
разве сегодня 4.1.2019?

Re: Макросы для подсчета письмодней

Добавлено: Пт фев 15, 2019 1:46 am
Lomelind
Не дождавшись ответа, полезла гуглить.
обрела https://www.toptal.com/software/definit ... nipulation

С месяцем точно косяк: январь - это 0, а не 1 месяц!
так что там ещё единица нужна:)
в своём скрипте добавила

С днём интереснее
вместо getday там надо getdate
тогда работает правильно

итого, последняя строчка sheet.appendRow([now.getDate() + '.' + (now.getMonth()+1) + '.' + now.getFullYear(), maildays]);

Re: Макросы для подсчета письмодней

Добавлено: Пт фев 15, 2019 9:34 pm
Laisan
Большое спасибо за макросы для Gmail!

Кстати, на всякий случай - они подсчитывают разными методиками, так что данные двух макросов друг с другом сравнивать нельзя.