【问题标题】:Pulling specific data from spreadsheet cell and populating corresponding cells从电子表格单元格中提取特定数据并填充相应的单元格
【发布时间】:2021-07-13 03:11:44
【问题描述】:

目标:将 Gmail 拉入电子表格,从单元格中提取特定数据并填充其他单元格

将 gmail 拉入工作表。提取数据是可行的,但它不会将数据放在一行中,而是将其放在几行中,并且每行都会添加一列数据。下面是谷歌表的链接,这样你就可以准确地看到我想要完成的事情。在第 1 行中,我使用 google sheet 公式实现了我的目标,但这需要多个隐藏列。

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

【问题讨论】:

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


    【解决方案1】:

    回答

    如果在写入工作表之前出现错误,我不明白将 gmail 拉入工作表是如何工作的,因此很难为您提供一些帮助activeSheet.appendRow(emailDataArr);.

    我看到的

    查看您的代码和您得到的错误,我认为问题出在线程/消息处理中。例如,threads[i].Removelabel(label); 行应该在for (var j = 0; j &lt; messages.Length; j++) 之外。

    建议

    我建议您使用logs 来查看算法是如何收集不同数据的。尝试简单地将console.log(variable) 放在代码的不同部分。

    最后,我建议当您共享电子表格文档时,不要禁用export options,因为这样我就无法创建它的副本来测试代码。此外,让一些邮件能够重现所有步骤也很有用。您可以创建一个函数来发送这些消息,或者至少显示它们的外观。

    参考

    【讨论】:

    • 解决了这个问题,但现在遇到了一个新问题。 SyntaxError:无效的正则表达式:/(?
    • 我能够通过使用谷歌公式而不是谷歌脚本来解析数据的解决方法解决了这个问题。考虑到我必须添加额外的列并隐藏它们以实现我的目标,这有点草率,如果你像我一样,你讨厌这样草率的解决方法,但它仍然有效。对于希望查看我能够使用公式创建的解决方案的任何人,请参阅上面的电子表格。我将继续尝试使用 Google 脚本使其更简洁
    • 很高兴能帮上忙。如果您觉得我的回答有帮助,请出于文档目的接受它。如果您想获得更多帮助,请考虑使用我在回答中给您的建议编辑问题。
    • 我能够获取要提取的数据。我编辑了帖子。我目前唯一遇到的问题是数据没有被添加到同一行。我在上面添加了一个屏幕截图。关于如何让它只生成一行包含该行中所有数据的任何建议?
    • 嘿,我仍然无法制作电子表格的副本。这是因为您禁用了 export options。顺便问一下,你有什么进展吗?
    【解决方案2】:
    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2017-08-17
      相关资源
      最近更新 更多