csv - 如何将数据从 Gmail 邮件附件复制到电子表格?

标签 csv google-apps-script google-sheets gmail

我正在尝试从位于共享电子邮件的特定文件夹中的 CSV 报告中获取数据,并将 Google 表格中特定标签中的旧数据替换为新数据。

我已经尝试过不同的解决方案,但似乎没有一个能让我到达我想要的位置。下面的代码是我生成的最干净的代码,但由于某种原因,它什么也没做。

我遵循的步骤:

  1. 打开文件夹所在的邮箱(共享邮箱,在Gmail中管理)
  2. 搜索所在文件夹(label:rpt-its-all-data)
  3. 取最后收到的邮件
  4. 打开电子邮件/附件
  5. 获取数据
  6. 按 ID 打开 Google 表格
  7. 用当前日期更新选项卡 INFO 中单元格 B1 中的日期(我什至没有尝试将其整理出来)
  8. 打开“所有数据”标签
  9. 在标签 ALLDATA 中粘贴值

这是一份Google表格,看格式:https://docs.google.com/spreadsheets/d/1GyGxSwUtITeje0-Qx63rB8xChMSbLvn1FDCOKOJITio/edit?usp=sharing

我已经尝试过这段代码:

function importCSVFromGmail() {
    var threads = GmailApp.search("id:AH1rexR2yzlanbk9GyP52tyVKSnXcMDz_miTs1-lLXtJwJB56l2r label:rpt-its-all-data");
    var message = threads[0].getMessages()[0];
    var attachment = message.getAttachments()[0];

    // Is the attachment a CSV file
    if (attachment.getContentType() === "text/csv") {
        var id = "1F_Z_00-ThdTRzlZ3nYd_pieJHkUjgye3pI_KJfydoP4";
        var name = "ALLDATA";
        var sheet = SpreadsheetApp.openById(id);
        var tab = sheet.getSheetByName(name);
      
        // Clear the content of the sheet
        tab.clearContents().clearFormats();
        tab.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
      
        var csvData = tab.Utilities.parseCsv(attachment.getDataAsString(), ",");
    }
}

使用上面的代码,我没有得到任何结果。我不确定为什么会这样。

我认为查询中的邮件 ID 不正确,无法调用该电子邮件,但我找不到任何其他方法。

最佳答案

我用这些更改修改了您的代码,因此它可以按预期工作:

1) 您遇到了错误,因为必须先声明 csvData 变量,然后才能使用它。此外,parseCsv() 函数来自 Utilities 类,您可以直接使用此类(您这样调用它:tab.Utilities.parseCsv)[1]。另一个问题是您无法使用消息 ID [2] 搜索消息,为此您应该发出获取请求 [3]。

2) 我放了一个 If 来验证邮件是否有附件。

3) 我更改了 If 中的条件以验证它是否是文件名中带有文件扩展名的 csv 文件,因为 gmail API 将带有“application/octet-stream”的 csv 文件作为 mime 类型(我猜这是因为您可以在 gmail 中将其作为 Google 表格打开。

4) 我修改了您获取消息的方式以获取最后一个线程的最后一条消息,之前它是获取每个线程的第一条消息而不是最后一个。

5) 在INFO sheet中设置日期,如果需要特定格式可以勾选formatDate函数[1]。

function importCSVFromGmail() {
  var threads = GmailApp.search("label:rpt-its-all-data");
  var message = threads[0].getMessages().pop();

  var attachment = message.getAttachments()[0];

  if (attachment != null) {
    var attachName = attachment.getName();

    // Is the attachment a CSV file
    if (attachName.substring(attachName.length-4) === ".csv") {
      var id = "1bvENjFYC48LSYDMPtI4FIOKIChiuIrg5O4WRziFeAhU";
      var name = "ALLDATA";
      var sheet = SpreadsheetApp.openById(id);
      var tab = sheet.getSheetByName(name);
      var tabInfo = sheet.getSheetByName("INFO");
      tabInfo.getRange("B1").setValue(new Date());

      // Clear the content of the sheet
      tab.clearContents().clearFormats();
      var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");
      tab.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
    }
  } 
}

[1] https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)

[2] https://support.google.com/mail/answer/7190

[3] https://developers.google.com/gmail/api/v1/reference/users/messages/get

关于csv - 如何将数据从 Gmail 邮件附件复制到电子表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57221421/

相关文章:

google-apps-script - 获取对象 ScriptApp 的方法或属性 getAuthorizationInfo 时出现意外错误

javascript - 将显示对话框自定义 html 添加到 Google 幻灯片脚本

google-sheets - 组合数据后如何获得连接文本的查询?

google-sheets - 谷歌表中的公式来计算不同对象的数量?

Python 线性搜索效率更高

python - 使用 Pandas 将多个 csv 文件读入单独的数据帧

parsing - 如何在 Pharo Smalltalk 中解析这个(见描述)文本文件

javascript - 使用 Apps 脚本在 onclick 内调用函数

google-sheets - 如何将数据传递给 IFTTT WebHook?

python - 我的 csv 中有多个列。如何使用 python 将行值与引用列匹配?