【问题标题】:Group label counts by month using Gmail apps script使用 Gmail 应用脚本按月分组标签计数
【发布时间】:2019-09-04 04:57:49
【问题描述】:

谷歌应用脚​​本/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);
    }
  }
}

【问题讨论】:

  • 请问您要检索的数据的起始年份和月份?

标签: javascript date google-apps-script grouping gmail-api


【解决方案1】:

标签在几个月内的分布

此功能每月收集每个标签的给定标签的消息数量,并且不考虑年份的所有月份。不过,您可以轻松修改它以过滤掉不需要的年份。

它在每次运行时清除活动电子表格后将数据转储到活动电子表格中。为方便起见,我将数据放入每月数组中,并使用 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]]);
    }
  }
}

这是输出的样子。

我截断了各个标签,因为我不想分享我的私人信息。

标签的年月分布

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]]);
      }
    }
  }
}

注意:页面令牌支持尚未经过测试,因为我删除了大部分电子邮件,因此我永远不会触发需求。

【讨论】:

  • 难以置信!谢谢! - 仅供阅读此文的任何人参考,为了工作,您需要在 Apps 脚本的资源部分打开 Gmail API。资源 > 高级 Google 服务 > 打开 Gmail API
  • 另外,您将如何修改为按年细分?谢谢
  • 所以我也是谷歌脚本的新手,这完全符合我的期望和我正在尝试做的事情,但是我有几个带有大量电子邮件的标签,这只是计算它们到 100。可以在其中添加一个循环以超出此计数吗?例如,我有一个标签,其中包含 2019 年 6 月以来的 379 封电子邮件,而这仅表示标签中有 100 封。谢谢。
  • @Derek 试一试最后一个版本。它可能需要一些调试,但你必须自己做,因为我不保留很多电子邮件。
  • @Cooper 非常感谢,稍后我会在这里运行它。我通常会删除我的电子邮件,但有些标签的数量非常大——每天有 100 封。再次感谢您!
猜你喜欢
  • 2023-04-03
  • 2022-09-23
  • 2017-07-26
  • 2020-02-08
  • 2019-06-06
  • 2017-02-05
  • 2015-12-08
  • 2015-02-06
  • 2019-04-24
相关资源
最近更新 更多