使用时间戳过滤 gmail
Filter gmails using timestamp
我是 Google Apps 脚本的新手;想问一下我的方向是否正确,以及如何在脚本中操纵时间。
我正在努力尝试在 Google 应用程序脚本中操纵时间值,基本上我能够提取每封发送的电子邮件的时间戳,但我只想粘贴到电子表格电子邮件信息中最近的,例如在脚本 运行 时间后的 30 分钟内。这是为了避免提取重复信息。
不确定这里是否有 currentTime() 函数,或者我必须创建一个新的 Date() 对象并从那里进行一些计算。尝试了一些变体,但似乎没有任何效果。
如果您能帮助我们朝着正确的方向前进,我们将不胜感激!谢谢!
function getDetails(){
var DEST_URL = "SHEET_URL"; //redacted for sensitivity
var DEST_SHEETNAME = "Test";
var destss = SpreadsheetApp.openByUrl(DEST_URL);
var destSheet = destss.getSheetByName(DEST_SHEETNAME);
var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity
for(var i = 0; i < threads.length; i++){
var messages=threads[i].getMessages();
for(var j =0; j < 1; j++){ //only take first message in thread
var message = messages[j];
var subject = message.getSubject() ;
var sentTimeStamp = message.getDate();
if(sentTimeStamp is within last 30minutes as of script run time){ //this is where i need help
var delimitString = subject.split("is sent");
var detailName = delimitString[0];
var lastRow = destSheet.getLastRow();
destSheet.getRange(lastRow + 1,1).setValue(detailName);
destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
}
}
}
}
可以将timeStamp
换算成ms秒,然后与“30秒前”的值进行比较
样本:
var sentTimeStamp = message.getDate();
var now = new Date();
var ThirtyMinutesAgo = now-30*60*1000;
if(sentTimeStamp.getTime() < ThirtyMinutesAgo){
...
}
参考文献:
另一个想法是查询您最近 30 分钟收到的电子邮件。
解释:
您可以在 GmailApp.search
函数中查询最近 30 分钟前收到的电子邮件。请参阅此 link 以了解您可以使用哪些过滤器。
这将获取您在过去 30 分钟内收到的带有关键字“FILTERS”的最后一封电子邮件。
var ThirtyMinutesAgo = new Date();
ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
const threads = GmailApp.search(queryString); // threads the last 30 minutes
这种方法更有效有两个原因:
使用 for
循环迭代的数据(线程)较少。
您不需要在每个线程上应用和 if
语句。
解法:
function getDetails(){
var DEST_URL = "SHEET_URL"; //redacted for sensitivity
var DEST_SHEETNAME = "Test";
var destss = SpreadsheetApp.openByUrl(DEST_URL);
var destSheet = destss.getSheetByName(DEST_SHEETNAME);
// var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity
// new code
var ThirtyMinutesAgo = new Date();
ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
const threads = GmailApp.search(queryString); // threads the last 30 minutes
//
for(var i = 0; i < threads.length; i++){
var messages=threads[i].getMessages();
for(var j =0; j < 1; j++){ //only take first message in thread
var message = messages[j];
var subject = message.getSubject() ;
var sentTimeStamp = message.getDate();
var delimitString = subject.split("is sent");
var detailName = delimitString[0];
var lastRow = destSheet.getLastRow();
destSheet.getRange(lastRow + 1,1).setValue(detailName);
destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
}
}
}
}
我是 Google Apps 脚本的新手;想问一下我的方向是否正确,以及如何在脚本中操纵时间。
我正在努力尝试在 Google 应用程序脚本中操纵时间值,基本上我能够提取每封发送的电子邮件的时间戳,但我只想粘贴到电子表格电子邮件信息中最近的,例如在脚本 运行 时间后的 30 分钟内。这是为了避免提取重复信息。
不确定这里是否有 currentTime() 函数,或者我必须创建一个新的 Date() 对象并从那里进行一些计算。尝试了一些变体,但似乎没有任何效果。
如果您能帮助我们朝着正确的方向前进,我们将不胜感激!谢谢!
function getDetails(){
var DEST_URL = "SHEET_URL"; //redacted for sensitivity
var DEST_SHEETNAME = "Test";
var destss = SpreadsheetApp.openByUrl(DEST_URL);
var destSheet = destss.getSheetByName(DEST_SHEETNAME);
var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity
for(var i = 0; i < threads.length; i++){
var messages=threads[i].getMessages();
for(var j =0; j < 1; j++){ //only take first message in thread
var message = messages[j];
var subject = message.getSubject() ;
var sentTimeStamp = message.getDate();
if(sentTimeStamp is within last 30minutes as of script run time){ //this is where i need help
var delimitString = subject.split("is sent");
var detailName = delimitString[0];
var lastRow = destSheet.getLastRow();
destSheet.getRange(lastRow + 1,1).setValue(detailName);
destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
}
}
}
}
可以将timeStamp
换算成ms秒,然后与“30秒前”的值进行比较
样本:
var sentTimeStamp = message.getDate();
var now = new Date();
var ThirtyMinutesAgo = now-30*60*1000;
if(sentTimeStamp.getTime() < ThirtyMinutesAgo){
...
}
参考文献:
另一个想法是查询您最近 30 分钟收到的电子邮件。
解释:
您可以在 GmailApp.search
函数中查询最近 30 分钟前收到的电子邮件。请参阅此 link 以了解您可以使用哪些过滤器。
这将获取您在过去 30 分钟内收到的带有关键字“FILTERS”的最后一封电子邮件。
var ThirtyMinutesAgo = new Date();
ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
const threads = GmailApp.search(queryString); // threads the last 30 minutes
这种方法更有效有两个原因:
使用
for
循环迭代的数据(线程)较少。您不需要在每个线程上应用和
if
语句。
解法:
function getDetails(){
var DEST_URL = "SHEET_URL"; //redacted for sensitivity
var DEST_SHEETNAME = "Test";
var destss = SpreadsheetApp.openByUrl(DEST_URL);
var destSheet = destss.getSheetByName(DEST_SHEETNAME);
// var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity
// new code
var ThirtyMinutesAgo = new Date();
ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
const threads = GmailApp.search(queryString); // threads the last 30 minutes
//
for(var i = 0; i < threads.length; i++){
var messages=threads[i].getMessages();
for(var j =0; j < 1; j++){ //only take first message in thread
var message = messages[j];
var subject = message.getSubject() ;
var sentTimeStamp = message.getDate();
var delimitString = subject.split("is sent");
var detailName = delimitString[0];
var lastRow = destSheet.getLastRow();
destSheet.getRange(lastRow + 1,1).setValue(detailName);
destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
}
}
}
}