【问题标题】:Counting emails in gmail in google sheets在 google 表格中计算 gmail 中的电子邮件
【发布时间】:2021-06-16 20:10:18
【问题描述】:

也许这是一个基本问题,但我可以找到答案。如何对收到的带有特定标签的信件进行自动计数。也就是说,我想发布一个触发器,以便每天早上 1 点到 2 点,都会计算昨天的信件。所以它每天都会填满。示例文件:

https://docs.google.com/spreadsheets/d/1jqtHVwab5qqhGgfpFt4J5uQraZU0BIzD2B6mNT9mX0w/edit

【问题讨论】:

  • 你能提供一份用英文写的样本表吗?请指出您希望在哪里添加电子邮件计数?此外,您能否确认您希望在执行脚本前 24 小时内获得带有特定标签的电子邮件计数?例如,您今天 06/17/2021 1:00 运行它,那么将计算的电子邮件将从 06/16/2021 1:00 到 06/17/2021 12:59?
  • 你好。在工作表上添加了英文标题。我想在 21 年 6 月 17 日 01:00 计算在 21 年 6 月 16 日 00:00 到 23:59 之间有多少带有特定标签的邮件。

标签: email google-apps-script google-sheets gmail


【解决方案1】:

您可以使用此示例代码(只需替换label):

function countEmailyesterday(){

  const secondsSinceEpoch = (date) => Math.floor(date.getTime() / 1000);
  const after = new Date();
  const before = new Date();


  //Subtract 1 day 
  after.setDate(after.getDate()-1);
  before.setDate(before.getDate()-1);

  //Get -1 day  date string
  var timezone = Session.getScriptTimeZone();
  var todayStr = Utilities.formatDate(after,timezone,"dd.MM.yyyy");
  Logger.log(todayStr);

  //Set time to 00:00 and 23:59
  after.setHours(00, 00, 0, 0);
  before.setHours(23, 59, 0, 0);
  
  //Label
  const label = "Гимнастика Диана";
  const query = `label:${label} after:${secondsSinceEpoch(after)} before:${secondsSinceEpoch(before)}`;
  Logger.log(query);

  var threads = GmailApp.search(query);
  var count = threads.length;
  Logger.log(count);

  //Find the matching date's row and write the email count in column B
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Monitor');
  var dateValues = sheet.getRange('A1:A').getDisplayValues().flat();
  Logger.log(dateValues);
  //find matched index
  var index = dateValues.indexOf(todayStr);
  if(index!=-1){
    Logger.log(index);
    sheet.getRange(index+1,2).setValue(count);
  }
}

它有什么作用?

  1. 根据今天的日期创建 beforeafter 日期对象。
  2. dd-MM-yyyy这种格式创建今天的日期字符串
  3. 从每个日期对象中减去 1 天。然后将before 的时间设置为23:59:00after 设置为00:00:00
  4. 使用Gmail search operators label:(your label) after:(Epoch datetime) before:(Epoch datetime) 创建一个gmail 查询字符串
  5. 使用GmailApp.search(query) 将返回GmailThread 的数组
  6. 获取数组的长度。
  7. 使用Range.getDisplayValues() 将A 列中的日期值作为字符串获取。使用array.flat() 将日期值更改为一维数组
  8. 使用array.indexOf()查找今天匹配日期的数组索引
  9. 使用数组索引(添加 +1 偏移量,因为数组是从零开始的)作为 Sheet.getRange(row,col) 中的行索引,并根据电子邮件计数设置 B 列值。

输出:

附加参考:

【讨论】:

  • 非常感谢您。是的,这就是我需要的。另一个问题是如何让脚本本身填充这些相对于日期的行。也就是说,我可以触发它,但是脚本如何理解必须在单元格 B18 中输入 06/21/17 的带有“正在收集”标签的字母数量?
  • 我更新了答案。如果您遇到问题,请告诉我。
  • 顺便说一句,如果我们回答了您的问题,请点击接受按钮。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。如果您无法使用接受按钮,请随时告诉我。 How to accept answer
  • 是的,我遇到了一个小问题。将字母的数量放在当前日期的列中,尽管它应该放在之前。天。 yadi.sk/i/UujEuyWIr7QPHg" width = "100" height = "100"> 还有一个问题,在我的脚本文件“Sent in a telegram”中,如果 B 列中有数据,它会发送一条消息:B,并且是可以添加一个条件,以便在发送消息时,汇总“已发送订单”列中的字母数,如果 B 列:B 为空? yadi.sk/i/CPxPPPhBdEtzWA" 宽度 = "200" 高度 = "100">
  • 对不起。我更新了答案。电子邮件计数将记录在昨天的日期。关于你的第二个问题,我没有完全理解你的问题?您想使用应用程序脚本获取 B 列的总和吗?
【解决方案2】:

这对我有用:

function countemailwithalabel() {
   const ts = GmailApp.search('label: qs-services-ups');
   let msgs = 0;
   ts.forEach(t => msgs+=t.getMessageCount());
   Logger.log(msgs);//6
}

【讨论】:

  • 看起来像我需要的,谢谢。以及如何在此代码中添加精确过滤昨天并按标签名称搜索的功能,如 1 行?
  • 我不会有任何线索,因为我对您的数据一无所知,而且我不关注非现场资源的链接。发布问题中需要的内容或在没有帮助的情况下生活。
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2011-04-02
  • 2014-10-26
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多