将线程中的所有邮件从 gmail 提取到电子表格中
Extract all messages in thread from gmail into a spreadsheet
我正在尝试利用此代码从我的收件箱中提取求职者数据并填充 google sheets。这很简单,但问题是应用程序首先由我们的网站插件处理,然后发送到我的收件箱。这会将发件人更改为相同的地址。 Google 将每个收件人添加到同一个线程,然后阻止代码从到达的每个应用程序中提取信息。
目前正在检索每条消息的第一条。我知道我需要实现一个循环来遍历线程,但到目前为止我还没有成功。
在此注明我的原始代码来源here
这是目前的代码:
此函数正在将过滤器、已解析的内容传送到活动 sheet。
function gather() {
var messages = getGmail();
var curSheet = SpreadsheetApp.getActive();
messages.forEach(message => {curSheet.appendRow(parseEmail(message))});
}
它在其中一个函数中的某处,我认为需要合并一个循环来收集线程中的所有消息
function getGmail() {
const query = "from:noreply-careers@smooth.ie ";
let threads = GmailApp.search(query);
//let label = GmailApp.getUserLabelByName("done");
//if (!label) {label = GmailApp.createLabel("done")}
let messages = [];
threads.forEach(thread => {
messages.push(thread.getMessages()[0].getPlainBody());
});
return messages;
}
具体来说,我一直专注于此以包含一个通过线程和消息的循环:
threads.forEach(thread => {
messages.push(thread.getMessages()[0].getPlainBody());
我确实试过这样的东西,但我无法让它工作。
function getGmails_(query) {
var emails = [];
var threads = GmailApp.search(query);
for (var i in threads) {
var msgs = threads[i].getMessages();
for (var j in msgs) {
emails.push([msgs[j].getPlainBody().replace(/\n*\s.+:/,',')
.replace(/\n*.+:/g,',')
.replace(/^,/,'')
.replace(/\n/g,'')
.split(',')
]);
}
}
return result;
}
剩下的代码是 运行 一些正则表达式,用于从消息正文中提取申请人的答案,并封装在索引中以传递到 sheet 中的列。
function parseEmail(message){
var parsed = message.replace(/,/g,'')
.replace(/\n*.+:/g,',')
.replace(/^,/,'')
.replace(/\n/g,'')
.split(',');
var result = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22].map(index => parsed[index]);
return result;
}
如果您只想在单个数组中检索所有线程中所有消息的纯正文,您可以这样做:
- 对于每条消息 return 在 GmailThread.getMessages(), use map 中编辑到 return 一个数组,其中每条消息都有对应的纯正文。
- 使用push将当前线程消息纯正文添加到主
messages
数组。
代码片段:
threads.forEach(thread => {
const threadMessages = thread.getMessages().map(message=>message.getPlainBody());
messages.push(...threadMessages);
});
我正在尝试利用此代码从我的收件箱中提取求职者数据并填充 google sheets。这很简单,但问题是应用程序首先由我们的网站插件处理,然后发送到我的收件箱。这会将发件人更改为相同的地址。 Google 将每个收件人添加到同一个线程,然后阻止代码从到达的每个应用程序中提取信息。
目前正在检索每条消息的第一条。我知道我需要实现一个循环来遍历线程,但到目前为止我还没有成功。
在此注明我的原始代码来源here
这是目前的代码:
此函数正在将过滤器、已解析的内容传送到活动 sheet。
function gather() {
var messages = getGmail();
var curSheet = SpreadsheetApp.getActive();
messages.forEach(message => {curSheet.appendRow(parseEmail(message))});
}
它在其中一个函数中的某处,我认为需要合并一个循环来收集线程中的所有消息
function getGmail() {
const query = "from:noreply-careers@smooth.ie ";
let threads = GmailApp.search(query);
//let label = GmailApp.getUserLabelByName("done");
//if (!label) {label = GmailApp.createLabel("done")}
let messages = [];
threads.forEach(thread => {
messages.push(thread.getMessages()[0].getPlainBody());
});
return messages;
}
具体来说,我一直专注于此以包含一个通过线程和消息的循环:
threads.forEach(thread => {
messages.push(thread.getMessages()[0].getPlainBody());
我确实试过这样的东西,但我无法让它工作。
function getGmails_(query) {
var emails = [];
var threads = GmailApp.search(query);
for (var i in threads) {
var msgs = threads[i].getMessages();
for (var j in msgs) {
emails.push([msgs[j].getPlainBody().replace(/\n*\s.+:/,',')
.replace(/\n*.+:/g,',')
.replace(/^,/,'')
.replace(/\n/g,'')
.split(',')
]);
}
}
return result;
}
剩下的代码是 运行 一些正则表达式,用于从消息正文中提取申请人的答案,并封装在索引中以传递到 sheet 中的列。
function parseEmail(message){
var parsed = message.replace(/,/g,'')
.replace(/\n*.+:/g,',')
.replace(/^,/,'')
.replace(/\n/g,'')
.split(',');
var result = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22].map(index => parsed[index]);
return result;
}
如果您只想在单个数组中检索所有线程中所有消息的纯正文,您可以这样做:
- 对于每条消息 return 在 GmailThread.getMessages(), use map 中编辑到 return 一个数组,其中每条消息都有对应的纯正文。
- 使用push将当前线程消息纯正文添加到主
messages
数组。
代码片段:
threads.forEach(thread => {
const threadMessages = thread.getMessages().map(message=>message.getPlainBody());
messages.push(...threadMessages);
});