目标:将 Gmail 拉入电子表格,从单元格中提取特定数据并填充其他单元格
将 gmail 拉入工作表中有效。提取数据有效,但它不会将数据放在一行中,而是将其放在多行中,每行都会添加一列数据。下面是谷歌表的链接,因此您可以确切地看到我正在尝试完成的工作。在第 1 行中,我使用谷歌表格公式实现了我的目标,但这需要多个隐藏列。
function onOpen() {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu('Gmail');
menu.addItem('Get Gmail', 'getGmail')
menu.addToUi();
}
function getGmail(){
var label = GmailApp.getUserLabelByName("Billing");
var threads = label.getThreads();
for (var i = threads.length - 1; i >=0; i--){
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++){
var message = messages[j];
extractDetails(message);
GmailApp.markMessageRead(message);
}
threads[i].removeLabel(label);
}
}
function extractDetails(message){
var emailData = {
date: "Null",
sender: "Null",
subject: "Null",
body: "Null",
recipient: "Null",
amount: "Null",
fee: "Null",
total: "Null"
}
var emailKeywords = {
recipient: "Recipient:*",
amount: "Amount Sent",
fee: "Fee",
total: "Total Amount Charged*"
}
emailData.date = message.getDate();
emailData.sender = message.getFrom();
emailData.subject = message.getSubject();
emailData.body = message.getPlainBody();
var regExp;
regExp = new RegExp("(?<=" + emailKeywords.recipient + ").*");
emailData.recipient = emailData.body.match(regExp).toString().trim();
regExp = new RegExp("(?<=" + emailKeywords.amount +").*[0-9]*\.[0-9]+[0-9]+");
emailData.recipient = emailData.body.match(regExp).toString().trim();
regExp = new RegExp("(?<=" + emailKeywords.fee + ").*[0-9]*\.[0-9]+[0-9]+");
emailData.fee = emailData.body.match(regExp).toString().trim();
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var emailDataArr = [];
for(var propName in emailData){
emailDataArr.push(emailData[propName]);
activeSheet.appendRow(emailDataArr);
}
}
https://docs.google.com/spreadsheets/d/14FuuKS2ChZ_O687D2ybGvg0ZhfGvHnuzUpAx6oIulg4/edit?usp=sharing
答案 0 :(得分:0)
如果在写入工作表之前出现错误,我不明白如何将 Gmail 拉入工作表,因此很难为您提供帮助activeSheet.appendRow(emailDataArr);
< /em>.
看看你的代码和你得到的错误,我认为问题出在线程/消息处理上。例如,行 threads[i].Removelabel(label);
应该在 for (var j = 0; j < messages.Length; j++)
之外。
我建议您使用 logs 来查看算法如何收集不同的数据。尝试简单地将 console.log(variable)
放在代码的不同部分。
最后,我建议当您共享电子表格文档时,不要禁用 export options
,否则我无法创建它的副本来测试代码。此外,拥有一些邮件以便能够重现所有步骤也很有用。您可以创建一个函数来发送这些消息,或者至少显示它们的外观。
答案 1 :(得分:0)
function onOpen() {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu('Gmail');
menu.addItem('Get Gmail', 'getGmail')
menu.addToUi();
}
function getGmail(){
var label = GmailApp.getUserLabelByName("Billing");
var threads = label.getThreads();
for (var i = threads.length - 1; i >=0; i--){
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++){
var message = messages[j];
extractDetails(message);
GmailApp.markMessageRead(message);
}
threads[i].removeLabel(label);
}
}
function extractDetails(message){
var emailData = {
date: "Null",
sender: "Null",
subject: "Null",
body: "Null",
recipient: "Null",
amount: "Null",
fee: "Null",
total: "Null"
}
var emailKeywords = {
recipient: "Recipient:*",
amount: "Amount Sent",
fee: "Fee",
total: "Total Amount Charged*"
}
emailData.date = message.getDate();
emailData.sender = message.getFrom();
emailData.subject = message.getSubject();
emailData.body = message.getPlainBody();
var regExp;
regExp = new RegExp("(?<=" + emailKeywords.recipient + ").*");
emailData.recipient = emailData.body.match(regExp).toString().trim();
regExp = new RegExp("(?<=" + emailKeywords.amount +").*[0-9]*\.[0-9]+[0-9]+");
emailData.recipient = emailData.body.match(regExp).toString().trim();
regExp = new RegExp("(?<=" + emailKeywords.fee + ").*[0-9]*\.[0-9]+[0-9]+");
emailData.fee = emailData.body.match(regExp).toString().trim();
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var emailDataArr = [];
for(var propName in emailData){
emailDataArr.push(emailData[propName]);
}
activeSheet.appendRow(emailDataArr);
}