Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在GAS中使用regex将匹配限制为电子邮件正文的前5行_Regex_Google Apps Script_Gmail_Gmail Api - Fatal编程技术网

如何在GAS中使用regex将匹配限制为电子邮件正文的前5行

如何在GAS中使用regex将匹配限制为电子邮件正文的前5行,regex,google-apps-script,gmail,gmail-api,Regex,Google Apps Script,Gmail,Gmail Api,我正在使用下面的脚本,它可以正确地从电子邮件正文中提取两个字段 这导致脚本执行时间由于正文中的内容量而显著增加。有没有办法只通过电子邮件正文的前5行进行搜索 电子邮件的第一行: 名称:完整报告 商店:北河(威尔斯街) 行程日期:2020年2月19日下午1:07 营业日期:2020年2月19日(开放) 信息: 资料: 此警报是根据用户定义的触发器触发的:每15分钟触发一次。 脚本: //gets first(latest) message with set label var threads =

我正在使用下面的脚本,它可以正确地从电子邮件正文中提取两个字段

这导致脚本执行时间由于正文中的内容量而显著增加。有没有办法只通过电子邮件正文的前5行进行搜索

电子邮件的第一行:

名称:完整报告
商店:北河(威尔斯街)
行程日期:2020年2月19日下午1:07
营业日期:2020年2月19日(开放)
信息:
资料:
此警报是根据用户定义的触发器触发的:每15分钟触发一次。
脚本:

//gets first(latest) message with set label
var threads = GmailApp.getUserLabelByName('South Loop').getThreads(0,1);
if (threads && threads.length > 0) {
  var message = threads[0].getMessages()[0];
  // Get the first email message of a threads
  var tmp,
    subject = message.getSubject(),
    content = message.getPlainBody();
  // Get the plain text body of the email message
  // You may also use getRawContent() for parsing HTML

  // Implement Parsing rules using regular expressions
  if (content) {

    tmp = content.match(/Date Tripped:\s*([:\w\s]+)\r?\n/);
    var tripped = (tmp && tmp[1]) ? tmp[1].trim() : 'N/A';

    tmp = content.match(/Business Date:\s([\w\s]+\(\w+\))/);
    var businessdate = (tmp && tmp[1]) ? tmp[1].trim() : 'N/A';
  }
}

您可以使用模式
/^(?:.*\r?\n){0,5}/
获取电子邮件的前5行,然后对这个较小的字符串运行搜索。下面是一个浏览器示例,其中包含硬编码的
内容
,但我在谷歌应用程序脚本中对其进行了测试

const Logger=console;//把这个拿开加油!
const content=`Name:完整报告
商店:北河(威尔斯街)
行程日期:2020年2月19日下午1:07
营业日期:2020年2月19日(开放)
信息:
资料:
此警报根据用户定义的触发器触发:每15分钟一次;
const searchPattern=/(触发日期|业务日期):*(.+?)\r?\n/g;
const matches=[…content.match(/^(?:.*\r?\n){0,5}/)[0]
.matchAll(搜索模式)]
const result=Object.fromEntries(matches.map(e=>e.slice(1));

Logger.log(结果)@ggorlen的答案依我的口味并不准确。让我们看一看

我对
(?:.*\r?\n){0,5}
的问题是:在英语中,这个正则表达式表示:

Take any number of characters (0 or more) ending with a newline. 
Do this between 0 and 5 times.
这意味着任何空字符串都匹配。如果你想进行全球比赛,有很多这样的比赛

那么,你怎么能抓住前5行呢?准确点!大概是

^([^\r\n]+\r?\n){5}

p.S.@ggorlen提到我在regex101中保留了默认的多行匹配,他是对的。您的偏好可能会有所不同:在忽略少于5行的消息和接受空行的字符串之间进行选择取决于您的具体情况


p.S.2我修改了我的措辞并禁用了regex101中的多行和全局设置,以显示我对它的关注。

A会很好,带有示例输入和应该匹配的内容,但是您可以使用
content.match(/(?:.*\n){0,5}/)获得字符串的前5行
然后在上面运行搜索正则表达式。@ggorlen无法正确实现它,我用一个最小的可复制示例进行了更新。content=message.getPlainBody();更新的示例,我将处理一个可运行的代码段。它们保证存在,我只是在脚本失败的情况下加上N/a。这是谷歌应用程序脚本。脚本工作正常,只是执行时间很长。请注意:上面的代码不会在不推荐的ES5引擎上运行。要使用代码,。谢谢你的提示。我是一个完全的应用程序脚本新手,所以如果需要,我可以添加一个ES5版本。谷歌会自动强制升级。我认为不需要es5版本。干杯。@ggorlen我已经更新了我的帖子以显示当前的代码,很遗憾执行时间是一样的。也许我执行这项工作效率不高,或者无法只阅读正文的前5行?是的——邮件数量太多,这才有意义,所以你可能错误地识别了最初的瓶颈。在提出问题并接受答案后,通过彻底改变问题来移动门柱是不可取的。我建议回到原来的问题,打开一个新的问题,显示最新的代码,询问瓶颈在哪里以及如何解决它。当您这样做时,请包括关闭
}
,这样您的代码就不会有语法错误,其他人也不需要为了让它运行而工作。谢谢。这会通过添加多行标志和删除字符串锚的开头来破坏/误解我的正则表达式,并提供一个更脆弱的替代。OP的性能问题显然与此正则表达式无关,这是大量使用Google应用程序脚本库调用的问题,这些调用仅在以前的编辑中显示。很抱歉,我在您的答案顶部使用了正则表达式。不包含插入符号。啊,我看到了混乱。我没有从代码中正确复制它。所有3段代码都使用了正确的版本,所以这是我的一个输入错误。