- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我每 6 小时收到一封电子邮件,正文中包含每小时日志,我想将每个每小时日志放入同一个电子表格中,这样我就可以长时间快速扫描一小时又一小时。我还收到随机的“警报”电子邮件,我想将其添加到该电子表格中。我做了什么:当收到这些电子邮件时,我会在我的工作 gmail 帐户中应用两个过滤器之一。一个用于警报,一个用于日志。过滤器存档并向电子邮件添加两个标签之一。我在我的团队驱动器中保存了一个电子表格,其中嵌入了几个脚本。一个脚本每分钟运行一次,查找带有警报标签的电子邮件。另一个脚本每 6 小时运行一次,查找带有日志标签的电子邮件。这两个脚本都会获取任何找到的电子邮件,对其进行处理,删除标签并添加“已处理”标签。
问题:两个脚本似乎随机处理电子邮件 2 到 4 次。当我手动运行它们时,它们从不这样做。
问题:为什么会这样?
(编辑):我认为它的行为方式是因为当收到一封新电子邮件时,它与过滤器匹配并将标签应用于整个线程,然后导致脚本处理整个线程,而不仅仅是最新的电子邮件。
新问题:如何在不删除旧电子邮件的情况下停止此操作?
我的问题与这个不同: Google apps script Gmail get message without previous conversation在那个问题中,他们谈论的是当前消息正文中先前消息的正文。在我的,没有重复。每封电子邮件都是全新的所有以前的邮件,不包括以前的邮件的任何部分。它们都具有相同的发件人、主题和标签。
这是我的代码:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName ="Current Month";
var s = ss.getSheetByName(sheetName);
var myLabel = "tower123";
var newLabel = "Processed";
var regExp = new RegExp(/(Snapshot taken[\S\s]*?Probe: \d+ \*F)/gmi);
var keys = ["Snapshot taken at: ","Meters: Power Output","Status: Generator ",": ATS to ",": Tower Lights ","Chassis Temperature: ","Temperature: Rack Probe: "];
function myFunction() {
var label = GmailApp.getUserLabelByName(myLabel);
var label2 = GmailApp.getUserLabelByName(newLabel);
var threads = label.getThreads();
// get all the email threads matching myLabel
for (var i = 0; i < threads.length; i++) {
var messages = GmailApp.getMessagesForThread(threads[i]);
// move thread from label to label2
label2.addToThread(threads[i]);
label.removeFromThread(threads[i]);
// get each individual email from the threads
for (var j = 0; j < messages.length; j++) {
var bodyText = messages[j].getPlainBody();
//"move thread" code was here before the noon 2/16 email, moved above for the noon email. email threads were still processed when they shouldn't have been
// split the email body into individual "paragraph" strings based on the regExp variable
while (matches = regExp.exec( bodyText )){
var logdata = matches[1];
for (k in keys){logdata = logdata.replace(keys[k],"");}
// split out each "paragraph" string into an array
var lines = logdata.split(/[\r\n]+/);
for (l in lines){lines[l] = lines[l].trim();}
for (l in lines){lines[l] = lines[l].replace(/^(\:\s)/,"");}
// Turn the first element in the array into a date element, format it, and put it back
lines[0] = Utilities.formatDate(new Date(lines[0]), "MST", "M/d/yy HH:mm");
// Write the created array to a new row at the end of the 's' sheet
Logger.log(lines);
s.appendRow(lines);
}
}
}
var sheet = ss.getSheets()[0];
var range = sheet.getRange("A2:Z");
range.sort(1);
// Set the date format of column A, from A2 onward
// This forces the edge case of hour 00:00 to display
// var column = s.getRange("A2:A");
// column.setNumberFormat("M/d/yy HH:mm");
}
function alarmFunction(){
var label = GmailApp.getUserLabelByName("toweralarms123");
//Logger.log(label);
var label2 = GmailApp.getUserLabelByName("Processed");
if(label) {
Logger.log("Yes label: "+label);
var threads = label.getThreads();
var a=[];
for (var i = 0; i < threads.length; i++) {
var messages = GmailApp.getMessagesForThread(threads[i]);
for (var j = 0; j < messages.length; j++) {
label2.addToThread(threads[i]);
label.removeFromThread(threads[i]);
var date = [messages[j].getDate()]; // date/time
a[j]=parseMail(messages[j].getPlainBody(),date);
}
}
}
else{Logger.log("No label: "+label);}
}
function parseMail(body,date) {
if(body == "" || body == undefined){
var body = document.getElementById("input").value
}
var a=[];
var alarmKeys = "This is an email alarm";
var keys=alarmKeys.split(",");
var i,p,r;
for (i in keys) {
p=alarmKeys+"[\r\n]*([^\r^\n]*)[\r\n]";
r=new RegExp(p,"m");
a[i]=body.match(p)[1];
}
date.push(a.toString());
s.appendRow(date);
}
最佳答案
回答:由于在使用“对话 View ”时将 gmail 标签应用于邮件的方式,因此没有真正简单的方法可以做到这一点。我想出的解决方法涉及从新电子邮件消息创建一个数据数组(不幸的是,它还包括来自线程其余部分的数据,超过 99 条其他消息)。然后创建第二个数组,其中包含电子表格中的所有数据。这两个数组相互比较,只有唯一的项目被保留并最终添加到电子表格中。
var ss = SpreadsheetApp.getActiveSpreadsheet();
// var s = ss.getActiveSheet();
var sheetName ="Current Month";
var s = ss.getSheetByName(sheetName);
var myLabel = "To Process"; // Name of current label being processed, this label is set via a filter in Gmail
var newLabel = "Processed"; // Name of "New" filter, this label needs to be created in Gmail first
var regExp = new RegExp(/(Snapshot taken[\S\s]*?Probe: \d+ \*F)/gmi); // regular expression used to find each "paragraph"
var keys = ["Snapshot taken at: ","Status: Generator ",": ATS to ",": Tower Lights ","Chassis Temperature: ","Temperature: Rack Probe: "]; // array keys to match on inside paragraphs
function myFunction() {
var label = GmailApp.getUserLabelByName(myLabel);
var label2 = GmailApp.getUserLabelByName(newLabel);
var threads = label.getThreads();
var data2 = [];
var newData = [];
// get all the email threads matching myLabel
for (var i = 0; i < threads.length; i++) {
var messages = GmailApp.getMessagesForThread(threads[i]);
// move thread from label to label2
label2.addToThread(threads[i]);
label.removeFromThread(threads[i]);
// get each individual email from the threads
for (var j = 0; j < messages.length; j++) {
var bodyText = messages[j].getPlainBody();
// split the email body into individual "paragraph" strings based on the regExp variable
while (matches = regExp.exec( bodyText )){
var logdata = matches[1];
for (k in keys){logdata = logdata.replace(keys[k],"");}
// split out each "paragraph" string into an array
var lines = logdata.split(/[\r\n]+/);
for (l in lines){lines[l] = lines[l].trim();}
for (l in lines){lines[l] = lines[l].replace(/^(\:\s)/,"");}
// Turn the first element in the array into a date element, format it, and put it back
lines[0] = Utilities.formatDate(new Date(lines[0]), "MST", "M/d/yy HH:mm");
// Put the array to a new item in the data2 array for further processing
data2.push(lines);
}
}
}
// Compare the information in the data2 array to existing information in the sheet
var data = s.getRange("A2:G").getValues(); //Change this to fit your data ranges
for(i in data2){
var row = data2[i];
var duplicate = false;
for(j in data){
data[j][0] = Utilities.formatDate(new Date(data[j][0]), "MST", "M/d/yy HH:mm");
if(row.join() == data[j].join()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
if (newData.length){ // runs the below code only if there is newData, this stops an error when newData is empty
s.getRange(s.getLastRow()+1, 1, newData.length, newData[0].length).setValues(newData); //writes newData to end of sheet
s.getRange("A2:Z").sort(1); //sorts the sheet
}
}
下面是将要处理的电子邮件的片段:
This is an email update
Snapshot taken at: 7:00:00 2/6/2018
Status: Generator OFF
: ATS to SRP
: Tower Lights ON
Chassis Temperature: 73.77 *F
Temperature: Rack Probe: 78 *F
Snapshot taken at: 8:00:00 2/6/2018
Status: Generator OFF
: ATS to SRP
: Tower Lights OFF
Chassis Temperature: 71.32 *F
Temperature: Rack Probe: 78 *F
关于google-apps-script - Google 脚本正在重新处理电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835814/
我为我的一些问题设置了标签。当搜索 labels="ab"时,我得到了相关的标签,但我似乎找不到询问标签的正确语法!="ab"。如何查询不等于ab的? 最佳答案 != 对我有用,尽管它只显示带有标签的
我最近使用 Visual Studio 2013 Express 配置了 GITHUB 和 Demo GITHub 帐户,即用于练习目的。 Good News is that : I have con
我有一个用于播放和暂停的切换按钮。 这是代码: export default (props) => { let [soundState, setSoundState] = useState({ s
一个 XML 文件被发布到我的 spring mvc 正在响应的 URL。 在 .NET 中,我可以这样做: request.Form[0] request.Form["abc"] 或 request
我们的监控脚本遇到问题。 程序流程为 客户将文件(.csv 格式)ftp/sftp 到“源”目录 Bash 脚本将完成的 .csv 文件重命名为 .aaa 文件 另一个 Bash 脚本将“.aaa”文
如果我开始一个线程: new Thread(() -> { while (running) { try { Thread.sl
我正在制作一个看起来像真正的书的 PDF 阅读器。 我在 ScrollView 中有一个 UIImageView 作为书的背景(想象一本打开的书,有空页)。 UIImageView 的层有 2 个子层
创建 Accordion - 在幻灯片上 - 正在滑动的元素下方的元素似乎向下移动了 px,然后又向上移动,从而产生了颤动效果。 $(document).ready(function() { //Pr
我有一个非常奇怪的问题,但只有在运行 Ubuntu 时才会出现(在 CentOS 上一切正常)。我用 Perl 编写了一个脚本并使用了 Mail::IMAPClient模块。 当我运行以下命令时: p
我知道我可以检查 UITextView 是否正在使用 textViewDidBeginEditing: 进行编辑,但我想检查它是否正在使用 if 语句进行编辑? 最佳答案 使用方法isFirstRes
我正在制作一个简单的点击器类型的游戏。问题是,我的 JPanel 忽略了我设置为每秒更新的 Swing 计时器,而是每毫秒更新一次,即使我删除了计时器也是如此。除了计时器的监听器之外,不会在任何地方调
我有以下代码,应该通过组织列表对每个组织进行 td,对每个组织调用 toString 方法,并将结果打印到控制台和名为 Debug1.tab 的文件。 try { StreamWriter p
我有以下代码用于将文件从 url 下载到 sdcard 。此代码适用于小文件,但当文件大时,我下载的文件大小为 0。任何帮助将不胜感激。 Java 代码 setContentView(R.layout
我有一个必须使用 tomcat 部署的 Angular 项目。 Angular 文件在 dist/project-ui/ 中构建文件夹。我复制了 project-ui文件夹到 webapps tomc
我有一堆切换按钮,下面有标签。如果按钮的标签变得太长,那么下一行的第一个按钮将卡在该标签上。 这是我的代码: https://jsfiddle.net/Android272/c150305z/ 我查了
具有特殊字符的 InnerHTML 正在 trim 数据。 elem.innerHTML = displayedObjects.name; 这里的 displayedObjects.name 包含一个
我已经成功地设置了我的证书和 key ,并使用了在这里找到的 mysql 文档: http://dev.mysql.com/doc/refman/5.1/en/replication-solution
在为游戏制作动画和更新计时器时,我读到任何与 GUI 相关的 Activity 都应该在 EDT 上运行,包括重新绘制屏幕。我正在使用单个 ScheduledExecutorService 来更新和绘
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Large numbers erroneously rounded in Javascript 我正在使用
我已经为 .NET RyuJit 安装了新的 Jit 编译器,并按照安装文档中的说明在 regedit 的 .NetFramework 中设置了 AltJit=* 键。 http://blogs.ms
我是一名优秀的程序员,十分优秀!