Подсчет меток группы по месяцам с использованием скрипта приложений Gmail - PullRequest
0 голосов
/ 13 апреля 2019

Впервые в Google Apps скрипт / JavaScript.

Я пытаюсь сгруппировать результаты следующего кода по месяцам, чтобы использовать данные в качестве элемента диаграммы, что будет лучшим способом сделать это:

function listLabels(labelcount) {
  var response = Gmail.Users.Labels.list('me');
  if (response.labels.length == 0) {
    Logger.log('No labels found.');
  } else {
    Logger.log('Labels:');
    for (var i = 0; i < response.labels.length; i++) {
      var label = response.labels[i];

      // Use the label name to get the messages that match this label
      var label_messages = Gmail.Users.Messages.list('me', {
        'labelIds': [label.id]
      });

      Logger.log('%s = %s', label.name, label_messages.resultSizeEstimate);
    }
  }
}

1 Ответ

2 голосов
/ 15 апреля 2019

Распределение этикеток по месяцам

Эта функция собирает количество сообщений с данным ярлыком на ярлык в месяц и за все месяцы, не считая лет. Хотя вы можете легко изменить его, чтобы отфильтровать нежелательные годы.

Он выводит данные в активную электронную таблицу после очистки при каждом запуске. Для удобства я поместил данные в месячный массив и отобразил их, используя метод join (), если вы хотите расширить их, вы можете легко сделать это, разделив столбец, и я включил столбец над ним, который содержит первую букву соответствующего месяца.

function listLabels() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var response = Gmail.Users.Labels.list('me');
  var msA=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
  var miA=['J','F','M','A','M','J','J','A','S','O','N','D']
  var mA=[0,0,0,0,0,0,0,0,0,0,0,0];
  if (response.labels.length) {
    sh.clearContents();
    sh.appendRow(['Label Name','Monthly Distribution'])
    sh.appendRow(['',miA.join(',')])
    for (var i = 0; i < response.labels.length; i++) {
      var label=response.labels[i];
      var label_messages = Gmail.Users.Messages.list('me', {'labelIds': [label.id]});
      var msgs=label_messages.messages;
      if(msgs) {
        var lA=[0,0,0,0,0,0,0,0,0,0,0,0];
        for(var j=0;j<msgs.length;j++) {
          var m=GmailApp.getMessageById(msgs[j].id).getDate().getMonth();
          mA[m]+=1;
          lA[m]+=1;
        }
        sh.appendRow([label.name,lA.join(',')])
      }
    }
    sh.appendRow(['***********************']);
    sh.appendRow(['***********************']);
    sh.appendRow(['Month','Total Count']);
    for(var i=0;i<12;i++) {
      sh.appendRow([msA[i],mA[i]]);
    }
  }
}

Вот так выглядит вывод.

enter image description here

Я обрезал отдельные ярлыки, потому что не хотел делиться своей личной информацией.

Распределение этикеток по годам и месяцам

function listLabelsIncludingYears() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var response = Gmail.Users.Labels.list('me');
  var msA=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
  var miA=['J','F','M','A','M','J','J','A','S','O','N','D']
  var mA=[0,0,0,0,0,0,0,0,0,0,0,0];
  var yObj={yA:[]};
  if (response.labels.length) {
    sh.clearContents();
    sh.appendRow(['Label Name','Year','Monthly Distribution'])
    sh.appendRow(['','',miA.join(',')])
    for (var i = 0; i < response.labels.length; i++) {
      var label=response.labels[i];
      var label_messages = Gmail.Users.Messages.list('me', {'labelIds': [label.id]});
      var msgs=label_messages.messages;
      if(msgs) {
        var lA=[0,0,0,0,0,0,0,0,0,0,0,0];
        for(var j=0;j<msgs.length;j++) {
          var m=GmailApp.getMessageById(msgs[j].id).getDate().getMonth();
          var y=GmailApp.getMessageById(msgs[j].id).getDate().getFullYear();
          if(yObj.hasOwnProperty(y)) {
            yObj[y][m]+=1;
          }else{
            yObj[y]=[0,0,0,0,0,0,0,0,0,0,0,0,0];
            yObj.yA.push(y);
            yObj[y][m]+=1;
          }
          lA[m]+=1;
        }
        sh.appendRow([label.name,y,lA.join(',')]);
      }
    }
    SpreadsheetApp.flush();
    sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn()).sort({column:2,ascending:true});
    sh.getRange(2,3,sh.getLastRow()-1,1).splitTextToColumns(',');
    sh.autoResizeColumns(1,sh.getLastColumn())
    SpreadsheetApp.flush();
    sh.appendRow(['***********************']);
    sh.appendRow(['***********************']);
    sh.appendRow(['Year','Month','Total Count']);
    yObj.yA.sort();
    for(var k=0;k<yObj.yA.length;k++) {
      for(var i=0;i<12;i++) {
        sh.appendRow([yObj.yA[k],msA[i],yObj[y][i]]);
      }
    }
  }
}

Я также добавил автоматическую сортировку, разделение текста на столбцы и изменение размера.

Добавлена ​​поддержка токена страницы

Я добавил поддержку Pagetoken по запросу другого пользователя.

function listLabelsIncludingYears() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var response = Gmail.Users.Labels.list('me');
  var msA=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
  var miA=['J','F','M','A','M','J','J','A','S','O','N','D']
  var mA=[0,0,0,0,0,0,0,0,0,0,0,0];
  var yObj={yA:[]};
  if (response.labels.length) {
    sh.clearContents();
    sh.appendRow(['Label Name','Year','Monthly Distribution'])
    sh.appendRow(['','',miA.join(',')])
    for (var i = 0; i < response.labels.length; i++) {
      var label=response.labels[i];
      var label_messages = Gmail.Users.Messages.list('me', {'labelIds': [label.id]});
      var pagetoken='';
      do{
        var msgs=label_messages.messages;
        if(msgs) {
          var lA=[0,0,0,0,0,0,0,0,0,0,0,0];
          for(var j=0;j<msgs.length;j++) {
            var m=GmailApp.getMessageById(msgs[j].id).getDate().getMonth();
            var y=GmailApp.getMessageById(msgs[j].id).getDate().getFullYear();
            if(yObj.hasOwnProperty(y)) {
              yObj[y][m]+=1;
            }else{
              yObj[y]=[0,0,0,0,0,0,0,0,0,0,0,0,0];
              yObj.yA.push(y);
              yObj[y][m]+=1;
            }
            lA[m]+=1;
          }
          sh.appendRow([label.name,y,lA.join(',')]);
        }
        pagetoken=label_messages.nextPageToken;  
      }while(pagetoken!='');
    }
    SpreadsheetApp.flush();
    sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn()).sort({column:2,ascending:true});
    sh.getRange(2,3,sh.getLastRow()-1,1).splitTextToColumns(',');
    sh.autoResizeColumns(1,sh.getLastColumn())
    SpreadsheetApp.flush();
    sh.appendRow(['***********************']);
    sh.appendRow(['***********************']);
    sh.appendRow(['Year','Month','Total Count']);
    yObj.yA.sort();
    for(var k=0;k<yObj.yA.length;k++) {
      for(var i=0;i<12;i++) {
        sh.appendRow([yObj.yA[k],msA[i],yObj[y][i]]);
      }
    }
  }
}

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

...