统计 google 张 gmail 中的电子邮件
Counting emails in gmail in google sheets
也许这是一个基本问题,但我可以找到答案。如何自动计算收到的带有特定标签的信件。也就是说,我想 post 一个触发器,这样每天早上 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, 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);
}
}
它有什么作用?
- 根据今天的日期创建
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) which will return an array of GmailThread
- 获取数组的长度。
- 使用
Range.getDisplayValues()
将 A 列中的日期值作为字符串获取。使用 array.flat()
将日期值更改为一维数组
- 用
array.indexOf()
求今天匹配日期的数组索引
- 使用数组索引(添加 +1 偏移量,因为数组是从零开始的)作为
Sheet.getRange(row,col)
中的行索引,并根据电子邮件计数设置列 B 值。
输出:
附加参考:
也许这是一个基本问题,但我可以找到答案。如何自动计算收到的带有特定标签的信件。也就是说,我想 post 一个触发器,这样每天早上 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, 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);
}
}
它有什么作用?
- 根据今天的日期创建
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) which will return an array of GmailThread
- 获取数组的长度。
- 使用
Range.getDisplayValues()
将 A 列中的日期值作为字符串获取。使用array.flat()
将日期值更改为一维数组 - 用
array.indexOf()
求今天匹配日期的数组索引 - 使用数组索引(添加 +1 偏移量,因为数组是从零开始的)作为
Sheet.getRange(row,col)
中的行索引,并根据电子邮件计数设置列 B 值。