gpt4 book ai didi

google-apps-script - Google Apps Script Class GmailApp 批量操作?

转载 作者:行者123 更新时间:2023-12-04 17:02:24 27 4
gpt4 key购买 nike

我已经玩了一个月左右的 GAS,并且我已经非常熟悉使用批处理操作来读取/写入电子表格(例如 getValues()、setValues())。但是,我目前正在编写一个脚本,使用 GmailApp 类从 Gmail 中提取大量数据,我的代码运行非常缓慢(甚至超时),而且我似乎无法弄清楚如何使用批处理操作对于我正在尝试做的事情。到目前为止,这是我的代码(更改了电子邮件地址和名称):

 function fetchEmails(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var threads = GmailApp.search('in: label:searchedLabel');
var messages = new Array();

function Email(message){
this.date = new Date(message.getDate());
this.body = message.getBody();
}

for(var i=0;i<threads.length;i++){
for(var j=0;j<threads[i].getMessageCount();j++){
if(threads[i].getMessages()[j].getFrom()=="firstName lastName <email@domain.com>"){
var message = new Email(threads[i].getMessages()[j]);
messages.push(message);
}
}
}
}

如您所见,我正在查询我的电子邮件中所有带有给定标签的线程,
为自定义电子邮件对象创建一个对象构造函数(它将以电子邮件的正文和日期作为属性)。然后我循环遍历每个线程,当给定的电子邮件与我要查找的发件人匹配时,我为该电子邮件创建一个 Email 对象的实例并将该 Email 对象放入一个数组中。目标是最终我将拥有一个全部来自我想要的发件人的 Email 对象数组。但是,您可能已经注意到,代码过于频繁地调用 Google 的 API,但我似乎无法弄清楚与 Gmail 交互的批处理操作。有任何想法吗?非常感谢。

最佳答案

我认为您正在寻找 GmailApp.getMessagesForThreads()。

function fetchEmails(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var threads = GmailApp.search('label:searchedLabel');
var messages = new Array();

function Email(message){
this.date = new Date(message.getDate());
this.body = message.getBody();
}

var gmailMessages = GmailApp.getMessagesForThreads(threads);

for(var i=0;i<thread.length;i++){
var messagesForThread = gmailMessages[i];
for(var j=0;j<messagesForThread.length;j++){
if(messagesForThread[j].getFrom()=="firstName lastName <email@domain.com>"){
var message = new Email(messagesForThread[j]);
messages.push(message);
}
}
}
}

当然你也可以写得更简洁一点(抱歉,我没有机会介绍 JavaScript 的神奇之处):
function fetchEmails(){
var messages = Array.prototype.concat.apply([], GmailApp.getMessagesForThreads(
GmailApp.search('label:searchedLabel')).map(function(messagesForThread) {
return messagesForThread.filter(function(message) {
return message.getFrom() == "firstName lastName <email@domain.com>";
}).map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});}));
}

这样总共调用了 2 个 Gmail,所以速度会很快。

事实上,如果您按照上面的建议将 'from' 部分集成到搜索中,您只需要:
function fetchEmails(){
var messages = Array.prototype.concat.apply([], GmailApp.getMessagesForThreads(
GmailApp.search('label:searchedLabel from:email@domain.com')).map(
function(messagesForThread) {
return messagesForThread.map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});}));
}

最后,由于您实际上并不关心线程结构,您可以在映射之前连接数组,这会导致:
function fetchEmails(){
var messages = GmailApp.getMessagesForThreads(
GmailApp.search('label:searchedLabel from:email@domain.com'))
.reduce(function(a, b){ return a.concat(b); })
.map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});
}

(我保留在前面的示例中,以防您确实关心线程结构而您只是给出了一个最小的示例)。

关于google-apps-script - Google Apps Script Class GmailApp 批量操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com