问题描述
也许这是一个基本问题,但我可以找到答案。如何使用特定标签对收到的信件进行自动计数。也就是说,我想发布一个触发器,以便每天早上 01-02 点,都会计算昨天的字母。所以它每天都会填满。示例文件:
https://docs.google.com/spreadsheets/d/1jqtHVwab5qqhGgfpFt4J5uQraZU0BIzD2B6mNT9mX0w/edit
解决方法
这对我有用:
function countemailwithalabel() {
const ts = GmailApp.search('label: qs-services-ups');
let msgs = 0;
ts.forEach(t => msgs+=t.getMessageCount());
Logger.log(msgs);//6
}
,
您可以使用此示例代码(只需替换 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);
before.setHours(23,59,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);
}
}
它有什么作用?
- 根据今天的日期创建一个
before
和after
日期对象。 - 以这种格式创建今天的日期字符串
dd-MM-yyyy
- 从每个日期对象中减去 1 天。然后将
before
的时间设置为23:59:00
而将after
的时间设置为00:00:00
- 使用 Gmail search operators
label:(your label) after:(Epoch datetime) before:(Epoch datetime)
创建 Gmail 查询字符串
- 使用 GmailApp.search(query) 将返回一个 GmailThread 数组
- 获取数组的长度。
- 使用
Range.getDisplayValues()
以字符串形式获取 A 列中的日期值。使用array.flat()
将日期值更改为一维数组 - 使用
array.indexOf()
查找今天匹配日期的数组索引 - 使用数组索引(添加 +1 偏移量,因为数组是从零开始的)作为
Sheet.getRange(row,col)
中的行索引,并根据电子邮件计数设置 B 列值。