Google Apps 脚本 - 将 gmail 中的数据提取到电子表格中

Posted

技术标签:

【中文标题】Google Apps 脚本 - 将 gmail 中的数据提取到电子表格中【英文标题】:Google Apps Scripts - Extract data from gmail into a spreadsheet 【发布时间】:2015-12-29 16:48:48 【问题描述】:

这是我尝试从头开始编写的第一个脚本。到现在为止都不好,所以我要寻求一些帮助。

案例:我收到来自电子商务网站的电子商务确认电子邮件,没有回复电子邮件地址。在电子邮件的正文中,他们发送买家的电子邮件地址。我想向正文的电子邮件地址发送一封自动邮件。

我打算如何做到这一点(感谢任何消除步骤的建议)。

    使用规则为收到的电子邮件添加唯一标签。

    使用该标签通过脚本识别 gmail 中的电子邮件,逐一提取我需要的信息。使用带有电子邮件正文内容的正则表达式来提取我需要发送自动电子邮件的电子邮件地址。计划是从正文获取:主题、日期、电子邮件。

    将所有信息写入电子表格。

    去掉唯一的标签信息以防止重复运行。

    然后使用 form mule 插件从电子表格发送电子邮件。

到目前为止,我已经处理了第 1 步(简单),并在第 2 步和第 3 步中挣扎(我不是编码员,我可以阅读、解散和破解。从头开始写作是完全不同的事情)。在我认为这是处理它的最佳方法之前,我已经处理了 4 个。

通过脚本我将信息提取到电子表格中,通过插件我使用电子表格中的信息发送电子邮件。

这是我到目前为止编写的代码。我把正则表达式部分留到以后,因为我什至还不能在电子表格中写任何东西。一旦我开始工作,我就开始使用正则表达式和脚本的“删除标签”方面。

function myFunction() 
  function getemails() 
    var label = GmailApp.getUserLabelByName("Main tag/subtag");
    var threads = label.getThreads();
    for (var i = 0; i < threads.length; i++)  
    var messages=threads[i].getMessages();  
      for (var j = 0; j < messages.length; j++) 
    var message=messages[j];
    var subject=message.getSubject();
    tosp(message);
      
     
  

  function tosp(message)
    var body=message.getBody()
    var date=message.getDate();
    var subject=message.getSubject(); 
    var id= "my spreasheet id";
    var ss = SpreadsheetApp.openById(id);
    var sheet = ss.getActiveSheet();
    sheet.appendRow(subject,date,body);    


 

任何帮助将不胜感激。

谢谢 塞巴斯蒂安

【问题讨论】:

【参考方案1】:

以下是我编写和测试的代码,它完美地执行了您提到的步骤 2、3 和 4。

function myFunction() 

  var ss = SpreadsheetApp.getActiveSheet();

  var label = GmailApp.getUserLabelByName("MyLabel");
  var threads = label.getThreads();

  for (var i=0; i<threads.length; i++)
  
    var messages = threads[i].getMessages();

    for (var j=0; j<messages.length; j++)
    
      var msg = messages[j].getBody();
      var sub = messages[j].getSubject();
      var dat = messages[j].getDate();

      ss.appendRow([msg, sub, dat])
    
      threads[i].removeLabel(label);
  

您的代码中的一个错误是appendRow 函数接受在[ ] 括号内指定的元素数组。

根据您附加此脚本的位置,您的代码行:

var ss = SpreadsheetApp.openById(id);

如果脚本是在您希望记录这些电子邮件的电子表格的脚本编辑器中编写的,则不需要。但是,如果该电子表格中有多个工作表,您可以替换我的行

var ss = SpreadsheetApp.getActiveSheet();

通过

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");

另一个建议是当前代码将以 html 格式为您提供消息。因此,如果您想以纯文本形式获取消息,请使用:

var msg = messages[i].getPlainBody();

现在您可以为正则表达式编写另一个函数并将消息msg 传递给它。希望这会有所帮助!

【讨论】:

这么好的和详细的解释!如果不给“pointNclick”竖起大拇指,我就无法通过! @pointNclick,对不起旧线程。但忍不住回复....我在 gmail 的标签中有 5000 多条消息(线程)。但上面的代码只在谷歌电子表格中列出了 524 条消息。调试模式下的 Thread.length 只显示 500。可能是什么原因?【参考方案2】:

@pointNclick 答案不会对搜索进行分页,并且会收到少于 1000 封电子邮件。

我为需要更多帮助的人制作了一个即用型脚本,并解释了如何使用它(从一开始)。

它位于gmail-to-google-sheets-script 存储库中。只需阅读内容并按照说明进行操作即可。

如何使用

创建新的 Google 表格 访问菜单工具 > 脚本编辑器 将gmailt-to-sheets.gs的内容复制到编辑器,替换那里的示例代码 将 SEARCH_QUERY 上的值替换为您的实际查询(先在 gmail 上搜索,然后将搜索词复制并粘贴到那里) 在菜单上选择saveEmails(靠近“运行”和“调试”按钮) 点击“运行”按钮 它会在第一次运行时请求授权,继续接受它(这是您的 Gmail 帐户授权您的 Google Script 帐户) 运行后,结果将应用于您的工作表

更改字段

如果您想保存不同的消息属性,请查看gmail-message class 并使用✏️(铅笔)将您的脚本文件更改为 cmets 下面的代码。

【讨论】:

以上是关于Google Apps 脚本 - 将 gmail 中的数据提取到电子表格中的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Google Apps 脚本在 Gmail 中创建本机过滤器

在 Google Apps 脚本中使用高级 Gmail 服务创建与表情符号兼容的 Gmail 草稿

使用 Google Apps 脚本删除 Gmail 电子邮件的附件

如何使用 Google Apps 脚本获取 Gmail 用户的个人资料图片?

无法通过Google Apps脚本显示授权对话框