谷歌应用脚本-从Gmail中提取数据到电子表格

14

这是我尝试从头编写的第一个脚本。到目前为止一直不好,所以我打算请求帮助。

情况:我收到电子商务网站的确认电子邮件,但没有回复电子邮件地址。在邮件正文中,他们会发送买家的电子邮件地址。我想向正文的电子邮件地址发送自动化邮件。

我计划如何做到这一点(任何消除步骤的建议都将受到感谢):

  1. 使用规则给传入的电子邮件打上唯一标签。

  2. 使用该标签来识别Gmail中的邮件,并逐个提取所需信息。使用正则表达式从电子邮件正文内容中提取需要发送自动邮件的电子邮件地址。计划获取:主题,日期,正文中的电子邮件。

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

  4. 删除唯一标签信息,以防止重复运行。

  5. 然后使用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);    

}
} 

任何帮助都将不胜感激。

谢谢
Sebastian

2个回答

32

以下是我编写和测试的代码,可以完美地执行您所提到的步骤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传递给它。希望这有所帮助!


1
这是一篇非常好的、详细的解释!我不能不给“pointNclick”点赞! - Zongjun
1
@pointNclick,抱歉这是旧帖子了。但我还是忍不住要回复一下……我在Gmail的一个标签中有5000多个消息(线程),但上面的代码只将524个消息列入Google电子表格。在调试模式下,Thread.length仅显示500。可能的原因是什么? - sifar
1
@sifar,Google有计数和时间限制。您可以通过设置一个变量,比如lastthreadposition(从您的表格中获取getValue()),并将其与for循环的增量计数器相加(如i++ && lastthreadposition++)来操纵它。循环结束后,使用setValue()设置新值。下次运行时,使用getThreads(lastthreadposition, 500)来获取邮件。设置一个基于时间的触发器来重复执行。我建议使用比500更小的间隔,比如每10分钟处理100封邮件。 - undefined

7
我已经准备好了一个可直接使用的脚本,并解释如何使用它(从开始),为那些需要更多帮助的人提供方便。该脚本可以在 gmail-to-google-sheets-script 存储库中找到。只需阅读内容并按照说明操作即可。
使用方法:
- 创建一个新的 Google Sheet - 访问菜单“工具” > “脚本编辑器” - 将 gmailt-to-sheets.gs 的内容复制到编辑器中,替换那里的示例代码 - 将“SEARCH_QUERY”的值替换为您的实际查询条件(首先在 Gmail 上进行搜索,然后将搜索术语复制并粘贴到这里) - 在菜单中选择“saveEmails”(靠近“运行”和“调试”按钮) - 点击“运行”按钮 - 首次运行时,它将要求授权,请继续接受它(您的 Gmail 帐户授权您的 Google Script 帐户) - 运行后,结果将应用于您的表格
更改字段:
如果您想保存不同的消息属性,请查看 gmail-message 类 ,并将代码文件中的注释下方的内容更改为标有 ✏️(铅笔)的内容。

请注意,您在 Github 存储库中的当前代码编写质量很差。控制台中的数字不匹配,还有其他问题。感谢您的分享。您的脚本可以提供结果,但无法保证准确性。 - Lilly-R Brock
感谢 @blitzter47 的评论。但是,您能具体一些吗?如果存在错误,我不会尝试修复它。这当然不是完美的解决方案,但似乎可以满足需求。 - Tiago Gouvêa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接