从电子表格单元格中提取特定数据并填充相应的单元格

时间:2021-07-13 03:11:44

标签: javascript regex google-apps-script google-sheets

目标:将 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

enter image description here

2 个答案:

答案 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);
}