Google Apps 脚本 Google Sheets Gmail 处理新电子邮件 追加行数组

Posted

技术标签:

【中文标题】Google Apps 脚本 Google Sheets Gmail 处理新电子邮件 追加行数组【英文标题】:Google Apps Script Google Sheets Gmail Processing New Emails Append Row Array 【发布时间】:2021-02-06 03:09:37 【问题描述】:

我从 gmail 接收电子邮件,使用 jquery 对其进行解析,然后我想将每封电子邮件中的抓取数据发送到 google 表格中自己的行中。我已经将代码工作到了抓取必要数据的程度,然后将其推送到数组中。然后我想检查现有的谷歌工作表行中是否有任何匹配项,如果没有,则将数据放入工作表中的行中。

我使用以下帖子作为数组部分的模型,但无法获得他为我的数据所做的工作: Google script is reprocessing emails

如果您有任何关于将数组转储到工作表中的见解,我将不胜感激。我将用来检查重复项的唯一值是人名(var name),它是电子表格中的第 3 列

function appendLead() 
    var url = 'https://docs.google.com/spreadsheets/d/1zZDKMISf8Hbw7ERfP6h-Q0pztQSMqsN-mHfeM3E_Ywg/edit#gid=0';
    var ss = SpreadsheetApp.openByUrl(url);
    var leadsData = ss.getSheetByName('Leads Data');
    var myLabel = "Buyer Inquiries/1. To Process"; // Name of current label being processed, this label is set via a filter in Gmail
    var newLabel = "Buyer Inquiries/2. Processed"; // Name of "New" filter, this label needs to be created in Gmail first
    var label = GmailApp.getUserLabelByName(myLabel);
    var label2 = GmailApp.getUserLabelByName(newLabel);
    var threads = label.getThreads();
    var data2 = [];
    var newData = [];
  
    for (var i = 0; i< threads.length; i++) 
      var message = GmailApp.getMessagesForThread(threads[i])[0];
      
    
      // move thread from label to label2
      label2.addToThread(threads[i]);
      label.removeFromThread(threads[i]);
      
      var messageBodyhtml = message.getBody()
      
      var $ = Cheerio.load(messageBodyhtml);
      var date = $('span:contains("Date:")').siblings('span').text().trim();
      var property = $('span:contains("Regarding:")').siblings('span').text().trim();
      var name = $('span:contains("From:")').first().siblings('span').text().trim();
      var phone = $('span:contains("Contact Information:")').siblings('span').children().first().text().trim();
      var email = $('span:contains("Contact Information:")').siblings('span').children().last().text().trim();
      var comments = $('span:contains("Comments:")').siblings('span').text().trim();
      var source = $('span:contains("Lead From:")').siblings('span').text().trim();
  
      var array = [date,property,name,phone,email,comments,source]
      Logger.log(array);
      data2.push([array[i]]);
    
    // Compare the information in the data2 array to existing information in the sheet
    var data = leadsData.getRange("A2:G").getValues(); //Change this to fit your data ranges
    for(i in data2)
      var row = data2[i];
      var duplicate = false;
      for(j in data)
        if(row.join() == data[j].join())
          duplicate = true;
        
      
      if(!duplicate)
        newData.push(row);
      
    
    if (newData.length)  // runs the below code only if there is newData, this stops an error when newData is empty
      leadsData.getRange(leadsData.getLastRow()+1, 1, newData.length, newData[0].length).setValues(newData); //writes newData to end of sheet
    

这是运行后工作表上的结果 - 只有第一个数组段粘贴在工作表上 - 它没有作为一行粘贴 - 它被粘贴在一个列中

10/19/2020 9:51:16 AM
address
Sandra

email@gmail.com
ACTION: Tour Request 10/03/2020 10:00AM   
Source website

我无法让重复检查器部分工作(例如,如果该行已经存在,并且我再次处理相同的电子邮件作为测试,即使它是重复的,该信息也会作为一行附加到电子表格中)

var data = leadsData.getRange("A2:G").getValues(); //Change this to fit your data ranges
    data.forEach(function(row) 
      var duplicate = false;
      data2.forEach(function(row2) 
        if (row.join() == row2.join()) 
          duplicate = true;
        
      );
      if (!duplicate) 
        newData.push(row);
      
    );

【问题讨论】:

定义but can't get what he did to work for my data - 有什么问题? 我可以在控制台日志中看到直到行 data2.push([array[i]]) 一切都正确地进入阵列。之后的部分我想通过将新数据数组与现有数据进行比较来检查是否存在重复项。如果一行数据不重复,则将其从数组data2推送到newArray。然后将 newArray 行附加到工作表(使用 setValues 不使用 appendRow)。这是检查重复项并将数组粘贴到未粘贴任何数据的工作表的底部。只有第一个数组粘贴 - 而不是作为一行 - 请参阅编辑的问题 【参考方案1】:

答案:

用于将值设置为电子表格范围的数组结构是 Array[rows][columns]

结构信息:

假设您想使用.setValues() 将两行数据插入工作表。

第 1 行的数据长度为 8 个单元格,每个单元格是 v1-v8 中的一个值。 第 2 行的数据也是 8 个单元格,但只有 A、B、G 和 H 列有数据。

数组结构应该如下:

var arr = [
            ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"], // row 1
            ["A-v", "B-v", "", "", "", "", "G-v", "H-v"]      // row 2
          ];

这需要设置:

SpreadsheetApp.getActiveSpredsheet()
              .getSheetByName("Sheet-name")
              .getRange("A1:B8")
              .setValues(arr);

这将在工作表中显示为:

         |    A   |    B   |    C   |    D   |    E   |    F   |    G   |    H   |    
=========+========+========+========+========+========+========+========+========+
    1    |   v1   |   v2   |   v3   |   v4   |   v5   |   v6   |   v7   |   v8   |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
    2    |   A-v  |  B-v   |        |        |        |        |  G-v   |  H-v   |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
    3    |        |        |        |        |        |        |        |        |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
    4    |        |        |        |        |        |        |        |        |
---------+--------+--------+--------+--------+--------+--------+--------+--------+

特定于代码的修复:

使用嵌套的forEach() 而不是for... in

data.forEach(function(row) 
  var duplicate = false;
  data2.forEach(function(row2) 
    if (row.join() == row2.join()) 
      duplicate = true;
    
  );
  if (!duplicate) 
    newData.push(row);
  
);

【讨论】:

感谢您的帮助。我发现了问题:我将 data2.push([array[i]]) 更改为 data2.push(array) 并且它正确创建了数组,并且现在将值正确粘贴到工作表 你能解释一下改变你的日志是如何改变数组结构的吗? 这是一个粘贴错误 - 不是日志,而是推送。 [array[i]] 只是使 [[1a],[1a,2a],[1a,2a,3a]... 到 26 个位置],这仅适用于第一行(a 是领先)。正确的输出数组现在类似于 [1a,2a,3a,4a,5a,6a,7a],[1b,2b,3b,4b,5b,6b,7b],... 其中 a 粘贴到一行,并且b 粘贴到第二行,等等。它现在可以工作了 @823g4n8901 这就是我的想法,很高兴听到它现在正在工作。如果您认为它会帮助其他人在未来遇到同样的问题,请考虑接受答案 感谢重复检查器的更新。我在脚本中有以下代码,但现在它在运行时没有将任何行放在工作表上(请参阅我在上面的编辑中添加的内容)。我认为我需要做的是制作现有工作表行的数组。如果一行与新数据数组匹配,则不要将该新数据推送到工作表。例如如果工作表中的一行是 ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"] 并且新数组包含带有 [" v1”、“v2”、“v3”、“v4”、“v5”、“v6”、“v7”、“v8”] 然后不要将其粘贴到工作表上,因为它是重复的

以上是关于Google Apps 脚本 Google Sheets Gmail 处理新电子邮件 追加行数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Apps 脚本执行 API + Java 创建 Google 表单?

使用 Google BigQuery / Apps 脚本为插入 Google 表格的数据添加时间戳

如何通过 Apps 脚本在 Google 表格中“清除格式”

使用Google Apps脚本Web应用添加到Google表格

text 使用Google Apps脚本创建Google表格的自动计划备份副本

Google Apps脚本传递网址参数Google信息中心